/branches/mixer/V0.60_GPS_BETA_martosi/Flight-Ctrl_MEGA644_V0_60.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>Flight-Ctrl_MEGA644_V0_60</ProjectName><Created>19-Aug-2007 14:38:13</Created><LastEdit>19-Aug-2007 14:51:35</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>19-Aug-2007 14:38:13</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>Flight-Ctrl_MEGA644_V0_60.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\</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>main.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>gps_ubx.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><SOURCEFILE>uart.c</SOURCEFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>gps_ubx.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>std_c.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE><HEADERFILE>uart.h</HEADERFILE><OTHERFILE>makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>makefile</EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>0</LIST><MAP>0</MAP><OUTPUTFILENAME>Flight-Ctrl_MEGA644_V0_60.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -O0 -fsigned-char</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\_Settings.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\analog.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\fc.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\gps.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\gps_ubx.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\main.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\menu.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\old_macros.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\printf_P.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\rc.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\Settings.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\std_c.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\timer0.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\twimaster.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\uart.h</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\main.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\analog.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\eeprom.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\fc.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\GPS.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\gps_ubx.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\menu.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\printf_P.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\rc.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\timer0.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\twimaster.c</Name><Name>C:\hubi\ufo\mickrokopter\gps codes\0.60\Flight-Ctrl_MEGA644_V0_60\uart.c</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000></Files><Workspace><File00000><Position>343 98 875 474</Position><LineCol>0 0</LineCol></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/mixer/V0.60_GPS_BETA_martosi/Flight-Ctrl_MEGA644_V0_60.hex |
---|
0,0 → 1,1601 |
:100000000C94EA010C9405020C9405020C94050270 |
:100010000C9405020C9405020C9405020C94050244 |
:100020000C9405020C94A70A0C9405020C9405028A |
:100030000C94A8130C9405020C9405020C94050270 |
:100040000C9405020C9405020C94FE090C94050214 |
:100050000C9423060C9405020C94AD030C94050239 |
:100060000C94930B0C9405020C94F5120C9405025D |
:100070000A0A0D004E65757472616C004865616412 |
:10008000696E67486F6C64000A0D5374657565721C |
:10009000756E673A20004F4B0A0D000A0D416267EA |
:1000A0006C65696368204C756674647275636B7304 |
:1000B000656E736F722E2E000A0D42656E75747A2E |
:1000C0006520506172616D657465727361747A2028 |
:1000D0002564000A0D496E69742E20454550524F23 |
:1000E0004D3A2047656E65726965726520446566A4 |
:1000F00061756C742D506172616D657465722E2E20 |
:100100002E000A0D3D3D3D3D3D3D3D3D3D3D3D3DCE |
:100110003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D0F |
:100120003D3D000A0D466C69676874436F6E7472DA |
:100130006F6C205625642E256420002E00475053F6 |
:100140005F526F6C6C3A20253369004750535F4E05 |
:1001500069636B20202533690047505320200052EB |
:10016000616E67653A2533692D25336900537465DF |
:100170006C6C756E673A2025336900536574706F37 |
:10018000696E74202025336900536572766F2020D4 |
:1001900000506F7469343A202025336900506F7421 |
:1001A00069333A202025336900506F7469323A2050 |
:1001B0002025336900506F7469313A202025336956 |
:1001C0000053746172743A20202020202535690084 |
:1001D0004D657373776572743A2020253569005236 |
:1001E00069636874756E673A2020253569004B6F26 |
:1001F0006D706173732020202020202000456D70D9 |
:10020000662E506567656C3A253569005370616EDE |
:100210006E756E673A202025356900486F63682047 |
:1002200025346920282533692900526F6C6C2025FC |
:100230003469202825336929004E69636B202534F1 |
:100240006920282533692900414343202D20536527 |
:100250006E736F7200476965722025346920282506 |
:1002600033692900526F6C6C2025346920282533AE |
:100270006929004E69636B2025346920282533697C |
:1002800029004779726F202D2053656E736F7200BD |
:1002900050333A25346920204B616EE46C652000B0 |
:1002A00050313A253469202050323A2534692000F3 |
:1002B00047733A253469202047693A25346920007C |
:1002C0004E693A2534692020526F3A25346920005E |
:1002D0004B373A25346920204B616EE46C65200071 |
:1002E0004B353A25346920204B363A2534692000B5 |
:1002F0004B333A25346920204B343A2534692000A9 |
:100300004B313A25346920204B323A25346920009C |
:100310004B6F6D706173733A202020253569005250 |
:100320006F6C6C3A202020202020253569004E6912 |
:10033000636B3A20202020202025356900616B74F2 |
:100340002E204C6167650048F668656E72656765CA |
:100350006C756E67004B65696E6520004F666620A0 |
:1003600020202020203A20253569004C75667464D1 |
:100370007275636B3A2025356900536F6C6C486F5A |
:100380006568653A2025356900486F6568653A20DB |
:10039000202020202535690028632920486F6C67BC |
:1003A000657220427573730053657474696E673AA1 |
:1003B00020256420005625642E2564002B2B204D1B |
:1003C000696B726F4B6F70746572202B2B005B250D |
:1003D000695D000011241FBECFEFD0E1DEBFCDBFAD |
:1003E00011E0A0E0B1E0E0E3F3E602C005900D9279 |
:1003F000A83CB107D9F717E0A8ECB1E001C01D9205 |
:10040000A73AB107E1F70C9438020C940000A2E07F |
:10041000B0E00E948431802D99270895FB01282F98 |
:10042000863008F025E0429FD0011124AC59BF4F1F |
:10043000842F9927019724F001900E948C31FACFE4 |
:10044000A2E0B0E0022E0E948C310895FB018630BC |
:1004500008F085E0489FD0011124AC59BF4F842F8C |
:100460009927019724F00E9484310192FACF0895D0 |
:100470000F931F93CF93DF9391E097B98FEF88B9D4 |
:100480008BE184B995B98EE38AB9579A87EF8BB916 |
:1004900084B7877F84BF809160008861809360000B |
:1004A0001092600080ED97E09093E5018093E40165 |
:1004B00010926602109265021092170610921606AC |
:1004C0001092640210926302109262021092610212 |
:1004D00028980E94540B0E94E8040E9493130E94E3 |
:1004E0008D0B0E94DB127894109225058CE380938B |
:1004F000260584E0809327058CE390E09F938F93FB |
:100500001F921F9283E291E09F938F931F920E940C |
:10051000590782E091E09F938F931F920E945907A1 |
:10052000299AA1E0B0E00E948431802D2DB73EB71A |
:10053000265F3F4F0FB6F8943EBF0FBE2DBF8B33E3 |
:10054000A9F183ED90E09F938F931F920E9459072A |
:100550000E945E1B4AE36EE376E080E00E940E029A |
:1005600001E00F900F900F90023049F40E94F11AB1 |
:100570004AE36EE376E082E00E940E0203E04AE383 |
:100580006EE376E0802F0E940E020F5F063060F36C |
:1005900081E022E030E0D901082E0E948C318BE30B |
:1005A00021503040D901082E0E948C3102E010E029 |
:1005B000D8010E948431802D4AE36EE376E00E94E8 |
:1005C0002602D8010E948431802D99279F938F9312 |
:1005D00088EB90E09F938F931F920E945907809120 |
:1005E00046060F900F900F900F900F9080FF20C045 |
:1005F0008BE990E09F938F931F920E94590784ECA0 |
:1006000099E00E94920AEC010E94B70E0F900F90A1 |
:100610000F90CE010E949B0A8823D9F386E990E0CF |
:100620009F938F931F920E9459070F900F900F90E6 |
:100630000E94161C289880ED97E09093E501809326 |
:10064000E40188EE93E09093200580931F0585E5F3 |
:1006500080931A0588E890E09F938F931F920E94E1 |
:100660005907809146060F900F900F9082FF03C0AC |
:100670008CE790E002C084E790E09F938F931F92F5 |
:100680000E9459070F900F900F9080E790E09F9382 |
:100690008F931F920E9459070E94DE0E0F900F90B9 |
:1006A0000F908091E101882379F11092E1010E947D |
:1006B000291D0E94CF1B289880910101882319F0E1 |
:1006C00081508093010180916002882329F08091FC |
:1006D00060028150809360022091040130910501F5 |
:1006E0008091560699272817390734F480ED97E052 |
:1006F0009093E5018093E40180910F02882319F41F |
:100700000E94DB1201C028988091460685FF03C035 |
:100710000E945A2908C010929602109295021092D7 |
:100720009802109297020E9403050E94710580E0D2 |
:1007300090E00E949B0A882309F4B3CF809167025E |
:10074000882329F088B190E1892788B901C04498AD |
:1007500084EF91E00E94920AA4CF1F920F920FB6ED |
:100760000F9211248F939F93EF93FF938091000139 |
:100770008823E1F48091DD019091DE010196909350 |
:10078000DE018093DD01FC01E451FC4FE081ED309E |
:1007900019F08639910539F41092DE011092DD01CD |
:1007A00081E080930001E093C60004C01092DE0156 |
:1007B0001092DD01FF91EF919F918F910F900FBEED |
:1007C0000F901F901895DC0120E030E040E050E0F1 |
:1007D000ECEEF3E005C08191280F311D4F5F5F4FB4 |
:1007E0004A175B07C1F73F70C90136E096958795B8 |
:1007F0003A95E1F7835CFD01E451FC4F808311964B |
:100800002F73235CFD01E451FC4F2083A351BC4FA7 |
:100810008DE08C93109200018091EC038093C600D0 |
:100820000895EF92FF920F931F93CF93DF937A0176 |
:10083000722F93E29093EC036093ED038093EE03A9 |
:1008400003E010E060E0AFEEB3E046C0F701E60F72 |
:10085000F11D90816F5F715019F4E0E040E00FC02E |
:10086000F701E60FF11D40816F5F715011F4E0E078 |
:1008700006C0F701E60FF11DE0816F5F7150892F0F |
:1008800086958695835C8C935527892F992783704D |
:10089000907024E0880F991F2A95E1F79A0194E05F |
:1008A000369527959A95E1F7822B835CED01898334 |
:1008B0004F705070440F551F440F551F8E2F829557 |
:1008C000869586958370842B835C8A83EF73E35CC3 |
:1008D000EB830C5F1F4F1496772309F0B7CFC80145 |
:1008E0000E94E303DF91CF911F910F91FF90EF9052 |
:1008F00008950F931F93CF93DF93EC01062F70E0C1 |
:10090000A22FBB2712974AC0E42FFF27E15DFA4FC1 |
:1009100030814F5FE42FFF27E15DFA4F50814F5F39 |
:10092000E42FFF27E15DFA4F10814F5FE42FFF278F |
:10093000E15DFA4F20814F5F842F9927A817B907EF |
:1009400084F1701771F15D53FE01E70FF11D3D5306 |
:10095000330F330F852F82958F70382B30836130A2 |
:1009600001F1912F9D537F5FFE01E70FF11D715043 |
:100970005295507F892F86958695582B50836350CA |
:100980006F3F79F07E5FFE01E70FF11D9295990FA1 |
:10099000990F907C2D53922B90837F5F662309F0F3 |
:1009A000B3CFDF91CF911F910F9108951F93182F0F |
:1009B0008A3019F48DE00E94D6048091C00085FF32 |
:1009C000FCCF1093C60080E090E01F910895089539 |
:1009D000E1ECF0E088E18083A0ECB0E08C918260F3 |
:1009E0008C938081806880838081806480838AE2A8 |
:1009F0008093C40088EC90E00E94920A90931905BD |
:100A000080931805089580910001882309F468C037 |
:100A10008091C801882371F080910001882351F0F2 |
:100A20002BE04AE155E06091EB0387E40E9411045A |
:100A30001092C80180911805909119050E949B0A97 |
:100A4000882321F48091CA018823B1F080910001AC |
:100A5000882391F022E345EC55E06091EB0384E4B8 |
:100A60000E9411041092CA018AEF90E00E94920A3B |
:100A700090931905809318058091C9018823F1F09E |
:100A8000809100018823D1F00E94E70E1092C901E5 |
:100A90008091D6018F5F8093D601843011F410923B |
:100AA000D6018091D60144E1849FA00111244A5EC1 |
:100AB0005E4F24E160E0805D0E9411048091CB01D3 |
:100AC000882371F080910001882351F02AE045E2EB |
:100AD00055E06091EB0386E50E9411041092CB0172 |
:100AE00008951F93CF93DF93CDB7DEB722970FB64C |
:100AF000F894DEBF0FBECDBF8091CD01882309F4ED |
:100B000098C08FEF8093010180913105813760F4A7 |
:100B10008C3608F06FC0873609F440C08836F9F08B |
:100B2000833609F084C008C0843759F1863791F1C3 |
:100B3000813709F07CC036C02091D00143E06BE0E2 |
:100B40008AE195E00E9479048091060290911C054B |
:100B5000892B8093060281E08093CA0168C02091AE |
:100B6000D00143E062E0CE0101960E9479048091B9 |
:100B700006029981892B8093060281E08093C90146 |
:100B800056C02091D00143E064E082ED91E00E94E4 |
:100B900079044DC081E08093CB0149C081E080930E |
:100BA000C80145C02091D00143E062E0CE0101962A |
:100BB0000E94790489818F3F89F0863010F085E0AA |
:100BC00089834AE36EE376E089810E942602898167 |
:100BD0002AE34EE356E06091EB0308C01091EB036B |
:100BE0000E9407022AE34EE356E0612F855B0E94D4 |
:100BF00011041DC02091D00143E06AE38EE396E02A |
:100C00000E947904809131054AE36EE376E08B56C9 |
:100C10000E940E02809131058B56A2E0B0E0082EB2 |
:100C20000E948C310E94070299270E94141D109285 |
:100C3000CD0122960FB6F894DEBF0FBECDBFDF9177 |
:100C4000CF911F9108951F920F920FB60F9211240A |
:100C50002F933F934F935F936F937F938F939F93C4 |
:100C6000AF93BF93CF93DF93EF93FF938091C60031 |
:100C70008093CC018091CC010E94E22A4091D8015E |
:100C8000463910F01092D7018091CC018D3009F0D7 |
:100C90005DC08091D701823009F058C01092D70111 |
:100CA000A42FBB27FD01E35DFA4F3081ED01C25D4A |
:100CB000DA4F28818091DB019091DC01831B91093F |
:100CC000821B91099F709093DC018093DB019C0152 |
:100CD000689415F8369527951694E1F7235C2093D0 |
:100CE000DA01982F9F73935C9093D9018081281724 |
:100CF00029F48881981711F491E006C08091CF0102 |
:100D00008F5F8093CF0190E08091CD01882309F01F |
:100D100064C0992309F461C081E08093CD014093C0 |
:100D2000D001A15DBA4F8DE08C9380913105823561 |
:100D300009F053C088E190E02CE00FB6F894A89534 |
:100D4000809360000FBE2093600047C08091D70160 |
:100D50008130D9F0813018F08230E9F530C08091CF |
:100D6000CC01833239F48091CD01882319F481E0DC |
:100D70008093D7018091CC0180932F0581E08093EF |
:100D8000D8018091CC01992715C082E08093D701CA |
:100D9000E42FFF278091CC01E15DFA4F80834F5F04 |
:100DA0004093D8012091CC018091DB019091DC012E |
:100DB000820F911D9093DC018093DB010EC0E42F24 |
:100DC000FF278091CC01E15DFA4F8083463938F3EB |
:100DD0001092D701E7CF1092D701FF91EF91DF91E9 |
:100DE000CF91BF91AF919F918F917F916F915F91C3 |
:100DF0004F913F912F910F900FBE0F901F9018951C |
:100E0000982F8091F705813069F480910502E82FD1 |
:100E1000FF27EA5EFE4F90838F5F8093050221E0FB |
:100E200030E005C0892F0E94D604282F3327C9013E |
:100E300008951F93182F04C080E30E9400071150EB |
:100E40001116D4F31F9108951F93182F04C080E248 |
:100E50000E94000711501116D4F31F9108950F93AB |
:100E60001F93CF93DF938C01EB0108C0F8010F5F54 |
:100E70001F4FE4918E2F0E94000721972097B1F712 |
:100E8000DF91CF911F910F9108950F931F93CF93EF |
:100E9000DF938C01EB0106C0F80181918F010E9464 |
:100EA000000721972097C1F7DF91CF911F910F91F4 |
:100EB00008952F923F924F925F926F927F928F92FE |
:100EC0009F92AF92BF92CF92DF92EF92FF920F93D9 |
:100ED0001F93CF93DF93CDB7DEB7E3970FB6F894A8 |
:100EE000DEBF0FBECDBF29968FAD29978093F70542 |
:100EF000CE01855B9F4F9D838C832B964EAD5FAD5E |
:100F00002B975FA74EA722243324210102C013018F |
:100F100024010EA51FA502C00F5F1F4FF801F4901A |
:100F2000FF2019F0F5E2FF16B9F7B8014EA55FA54D |
:100F3000641B750B19F0CA010E942F07FF2009F4EA |
:100F400044C20F5F1F4F1FA70EA71982AC81BD813E |
:100F50001BAA1AAA5FEF59ABEEA5FFA5CF01019618 |
:100F60009FA78EA7B49095E7B91621F08B2D8062CC |
:100F7000883789F4EBA9E0FF07C02D903D904D9094 |
:100F80005C901397149607C08D919C9111971C014A |
:100F9000442455241296F0E2BF1621F48981882357 |
:100FA000D9F686C043E2B41609F484C05AE2B516F5 |
:100FB00021F08DE2B81671F408C0FD011296E081AF |
:100FC000EAABE7FFC9CFE195EAAB9BA990619F7DB2 |
:100FD0009BABC2CFEBE2BE1609F46AC0FEE2BF16BD |
:100FE000B1F52EA53FA52F5F3F4FEEA5FFA584913C |
:100FF0008A3221F0B82E20E030E01BC0FD011296AD |
:101000004081518157FF02C04FEF5FEF49AB3FA7CF |
:101010002EA7A2CF8AE090E0A901489F9001499FA6 |
:10102000300D589F300D11242B0D311D20533040B1 |
:10103000B49031968B2D80538A3060F3FFA7EEA7D2 |
:10104000A90137FF02C04FEF5FEF49AB8CCF50E3F0 |
:10105000B51631F48BA984FD7FCF80628BAB7CCF3A |
:101060008B2D81538930E8F420E030E04AE050E0F5 |
:10107000F901E49F9001E59F300DF49F300D11249C |
:101080002B0D311D20533040EEA5FFA5CF01019659 |
:101090009FA78EA7B4908B2D80538A3048F32AAB3C |
:1010A00062CF98E6B91651F4EBA9E460EBAB54CFEC |
:1010B000B98252CFFBA9F860FBAB4ECF4CE6B41619 |
:1010C00021F45BA951605BAB47CFBD83AC8383E662 |
:1010D000B81639F41296BD83AC8312978C918E8327 |
:1010E00019C194E4B91639F0E4E6BE1639F0F9E610 |
:1010F000BF1659F503C04BA941604BAB5BA950FF2C |
:1011000008C01496BD83AC835E904E903E902E90A6 |
:101110000AC01296BD83AC839E918E911C0144241B |
:1011200037FC4094542C57FC03C08AE088AB93C032 |
:101130005094409430942094211C311C411C511C2B |
:101140008DE289839AE098AB86C0EFE4BE1629F061 |
:10115000FFE6BF1641F448E061C05BA951605BAB9C |
:1011600088E088AB77C090E7B91671F41296BD831A |
:10117000AC839E918E911C0144245524EBA9E0641C |
:10118000EBAB78E7B72E5EC043E7B416D9F51296FD |
:10119000BD83AC83DE90CE90C114D10489F488E283 |
:1011A0008E838EE68F8385E788878CE689878A879A |
:1011B00089E28B871C8666E0C62ED12CCC0EDD1E04 |
:1011C00059A957FD13C0452F552747FD509560E09D |
:1011D00070E0C6010E94252C009711F419A90DC0DA |
:1011E0008C1919A981174CF4182F07C0F60101902A |
:1011F0000020E9F731971E2F1C1919824201310195 |
:1012000040E094C085E5B81629F095E7B91641F499 |
:10121000EAE011C0FBA9F160FBAB4AE048AB1AC0A1 |
:1012200058E5B51621F088E7B81609F06FC09BA9FC |
:1012300093FD03C0E0E1E8AB0DC02114310441048B |
:10124000510419F4F0E1F8AB05C04BA940644BAB75 |
:1012500050E158AB198289A987FD03C09BA99F7DE6 |
:101260009BAB211431044104510461F4E9A9EE233C |
:1012700049F46624772443015EE2C52ED12CCC0EBE |
:10128000DD1E3EC04EE2C42ED12CCC0EDD1EF8A9D0 |
:10129000EF2EFF2400271127C201B101A8019701F9 |
:1012A0000E9447316A3020F430E3A32EA60E08C016 |
:1012B00027E5A22EA60E48E5B41611F45FEDA5228F |
:1012C000F601A2926F01C201B101A80197010E942B |
:1012D000473139014A012E143F044006510618F0E7 |
:1012E00019012A01D9CFF8A9F83051F44BA943FFCD |
:1012F00007C050E3A51621F080E3F60182936F0149 |
:10130000AE014C19142F125D49A910C0BB2009F47D |
:101310005CC0BE8219824201310100E096E0C92E14 |
:10132000D12CCC0EDD1E11E091E005C0912F042FD1 |
:10133000011B07FD00E08981882319F0812F8F5F51 |
:1013400007C05BA956FD02C0812F02C0892F8E5FA6 |
:10135000A82EA00E8BA9E82EFF2480E3482E512C46 |
:101360004E205F204114510421F48AA98A190E9459 |
:1013700024078981882329F061E070E0CE0101967D |
:1013800009C0E6FE09C080E38A83BB8262E070E0A8 |
:10139000CE0102960E94450790E24916510421F4BD |
:1013A0008AA98A190E941907802F0E941907612FA4 |
:1013B000772767FD7095C6010E944507E4FEA7CD1B |
:1013C0008AA98A190E942407A2CDE3960FB6F89441 |
:1013D000DEBF0FBECDBFDF91CF911F910F91FF9068 |
:1013E000EF90DF90CF90BF90AF909F908F907F90C5 |
:1013F0006F905F904F903F902F9008951F920F92A3 |
:101400000FB60F9211242F933F935F936F937F93A7 |
:101410008F939F93AF93BF938091E8018150809306 |
:10142000E8018F3F01F589E08093E8018091030195 |
:101430008F5F817080930301882319F481E080938A |
:10144000E1018091DF019091E00101969093E0012C |
:101450008093DF0180910F02882329F080910F0291 |
:10146000815080930F028091E4019091E5010297F1 |
:1014700058F08091E4019091E50101979093E50186 |
:101480008093E4015A9A01C05A988091460683FFDE |
:101490003BC0349B0AC08091E2019091E301019628 |
:1014A0009093E3018093E2012FC08091E20190913B |
:1014B000E301892B79F08091E2019091E301805A58 |
:1014C0009F4040F48091E2019091E301909351029A |
:1014D00080935002809150029091510220915202CB |
:1014E00030915302821B930B845E9D4F68E671E03E |
:1014F0000E943431845B9040909355028093540253 |
:101500001092E3011092E201BF91AF919F918F91F0 |
:101510007F916F915F913F912F910F900FBE0F9030 |
:101520001F9018952091DF013091E0012F5F3F4F10 |
:10153000820F931F08952091DF013091E001821BFB |
:10154000930B892F992786958074992708951F9268 |
:101550000F920FB60F921124EF92FF920F931F93E9 |
:101560002F933F934F935F936F937F938F939F93AB |
:10157000AF93BF93CF93DF93EF93FF9380910201DB |
:101580008150809302018F3F09F073C083E88093FC |
:10159000B00080918901C82FDD27D093E701C09367 |
:1015A000E60180916406E090600680FF1EC06091B5 |
:1015B0002002709121028091220290912302FF2447 |
:1015C0000027112720E830E040E050E00E94693118 |
:1015D000C801B7010E94013120E032E040E050E054 |
:1015E0000E946931C20FD31F1DC06091200270910B |
:1015F00021028091220290912302FF2400271127CB |
:1016000020E830E040E050E00E946931C801B701B5 |
:101610000E94013120E032E040E050E00E94693158 |
:10162000C21BD30BD093E701C093E6012091E601E2 |
:101630003091E7018091610699272817390734F026 |
:101640008091620699278217930724F49093E7010B |
:101650008093E6018091E6019091E7019093EC057B |
:101660008093EB058093B300809163068093020121 |
:1016700004C083E08093B0005F98FF91EF91DF9109 |
:10168000CF91BF91AF919F918F917F916F915F911A |
:101690004F913F912F911F910F91FF90EF900F90DD |
:1016A0000FBE0F901F9018958091DF019091E0017F |
:1016B0000B969093EA018093E90182E085BD83EA6D |
:1016C00084BD17BC88E788BD96E096BD83EC809307 |
:1016D000B0009093B100E0E7F0E080818260808309 |
:1016E000EEE6F0E08081816080838AE08093B30041 |
:1016F0001092B20008952091DF013091E0012F5F38 |
:101700003F4F280F391F8091DF019091E001A9011F |
:10171000481B590B57FFF7CF089510927C008FEEAE |
:1017200080937A0008951F920F920FB60F921124A2 |
:10173000EF92FF920F931F932F933F934F935F93DB |
:101740006F937F938F939F93AF93BF93CF93DF93C9 |
:10175000EF93FF9310927A00409101024F5F409304 |
:1017600001024150433009F41CC1443038F4413087 |
:1017700009F463C0423008F0B9C00DC0453009F427 |
:1017800050C1453008F42AC1463009F46FC14730D2 |
:1017900009F0CBC252C220911402309115028091FF |
:1017A000780090917900281B390B8091EF0190917E |
:1017B000F001820F931F9093F0018093EF018091CD |
:1017C000F9018F5F8093F901809144029091450265 |
:1017D000A0914602B0914702442737FD4095542F0F |
:1017E000820F931FA41FB51F80934402909345025C |
:1017F000A0934602B093470280914802909149021B |
:10180000A0914A02B0914B02820F931FA41FB51FF3 |
:101810008093480290934902A0934A02B0934B02EE |
:1018200081E0809302028091FF0190910002019675 |
:10183000909300028093FF017CC2609178007091C8 |
:1018400079008091120290911302681B790B8091AC |
:101850003C0290913D02A0913E02B0913F029B015B |
:10186000442737FD4095542F820F931FA41FB51FA7 |
:1018700080933C0290933D02A0933E02B0933F02BE |
:101880008091400290914102A0914202B0914302A6 |
:10189000820F931FA41FB51F8093400290934102B3 |
:1018A000A0934202B0934302809178009091790016 |
:1018B0000A9710F464E47DEF8091780090917900AC |
:1018C000895E934010F06CEB72E08091ED01909195 |
:1018D000EE01860F971F9093EE018093ED018091AA |
:1018E000F8018F5F8093F80182E058C06091780022 |
:1018F000709179008091100290911102681B790B10 |
:101900008091340290913502A0913602B091370255 |
:101910009B01442737FD4095542F820F931FA41F2E |
:10192000B51F8093340290933502A0933602B09392 |
:1019300037028091380290913902A0913A02B09119 |
:101940003B02820F931FA41FB51F80933802909310 |
:101950003902A0933A02B0933B02809178009091B3 |
:1019600079000A9710F464E47DEF809178009091FB |
:101970007900895E934010F06CEB72E08091EB018E |
:101980009091EC01860F971F9093EC018093EB01EF |
:101990008091F7018F5F8093F70184E080930202CA |
:1019A000C8C1409104015091050180917800909147 |
:1019B00079009A01220F331F240F351F63E070E076 |
:1019C0000E942031260F371F36952795369527958B |
:1019D000309305012093040186E0E0CF8091180246 |
:1019E000909119022091780030917900821B930B1D |
:1019F0009093F9058093F8058091F1019091F2019F |
:101A00002091F8053091F905820F931F9093F20110 |
:101A10008093F1018091FB018F5F8093FB0187E050 |
:101A2000BDCF80917800909179002091160230917D |
:101A30001702821B930B9093F9058093F805809110 |
:101A4000F3019091F4012091F8053091F905820F8E |
:101A5000931F9093F4018093F3018091FA018F5FBB |
:101A60008093FA014093020286E0E4C0609178001E |
:101A700070917900E0901A02F0901B0200911C0214 |
:101A800010911D02882777FD8095982F0E943F3086 |
:101A9000A80197010E94992F0E9422307093F601AD |
:101AA0006093F5012091F5013091F601E091F80580 |
:101AB000F091F905809103069091040697FF03C009 |
:101AC000909581959F4F64E070E00E943431EB0166 |
:101AD000CF01F7FF03C0909581959F4F64E070E0C0 |
:101AE0000E943431260F371F2C0F3D1F3093F60113 |
:101AF0002093F5018091F5019091F601029704F190 |
:101B000060911A0270911B0280911C0290911D023B |
:101B100020E030E048E454E40E94493088230CF08F |
:101B20003CC060911A0270911B0280911C0290913E |
:101B30001D022AE037ED43EA5CE30E949A2F25C09C |
:101B40008091F5019091F6018F5F9F4F34F5609180 |
:101B50001A0270911B0280911C0290911D0220E0DC |
:101B600030E046E154E40E944C301816B4F4609121 |
:101B70001A0270911B0280911C0290911D022AE0B2 |
:101B800037ED43EA5CE30E94992F60931A02709349 |
:101B90001B0280931C0290931D0281E08093FC0144 |
:101BA00080917800909179009093FB058093FA05DD |
:101BB00020914C0230914D0240914E0250914F02C3 |
:101BC0008091F5019091F601AA2797FDA095BA2F73 |
:101BD000280F391F4A1F5B1F20934C0230934D0280 |
:101BE00040934E0250934F02E0904C02F0904D0211 |
:101BF00000914E0210914F0260914C0270914D0283 |
:101C000080914E0290914F0220E034E040E050E09D |
:101C10000E946931E21AF30A040B150BE0924C02A0 |
:101C2000F0924D0200934E0210934F0283E0809396 |
:101C3000020287E0809301027CC0809108069091A7 |
:101C400009062091780030917900820F931F9093BC |
:101C5000090680930806809100068F5F8093000636 |
:101C600080910006853008F460C0809178009091E2 |
:101C7000790090930B0180930A01109200068091E5 |
:101C8000FC059091FD052091080630910906821B04 |
:101C9000930B2091680230916902821B930B909301 |
:101CA000FE018093FD016091080670910906E090A5 |
:101CB0000601F090070100910801109109018827A1 |
:101CC00077FD8095982FA8019701220F331F441F9D |
:101CD000551F2E0D3F1D401F511F620F731F841F84 |
:101CE000951F24E030E040E050E00E9469312093ED |
:101CF0000601309307014093080150930901209198 |
:101D0000FC053091FD058091060190910701A0919D |
:101D10000801B0910901281B390B30936902209307 |
:101D200068021092090610920806109202021092A0 |
:101D300001028091020280937C008FEE80937A00F2 |
:101D4000FF91EF91DF91CF91BF91AF919F918F91D3 |
:101D50007F916F915F914F913F912F911F910F91C3 |
:101D6000FF90EF900F900FBE0F901F901895CF939C |
:101D7000DF93C0E0D0E0C7BD82E390E00E947B0B20 |
:101D80008BE391E09F938F931F920E94590780915C |
:101D90000A0190910B010F900F900F90845893407F |
:101DA00020F02196CA3FD10531F7C093050688EC93 |
:101DB00090E00E947B0BDF91CF910895E6E1F1E086 |
:101DC00080E2819391E0E636F907D9F70895FF9212 |
:101DD0000F931F9380910602282F3327C90181702A |
:101DE0009070682F882391F080910702882311F06A |
:101DF000815002C08091660180930702E6E1F1E024 |
:101E000080E2819391E0E636F907D9F7A9014270A3 |
:101E1000507021FF0DC0809107028F5F80930702F1 |
:101E2000E6E1F1E080E2819391E0E636F907D9F747 |
:101E3000662321F0452B11F01092070281E1809377 |
:101E400005028091070299279F938F938EEC93E070 |
:101E50009F938F93E1E0FE2EFF920E94590700911D |
:101E600007020F900F900F900F900F90053009F41C |
:101E7000DAC1063090F4023009F4BBC0033030F40C |
:101E8000002309F1013009F08BC350C0033009F47D |
:101E900005C1043009F084C34EC1083009F49BC267 |
:101EA000093038F4063009F414C2073009F078C359 |
:101EB0006FC20A3009F40AC30A3008F4C9C20B30F1 |
:101EC00009F06EC340C3109205028CEB93E09F9320 |
:101ED0008F93FF920E94590784E1809305028CE35F |
:101EE00090E09F938F931F921F9285EB93E09F93B7 |
:101EF0008F93FF920E94590788E2809305020E9407 |
:101F0000070299279F938F9388EA93E09F938F937B |
:101F1000FF920E9459078CE38093050288E993E0C1 |
:101F20009F938F93FF920E9459078EC2809146061D |
:101F300080FF47C01092050280916802909169026B |
:101F40009F938F9389E893E09F938F930F930E94C1 |
:101F5000590784E18093050280916A0290916B0297 |
:101F60009F938F938AE793E09F938F930F930E94A1 |
:101F7000590788E28093050280910A0190910B0134 |
:101F80009F938F938BE693E09F938F930F930E9481 |
:101F900059078CE3809305028091050699279F934A |
:101FA0008F938CE593E09F938F930F930E94590733 |
:101FB0008DB79EB744960FB6F8949EBF0FBE8DBFE7 |
:101FC000F4C284E18093050285E593E09F938F93AB |
:101FD0000F930E94590788E28093050287E493E0FB |
:101FE0009F938F930F930E9459078DB79EB70696C4 |
:101FF000E2CF109205028DE393E09F938F93FF92BF |
:102000000E94590784E1809305026091200270913B |
:102010002102809122029091230220E034E040E0EE |
:1020200050E00E9469315F934F933F932F938EE26C |
:1020300093E09F938F93FF920E94590788E28093C9 |
:102040000502609128027091290280912A029091E4 |
:102050002B0220E034E040E050E00E9469315F93C1 |
:102060004F933F932F938FE193E09F938F93FF9232 |
:102070000E9459078CE38093050280915002909151 |
:1020800051029F938F9380E193E09F938F93FF92F0 |
:102090000E9459078DB79EB746968DCF10920502C4 |
:1020A000809116069091170620911406309115061E |
:1020B0009F938F933F932F9380E093E09F938F9311 |
:1020C000FF920E94590784E18093050280911A06CD |
:1020D00090911B0620911806309119069F938F93BB |
:1020E0003F932F9380EF92E09F938F93FF920E94F4 |
:1020F000590788E28093050280911E0690911F0681 |
:1021000020911C0630911D069F938F933F932F9330 |
:1021100080EE92E09F938F93FF920E9459078CE389 |
:102120008093050280912006909121069F938F93C2 |
:1021300080ED92E06FC010920502E0913F06FF270C |
:10214000EE0FFF1FEE5EF94F20813181E0913E06D8 |
:10215000FF27EE0FFF1FEE5EF94F808191813F93C5 |
:102160002F939F938F9380EC92E09F938F93FF9296 |
:102170000E94590784E180930502E0914106FF2700 |
:10218000EE0FFF1FEE5EF94F20813181E091400696 |
:10219000FF27EE0FFF1FEE5EF94F808191813F9385 |
:1021A0002F939F938F9380EB92E09F938F93FF9257 |
:1021B0000E94590788E280930502E0914306FF27B9 |
:1021C000EE0FFF1FEE5EF94F20813181E091420654 |
:1021D000FF27EE0FFF1FEE5EF94F808191813F9345 |
:1021E0002F939F938F9380EA92E09F938F93FF9218 |
:1021F0000E9459078CE380930502E0914406FF2773 |
:10220000EE0FFF1FEE5EF94F808191819F938F93B8 |
:1022100080E992E09F938F93FF920E9459078DB7B8 |
:102220009EB74A96C8CE1092050282E892E09F932C |
:102230008F93FF920E94590784E1809305022091B9 |
:102240001002309111028091EB019091EC016091AC |
:10225000F7013F932F9377270E9434317F936F9339 |
:1022600083E792E09F938F93FF920E94590788E241 |
:102270008093050220911202309113028091ED01AA |
:102280009091EE016091F8013F932F9377270E9480 |
:1022900034317F936F9384E692E09F938F93FF9204 |
:1022A0000E9459078CE3809305022091140230911B |
:1022B00015028091EF019091F0016091F9013F9337 |
:1022C0002F9377270E9434317F936F9385E592E0B7 |
:1022D00056C01092050288E492E09F938F93FF927C |
:1022E0000E94590784E180930502209116023091E3 |
:1022F00017028091F3019091F4016091FA013F93EC |
:102300002F9377270E9434317F936F9389E392E074 |
:102310009F938F93FF920E94590788E28093050252 |
:1023200020911802309119028091F1019091F201EF |
:102330006091FB013F932F9377270E9434317F9365 |
:102340006F938AE292E09F938F93FF920E945907C6 |
:102350008CE38093050260911A0270911B028091B8 |
:102360001C0290911D020091FA051091FB050E943C |
:1023700022307F936F931F930F938BE192E09F9393 |
:102380008F93FF920E9459078DB79EB7489613CE40 |
:1023900084E18093050280910401909105019F934F |
:1023A0008F938CE092E09F938F93FF920E94590746 |
:1023B00088E2809305028091600299279F938F9312 |
:1023C0008DEF91E09F938F93FF920E9459078DB7F5 |
:1023D0009EB70A96F0CD109205028EEE91E09F9383 |
:1023E0008F93FF920E94590784E1809305028091A8 |
:1023F0005402909155029F938F938FED91E09F939C |
:102400008F93FF920E94590788E280930502809182 |
:102410005002909151029F938F9380ED91E09F9392 |
:102420008F93FF920E9459078CE38093050280915D |
:102430005202909153029F938F9381EC91E09F936E |
:102440008F93FF920E9459078DB79EB74296B3CDE6 |
:102450001092050280915802909159029F938F9398 |
:1024600085EB91E09F938F93FF920E94590784E13F |
:102470008093050280915A0290915B029F938F9303 |
:1024800089EA91E09F938F93FF920E94590788E217 |
:102490008093050280915C0290915D029F938F93DF |
:1024A0008DE991E09F938F93FF920E9459078CE3EF |
:1024B0008093050280915E0290915F029F938F93BB |
:1024C00081E991E09F938F93FF9270CD1092050266 |
:1024D00089E891E09F938F93FF920E94590784E1CE |
:1024E000809305028091890199279F938F938BE7B1 |
:1024F00091E09F938F93FF920E94590788E2809307 |
:1025000005028091E6019091E7019F938F938DE6FC |
:1025100091E09F938F93FF920E9459078CE38093E1 |
:1025200005028091620699279F938F93809161069F |
:1025300099279F938F938FE591E09F938F93FF92BD |
:102540000E94590735CD1092050289E591E09F93CD |
:102550008F93FF920E94590784E180930502809136 |
:102560009502909196029F938F938BE491E09F93B5 |
:102570008F93FF920E94590788E280930502809111 |
:102580009702909198029F938F938DE391E09F9390 |
:102590008F93FF920E9459078DB79EB70D960BCD72 |
:1025A00001500093660110920702109206021F91DB |
:1025B0000F91FF9008951092B9008AE28093B800BD |
:1025C000089585EA8093BC0080E090E0089584E956 |
:1025D0008093BC0008951092B9008093BB0085E8F9 |
:1025E0008093BC0080E090E008951F920F920FB698 |
:1025F0000F9211248F939F93EF93FF938091080282 |
:102600008F5F809308028150833009F442C0843088 |
:1026100028F48130A1F0823070F50CC0853009F4C7 |
:1026200048C08530D8F1863009F44BC0873009F0B6 |
:1026300071C05BC080910902880F8E5A14C08091CE |
:1026400009028F5F809309028150813009F444C0F0 |
:10265000813038F0823009F442C0833009F05AC02A |
:1026600041C08091AF021092B9008093BB0085E811 |
:102670008093BC004FC084E98093BC008091090224 |
:10268000843018F41092080202C01092090285EA00 |
:10269000EFCF80910A02880F8D5AE5CF80910A0210 |
:1026A0008130D1F08130E8F28230C9F0833091F589 |
:1026B00019C08091BB00E0910A02FF27E65FF94F45 |
:1026C000808380910A02813039F0813050F282306B |
:1026D00031F08330F9F406C08091B002C4CF80910C |
:1026E000B703C1CF8091E203BECF80910A029091DF |
:1026F000BB00E82FFF27E65FF94F94838F5F80933D |
:102700000A02843010F010920A0284E98093BC001F |
:1027100010920802FF91EF919F918F910F900FBE41 |
:102720000F901F90189583EC80938100EFE6F0E006 |
:1027300080818062808310921502109214021092A0 |
:1027400013021092120210921102109210020895B8 |
:102750001F920F920FB60F9211240F931F932F9376 |
:102760003F934F935F936F937F938F939F93AF9319 |
:10277000BF93CF93DF93EF93FF9320918600309127 |
:10278000870080910D0290910E02281B390B8091D9 |
:1027900086009091870090930E0280930D02C901EC |
:1027A0008D5D95408356994148F481E090E0909387 |
:1027B0000C0280930B021092670154C0C0910B026F |
:1027C000D0910C02CA30D1050CF04CC0C9018B5F0E |
:1027D0009040845B914008F040C0A901425D5140A7 |
:1027E000FE01EE0FFF1FEE5EF94F80819181FA012D |
:1027F000E81BF90BCF01F7FF03C0909581959F4F20 |
:1028000006974CF480916002883C28F48091600225 |
:10281000865F80936002FE01EE0FFF1F8F010E5E48 |
:10282000194FD8012D913C91C901880F991F820F32 |
:10283000931F840F951F64E070E00E943431D8012B |
:102840008D919C9111979B01281B390BE85DF94FE5 |
:102850003183208311967C936E932196D0930C0242 |
:10286000C0930B02FF91EF91DF91CF91BF91AF9198 |
:102870009F918F917F916F915F914F913F912F9198 |
:102880001F910F910F900FBE0F901F901895AF9250 |
:10289000BF92CF92DF92EF92FF920F931F9310920D |
:1028A0007A008091F701882369F08091EB01909183 |
:1028B000EC016091F70177270E94343170937B0619 |
:1028C00060937A068091F801882369F08091ED0188 |
:1028D0009091EE016091F80177270E943431709356 |
:1028E0007906609378068091F901882369F08091D8 |
:1028F000EF019091F0016091F90177270E94343146 |
:1029000070938706609386068091FA018823D9F137 |
:10291000E0908306F09084066091F3017091F401D9 |
:102920002091FA010027F7FC0095102F570168014C |
:1029300043E0AA0CBB1CCC1CDD1C4A95D1F7AE1899 |
:10294000BF08C00AD10A882777FD8095982F34E008 |
:10295000660F771F881F991F3A95D1F733274427B1 |
:1029600055270E946931A20EB31EC41ED51EC60192 |
:10297000B50128E030E040E050E00E94693130933A |
:102980008406209383068091FB018823D9F1E0908F |
:102990008C06F0908D066091F1017091F20120910A |
:1029A000FB010027F7FC0095102F5701680183E019 |
:1029B000AA0CBB1CCC1CDD1C8A95D1F7AE18BF0835 |
:1029C000C00AD10A882777FD8095982FB4E0660F5A |
:1029D000771F881F991FBA95D1F7332744275527AA |
:1029E0000E946931A20EB31EC41ED51EC601B501D8 |
:1029F00028E030E040E050E00E94693130938D06DD |
:102A000020938C068091FC018823A1F1E0907D0643 |
:102A1000F0907E066091F5017091F6012091FC0125 |
:102A20000027F7FC0095102F57016801A3E0AA0CBE |
:102A3000BB1CCC1CDD1CAA95D1F7AE18BF08C00A80 |
:102A4000D10A882777FD8095982F3327442755276B |
:102A50000E946931A20EB31EC41ED51EC601B50167 |
:102A600028E030E040E050E00E94693130937E067B |
:102A700020937D061092EC011092EB011092F70169 |
:102A80001092EE011092ED011092F8011092F001F7 |
:102A90001092EF011092F9011092F2011092F101DF |
:102AA0001092FB011092F4011092F3011092FA01BE |
:102AB0001092F6011092F5011092FC0180914402EF |
:102AC00090914502A0914602B09147028093300256 |
:102AD00090933102A0933202B0933302809134027A |
:102AE00090913502A0913602B09137028093200276 |
:102AF00090932102A0932202B093230280913C0282 |
:102B000090913D02A0913E02B0913F028093280235 |
:102B100090932902A0932A02B0932B02809138024D |
:102B200090913902A0913A02B0913B028093240225 |
:102B300090932502A0932602B09327028091400231 |
:102B400090914102A0914202B091430280932C02E5 |
:102B500090932D02A0932E02B0932F028FEE8093BC |
:102B60007A0080917A0690917B06893C91057CF0F1 |
:102B700020917A0630917B0680917A0690917B06AF |
:102B8000880F991F880F991F2052334015C08091DC |
:102B90007A0690917B0688539F4FA4F420917A0681 |
:102BA00030917B0680917A0690917B06880F991F61 |
:102BB000880F991F205E3C4F820F931F90937B06D6 |
:102BC00080937A068091780690917906893C9105E8 |
:102BD0007CF020917806309179068091780690916A |
:102BE0007906880F991F880F991F2052334015C00E |
:102BF000809178069091790688539F4FA4F4209194 |
:102C00007806309179068091780690917906880F40 |
:102C1000991F880F991F205E3C4F820F931F90933E |
:102C2000790680937806209158023091590280915C |
:102C30004206E82FFF27EE0FFF1FEE5EF94F80815F |
:102C4000918182599F4F281739071CF42F5F3F4FFE |
:102C50000CC08081918182599F4F821793074CF459 |
:102C60002115310531F02150304030935902209325 |
:102C7000580220915A0230915B0280914306E82F5E |
:102C8000FF27EE0FFF1FEE5EF94F80819181825981 |
:102C90009F4F281739071CF42F5F3F4F0CC08081CE |
:102CA000918182599F4F821793074CF4211531056A |
:102CB00031F02150304030935B0220935A02209132 |
:102CC0005C0230915D0280914406E82FFF27EE0FF1 |
:102CD000FF1FEE5EF94F8081918182599F4F281727 |
:102CE00039071CF42F5F3F4F0CC0808191818259BE |
:102CF0009F4F821793074CF42115310531F0215075 |
:102D0000304030935D0220935C0220915E0230914E |
:102D10005F0280914506E82FFF27EE0FFF1FEE5E52 |
:102D2000F94F8081918182599F4F281739071CF4F0 |
:102D30002F5F3F4F0CC08081918182599F4F821736 |
:102D400093074CF42115310531F021503040309378 |
:102D50005F0220935E02809158029091590297FF82 |
:102D600005C010925902109258020AC08F3F910577 |
:102D700039F034F08FEF90E090935902809358022D |
:102D800080915A0290915B0297FF05C010925B02FE |
:102D900010925A020AC08F3F910539F034F08FEF3C |
:102DA00090E090935B0280935A0280915C02909134 |
:102DB0005D0297FF05C010925D0210925C020AC08E |
:102DC0008F3F910539F034F08FEF90E090935D02E2 |
:102DD00080935C0280915E0290915F0297FF05C034 |
:102DE00010925F0210925E020AC08F3F910539F087 |
:102DF00034F08FEF90E090935F0280935E021F911A |
:102E00000F91FF90EF90DF90CF90BF90AF9008951B |
:102E100010927A008091F701882369F08091EB018C |
:102E20009091EC016091F70177270E943431709303 |
:102E30007B0660937A068091F801882369F080917F |
:102E4000ED019091EE016091F80177270E943431F5 |
:102E500070937906609378068091F901882369F070 |
:102E60008091EF019091F0016091F90177270E9424 |
:102E7000343170938706609386068091FA01882327 |
:102E8000D1F06091F3017091F4012091FA0188274B |
:102E900077FD8095982F34E0660F771F881F991F64 |
:102EA0003A95D1F73327442755270E94693130934B |
:102EB0008406209383068091FB018823D1F06091E2 |
:102EC000F1017091F2012091FB01882777FD809537 |
:102ED000982FB4E0660F771F881F991FBA95D1F716 |
:102EE0003327442755270E94693130938D0620935C |
:102EF0008C068091FC01882399F06091F501709116 |
:102F0000F6012091FC01882777FD8095982F3327C3 |
:102F1000442755270E94693130937E0620937D0611 |
:102F20001092EC011092EB011092F7011092EE0159 |
:102F30001092ED011092F8011092F0011092EF0141 |
:102F40001092F9011092F2011092F1011092FB011E |
:102F50001092F4011092F3011092FA011092F6010E |
:102F60001092F5011092FC018FEE80937A0020916F |
:102F700058023091590280914206E82FFF27EE0F48 |
:102F8000FF1FEE5EF94F8081918182599F4F281774 |
:102F900039071CF42F5F3F4F0CC08081918182590B |
:102FA0009F4F821793074CF42115310531F02150C2 |
:102FB0003040309359022093580220915A023091A8 |
:102FC0005B0280914306E82FFF27EE0FFF1FEE5EA6 |
:102FD000F94F8081918182599F4F281739071CF43E |
:102FE0002F5F3F4F0CC08081918182599F4F821784 |
:102FF00093074CF42115310531F0215030403093C6 |
:103000005B0220935A0220915C0230915D02809114 |
:103010004406E82FFF27EE0FFF1FEE5EF94F808179 |
:10302000918182599F4F281739071CF42F5F3F4F1A |
:103030000CC08081918182599F4F821793074CF475 |
:103040002115310531F02150304030935D0220933D |
:103050005C0220915E0230915F0280914506E82F6C |
:10306000FF27EE0FFF1FEE5EF94F8081918182599D |
:103070009F4F281739071CF42F5F3F4F0CC08081EA |
:10308000918182599F4F821793074CF42115310586 |
:1030900031F02150304030935F0220935E028091E6 |
:1030A00058029091590297FF05C010925902109250 |
:1030B00058020AC08F3F910539F034F08FEF90E04D |
:1030C000909359028093580280915A0290915B022A |
:1030D00097FF05C010925B0210925A020AC08F3F00 |
:1030E000910539F034F08FEF90E090935B0280937C |
:1030F0005A0280915C0290915D0297FF05C0109288 |
:103100005D0210925C020AC08F3F910539F034F0E5 |
:103110008FEF90E090935D0280935C0280915E025D |
:1031200090915F0297FF05C010925F0210925E02BD |
:1031300008958F3F910539F034F08FEF90E0909330 |
:103140005F0280935E0208951F93809149068B3F32 |
:1031500098F08B3F19F4809158020EC08C3F19F4FF |
:1031600080915A0209C08D3F19F480915C0204C01D |
:103170008E3F21F480915E028093810180918101D4 |
:10318000882319F41092810104C08F3F11F48093B9 |
:103190008101809148068B3F98F08B3F19F4809114 |
:1031A00058020EC08C3F19F480915A0209C08D3F1D |
:1031B00019F480915C0204C08E3F21F480915E027C |
:1031C0008093800180918001882319F410928001FE |
:1031D00005C0843618F084E68093800180914A0609 |
:1031E0008B3F98F08B3F19F4809158020EC08C3FB2 |
:1031F00019F480915A0209C08D3F19F480915C0244 |
:1032000004C08E3F21F480915E0280938201809100 |
:103210008201882319F41092820105C0843618F0C7 |
:1032200084E68093820180914C068B3F98F08B3F1F |
:1032300019F4809158020EC08C3F19F480915A0203 |
:1032400009C08D3F19F480915C0204C08E3F21F4C7 |
:1032500080915E028093830180918301882319F419 |
:103260001092830104C08F3F11F4809383018091F9 |
:1032700053068B3F98F08B3F19F4809158020EC093 |
:103280008C3F19F480915A0209C08D3F19F4809146 |
:103290005C0204C08E3F21F480915E028093840121 |
:1032A00080918401882319F41092840104C08F3F17 |
:1032B00011F480938401809154068B3F98F08B3FEA |
:1032C00019F4809158020EC08C3F19F480915A0273 |
:1032D00009C08D3F19F480915C0204C08E3F21F437 |
:1032E00080915E0280938501809185018B3010F47E |
:1032F0008AE002C08F3F11F48093850180915506CA |
:103300008B3F98F08B3F19F4809158020EC08C3F90 |
:1033100019F480915A0209C08D3F19F480915C0222 |
:1033200004C08E3F21F480915E02809386018091DB |
:103330008601882319F41092860104C08F3F11F48E |
:103340008093860180915A068B3F98F08B3F19F449 |
:10335000809158020EC08C3F19F480915A0209C026 |
:103360008D3F19F480915C0204C08E3F21F480915E |
:103370005E028093880180918801882319F410925D |
:10338000880104C08F3F11F48093880180915B060F |
:103390008B3F98F08B3F19F4809158020EC08C3F00 |
:1033A00019F480915A0209C08D3F19F480915C0292 |
:1033B00004C08E3F21F480915E0280936C02809164 |
:1033C0006C02882319F410926C0204C08F3F11F430 |
:1033D00080936C0280915C068B3F98F08B3F19F4D0 |
:1033E000809158020EC08C3F19F480915A0209C096 |
:1033F0008D3F19F480915C0204C08E3F21F48091CE |
:103400005E0280936D0280916D02882319F4109200 |
:103410006D0204C08F3F11F480936D0280915D06B0 |
:103420008B3F98F08B3F19F4809158020EC08C3F6F |
:1034300019F480915A0209C08D3F19F480915C0201 |
:1034400004C08E3F21F480915E0280936E028091D1 |
:103450006E02882319F410926E0204C08F3F11F49B |
:1034600080936E0280915E068B3F98F08B3F19F43B |
:10347000809158020EC08C3F19F480915A0209C005 |
:103480008D3F19F480915C0204C08E3F21F480913D |
:103490005E0280936F0280916F02882319F410926C |
:1034A0006F0204C08F3F11F480936F0290915F060A |
:1034B0009B3FB0F09B3F19F48091580204C09C3FA1 |
:1034C00029F480915A02809389010CC09D3F19F420 |
:1034D00080915C02F8CF9E3F29F480915E02F3CF89 |
:1034E0009093890180918901882319F410928901B0 |
:1034F00004C08F3F11F4809389019B3FB0F09B3F44 |
:1035000019F48091580204C09C3F29F480915A021A |
:10351000809389010CC09D3F19F480915C02F8CF23 |
:103520009E3F29F480915E02F3CF909389018091B0 |
:103530008901882319F41092890104C08F3F11F486 |
:10354000809389019B3FB0F09B3F19F48091580212 |
:1035500004C09C3F29F480915A02809389010CC0D9 |
:103560009D3F19F480915C02F8CF9E3F29F4809131 |
:103570005E02F3CF9093890180918901882319F429 |
:103580001092890104C08F3F11F48093890110913A |
:103590008801612F772767FD7095872F972F0E94ED |
:1035A0003F3017FF06C020E030E040E853E40E94BF |
:1035B0009A2F27E137EB41ED58E30E94B930609331 |
:1035C0007C0170937D0180937E0190937F018091B7 |
:1035D0005106809385068091500680937C061F914A |
:1035E000089581E080933E0642E040933F0683E0E9 |
:1035F0008093400624E02093410635E03093420654 |
:1036000086E08093430687E0809344061092460646 |
:103610008EE1809347068BEF809349068AE0809382 |
:103620004A0692E39093480690934C0640934B06CB |
:1036300020934D0610924E0680E180934F068FE056 |
:10364000809350068AEF809351068AE18093520658 |
:1036500080E8809353068FEA809354068093550642 |
:103660008AE58093560683E28093570684E180932F |
:1036700058061092590630935A0610925B06109223 |
:103680005C0610925D0610925E0684E680935F06EB |
:1036900088E280936006109264069093610686E942 |
:1036A0008093620630936306ACE6B6E0E8E6F1E0AC |
:1036B0008CE001900D928150E1F7089581E08093B4 |
:1036C0003E0652E050933F0683E08093400644E07C |
:1036D0004093410635E03093420686E080934306EE |
:1036E00087E08093440628E0209345061092460622 |
:1036F0009EE1909347068BEF809349068AE0809382 |
:103700004A0686E48093480690934C0650934B06F5 |
:1037100040934D0620934E0680E180934F068FE044 |
:10372000809350068AEF809351068AE18093520677 |
:1037300080E88093530688E78093540696E9909337 |
:1037400055068AE58093560683E28093570684E106 |
:10375000809358061092590630935A0610925B06D1 |
:1037600010925C0610925D0610925E0684E68093CD |
:103770005F0688E2809360061092640682E380937D |
:1037800061069093620630936306ACE6B6E0E0E72C |
:10379000F1E08CE001900D928150E1F70895809165 |
:1037A0006702882301F51092B0021092AF021092C6 |
:1037B000B7031092E2038091D201882311F0809325 |
:1037C000AF028091D301882311F08093B0028091E1 |
:1037D000D401882311F08093E2038091D5018823DE |
:1037E00011F08093B7038091AF0299279093F00571 |
:1037F0008093EF058091B00299279093F205809312 |
:10380000F1058091E20399279093F4058093F305E5 |
:103810008091B70399279093F6058093F505109250 |
:103820000802109209020E94E1120895CF93DF93DB |
:10383000109217021092160210921902109218029A |
:1038400080E090E0A0E0B0E080931A0290931B0229 |
:10385000A0931C02B0931D0210921102109210024C |
:10386000109213021092120210921502109214027A |
:103870000E94081785E090E00E94920AEC01CE01B8 |
:103880000E949B0A8823D9F30E940817809146065C |
:1038900080FF10C080910A0190910B01875B9340DB |
:1038A00038F480910A0190910B018E5E924010F4E1 |
:1038B0000E94B70E80917A0690917B0697FF03C015 |
:1038C000909581959F4F9093110280931002809163 |
:1038D00078069091790697FF03C0909581959F4F48 |
:1038E000909313028093120280918606909187062E |
:1038F00097FF03C0909581959F4F909315028093F9 |
:10390000140280918C0690918D0697FF03C09095CC |
:1039100081959F4F60E170E00E94343170931902ED |
:1039200060931802809183069091840697FF03C0EC |
:10393000909581959F4F60E170E00E9434317093C3 |
:103940001702609316026091FA057091FB058827B3 |
:1039500077FD8095982F0E943F3060931A027093F4 |
:103960001B0280931C0290931D021092340210924D |
:1039700035021092360210923702109238021092DD |
:10398000390210923A0210923B0210923C021092BD |
:103990003D0210923E0210923F021092400210929D |
:1039A000410210924202109243021092440210927D |
:1039B0004502109246021092470210927B06109226 |
:1039C0007A06109279061092780610928706109265 |
:1039D00086068091060190910701A0910801B0919F |
:1039E00009019093FD058093FC051092FE01109251 |
:1039F000FD0110924C0210924D0210924E02109254 |
:103A00004F02809150029091510290935302809303 |
:103A100052020E94D82782E390E09093E5018093C0 |
:103A2000E401DF91CF9108951F93182F0EC080916C |
:103A30006702882361F484E690E09093E501809327 |
:103A4000E4018AEF90E00E947B0B115080F71F91F8 |
:103A500008952F923F924F925F926F927F928F9232 |
:103A60009F92AF92BF92CF92DF92EF92FF920F930D |
:103A70001F93CF93DF93CDB7DEB728970FB6F89497 |
:103A8000DEBF0FBECDBF0E944714299AE0914006C9 |
:103A9000AE2FBB27AA0FBB1FAE5EB94F0D90BC91D6 |
:103AA000A02D9D0128583F4F3A83298337FF02C03C |
:103AB0001A82198280916002843608F04AC080918F |
:103AC0000101882331F484EF91E09093E501809324 |
:103AD000E40180917B0290917C02009731F0019784 |
:103AE00090937C0280937B0204C010926702109234 |
:103AF0005602289A8091760290917702815D9740D4 |
:103B000028F180915706482F55275A83498381E031 |
:103B100080935602E0913E06FF27EE0FFF1FEE5EF8 |
:103B2000F94F11821082E0913F06FF27EE0FFF1F31 |
:103B3000EE5EF94F11821082E0914106FF27EE0FF1 |
:103B4000FF1FEE5EF94F11821082CEC11092670204 |
:103B5000CBC1809160028D3808F4C6C11092560224 |
:103B60008091580622E3829FC001112490937C0229 |
:103B700080937B0269817A81693271056CF0809152 |
:103B80007602909177027FEF8F3F970781F1019640 |
:103B900090937702809376028091760290917702DB |
:103BA000883C910520F089819A81889704F51092CC |
:103BB000910210929202109293021092940210922B |
:103BC0008D0210928E0210928F021092900210922B |
:103BD000440210924502109246021092470210923F |
:103BE00048021092490210924A0210924B02E98157 |
:103BF000FA81E93CF1050CF4D6C080916702882374 |
:103C000009F072C1E0914106FF27EE0FFF1FEE5E43 |
:103C1000F94F808191818C3491050CF4C1C0809161 |
:103C20007A028F5F80937A02893C08F45DC12998FB |
:103C30000E94161C1092670210927A02109277026C |
:103C40001092760280913E06282F3327F901EE0F5D |
:103C5000FF1FEE5EF94F80819181873491059CF4BE |
:103C6000E0913F06FF27EE0FFF1FEE5EF94F019038 |
:103C7000F081E02DF7FF03C0F095E195FF4FE734A9 |
:103C8000F1050CF46CC080913F06682F7727DB01AB |
:103C9000AA0FBB1FAE5EB94F8D919C9111978734CF |
:103CA00091053CF0F901EE0FFF1FEE5EF94F8081A8 |
:103CB00091818D919C918734910564F0F901EE0F0B |
:103CC000FF1FEE5EF94F808191818734910514F0DA |
:103CD00042E001C041E0FB01EE0FFF1FEE5EF94F35 |
:103CE00080819181863491055CF4F901EE0FFF1F0C |
:103CF000EE5EF94F80819181873491050CF043E0AD |
:103D0000FB01EE0FFF1FEE5EF94F808191818A5B10 |
:103D10009F4F5CF4F901EE0FFF1FEE5EF94F8081BB |
:103D20009181873491050CF044E0660F771F6E5E39 |
:103D3000794FFB01808191818A5B9F4F5CF4220F58 |
:103D4000331F2E5E394FF9018081918186349105B0 |
:103D50000CF445E0A2E0B0E0042E0E948C310E94F9 |
:103D600007024AE36EE376E00E9426020E94070201 |
:103D70000E94141D8091460680FFB6C080910A0102 |
:103D800090910B01875B934040F480910A019091E0 |
:103D90000B018E5E924008F0A7C00E94B70EA4C02F |
:103DA00010927A02A1C049815A81433251050CF028 |
:103DB0009BC080914106482F5527FA01EE0FFF1F47 |
:103DC000EE5EF94F80819181855B9F4F0CF06DC055 |
:103DD000809179028F5F80937902893C08F467C0F3 |
:103DE00088EC8093790281E090E090937702809351 |
:103DF000760281E0809367021092890210928A0213 |
:103E000010928B0210928C02109244021092450282 |
:103E100010924602109247021092480210924902F4 |
:103E200010924A0210924B02109234021092350204 |
:103E3000109236021092370210923C0210923D020C |
:103E400010923E0210923F02809120029091210236 |
:103E5000A0912202B09123028093380290933902FC |
:103E6000A0933A02B0933B028091280290912902DC |
:103E7000A0912A02B0912B028093400290934102BC |
:103E8000A0934202B09343021092910210929202C8 |
:103E9000109293021092940210928D0210928E0250 |
:103EA00010928F021092900202C010927902440F79 |
:103EB000551F4E5E594FFA01808191818C349105D6 |
:103EC0008CF0809178028F5F80937802893C60F05B |
:103ED0001092670288EC8093780210927702109219 |
:103EE000760202C01092780280916701815080931F |
:103EF0006701809167018F3F29F0809156028823E6 |
:103F000009F412C10E94A418E0913E06FF27EE0FAB |
:103F1000FF1FDF01AE5EB94F8D919C9160914D0600 |
:103F20007727E85DF94F2081318140914E06552772 |
:103F3000FC01E69FC001E79F900DF69F900D1124B4 |
:103F4000F901E49F9001E59F300DF49F300D11249D |
:103F5000820F931F9093620280936102E0913F066B |
:103F6000FF27EE0FFF1FDF01AE5EB94F8D919C91D1 |
:103F7000E85DF94F20813181FC01E69FC001E79F98 |
:103F8000900DF69F900D1124B901649F9001659FDB |
:103F9000300D749F300D1124820F931F9093640293 |
:103FA00080936302E0914106FF27EE0FFF1FEE5E54 |
:103FB000F94F80819181909581959F4F90936602F2 |
:103FC0008093650210918501612F772767FD7095B9 |
:103FD000872F972F0E943F3017FF06C020E030E068 |
:103FE00040E853E40E949A2F20E030E040E251E4A0 |
:103FF0000E949A2F20E030E040E85BE30E94B93055 |
:104000005B016C01609388067093890680938A0631 |
:1040100090938B0610918601612F772767FD70952D |
:10402000872F972F0E943F3017FF06C020E030E017 |
:1040300040E853E40E949A2F20E030EE4BE257E430 |
:104040000E94DC2F60937F06709380068093810628 |
:10405000909382068091460682FF0CC080E090E03B |
:10406000A0E0B0E080937F0690938006A093810645 |
:10407000B093820620E030E040E050E0C601B50198 |
:104080000E944930882364F480E090E0A0E0B0E032 |
:104090008093880690938906A0938A06B0938B0636 |
:1040A00020E030E040E050E060917F0670918006B3 |
:1040B00080918106909182060E944930882364F4A1 |
:1040C00080E090E0A0E0B0E080937F0690938006CF |
:1040D000A0938106B093820680915602882321F135 |
:1040E00010926602109265021092620210926102B2 |
:1040F00010926402109263028DEC9CECACECBDE378 |
:104100008093880690938906A0938A06B0938B06C5 |
:104110008AE097EDA3EABBE380937F069093800645 |
:10412000A0938106B09382068091FF0190910002D6 |
:104130008D54914008F4BCC0209124023091250296 |
:1041400040912602509127028091200290912102F5 |
:10415000A0912202B0912302B901681B790B7093E0 |
:10416000800260937F0220912C0230912D024091B9 |
:104170002E0250912F028091280290912902A09145 |
:104180002A02B0912B02281B390B30937E02209318 |
:104190007D02109200021092FF01673A710534F01F |
:1041A0008091100290911102019608C06A557F4FCC |
:1041B0004CF480911002909111020197909311029A |
:1041C00080931002273A310534F0809112029091C9 |
:1041D0001302019608C02A553F4F4CF480911202F9 |
:1041E0009091130201979093130280931202809191 |
:1041F000480290914902A0914A02B0914B02873A3D |
:104200009105A105B1054CF0809114029091150221 |
:104210000197909315028093140280914802909127 |
:104220004902A0914A02B0914B028A559F4FAF4F6D |
:10423000BF4F4CF480911402909115020196909317 |
:1042400015028093140210927A00809120029091BE |
:104250002102A0912202B091230280933802909310 |
:104260003902A0933A02B0933B02809128029091C8 |
:104270002902A0912A02B0912B02809340029093D0 |
:104280004102A0934202B093430280913002909188 |
:104290003102A0913202B091330280934802909390 |
:1042A0004902A0934A02B0934B028FEE80937A00AA |
:1042B000609120027091210280912202909123024C |
:1042C00020915206622E772488249924E090830658 |
:1042D000F0908406A40193010E9469310027F7FC45 |
:1042E0000095102F2E193F09400B510BCA01B9013F |
:1042F00020E130E040E050E00E94693159016A015C |
:10430000209385023093860240938702509388025F |
:10431000609128027091290280912A0290912B02CB |
:10432000E0908C06F0908D06A40193010E94693103 |
:104330000027F7FC0095102F2E193F09400B510B59 |
:10434000CA01B90120E130E040E050E00E9469314B |
:10435000209381023093820240938302509384021F |
:10436000F5EFAF16F1E0BF06F0E0CF06F0E0DF06B4 |
:104370002CF084EF91E0A0E0B0E00DC06CE0A61658 |
:104380006EEFB6066FEFC6066FEFD60664F48CE0EC |
:104390009EEFAFEFBFEF8093850290938602A093CC |
:1043A0008702B0938802253F71E0370770E0470726 |
:1043B00070E057072CF084EF91E0A0E0B0E009C076 |
:1043C0002C503E4F4F4F5F4F64F48CE09EEFAFEFA9 |
:1043D000BFEF8093810290938202A0938302B093F7 |
:1043E000840210927A008091340290913502A0915B |
:1043F0003602B091370220918502309186024091B9 |
:10440000870250918802821B930BA40BB50B8093FB |
:10441000340290933502A0933602B0933702809114 |
:104420003C0290913D02A0913E02B0913F0220914A |
:104430008102309182024091830250918402821B5A |
:10444000930BA40BB50B80933C0290933D02A09379 |
:104450003E02B0933F0280916502909166029C01FA |
:10446000442737FD4095542F2B833C834D835E8337 |
:104470002093890230938A0240938B0250938C02DE |
:1044800097FF03C0909581959F4F84973CF0809152 |
:10449000460684FD03C081E080937202A09044022E |
:1044A000B0904502C0904602D09047028B819C811B |
:1044B00097FF03C0909581959F4F7C010027F7FCE3 |
:1044C0000095102F20914F063327442755276B81E5 |
:1044D0007C818D819E810E9401319B01AC01C801CC |
:1044E000B7010E94013120E031E040E050E00E943D |
:1044F0006931442737FD4095542FA21AB30AC40AE4 |
:10450000D50AA0924402B0924502C0924602D092CF |
:1045100047028091440290914502A0914602B091D9 |
:10452000470281539547A040B04064F080E395E78F |
:10453000A0E0B0E08093440290934502A09346022D |
:10454000B09347028091440290914502A0914602A7 |
:10455000B0914702805D9A48AF4FBF4F64F480ED41 |
:104560009AE8AFEFBFEF8093440290934502A09387 |
:104570004602B09347028FEE80937A0080915002FA |
:1045800090915102892B09F4A1C08091460683FFC6 |
:104590009DC0609120027091210280912202909131 |
:1045A000230220E032E040E050E00E9469318901BE |
:1045B00037FF03C0109501951F4F6091280270913D |
:1045C000290280912A0290912B0220E032E040E003 |
:1045D00050E00E946931B90137FF03C070956195C1 |
:1045E0007F4F601771070CF4B80169317105A4F4AD |
:1045F00080917202882381F0809170029091710203 |
:10460000892B51F480915002909151029093530262 |
:104610008093520210927202209184013327629F8C |
:10462000C001639F900D729F900D112460E470E0B3 |
:104630000E943431A901461B570B141615060CF0C5 |
:104640003FC010927A0020917002309171022115C2 |
:10465000310561F500914402109145022091460216 |
:10466000309147028091540290915502FC01E49FE1 |
:10467000C001E59F900DF49F900D112460E270E061 |
:104680000E943431882777FD8095982F060F171FD9 |
:10469000281F391F009344021093450220934602BD |
:1046A000309347028FEE80937A0010C08FEE809394 |
:1046B0007A0021503040309371022093700206C07E |
:1046C00084EF91E090937102809370028091D605FF |
:1046D0008F5F8093D605809173028150809373021F |
:1046E0008F3F09F063C081E38093730260912002E1 |
:1046F000709121028091220290912302A4019301E2 |
:104700000E9469313093D8052093D7056091280223 |
:104710007091290280912A0290912B02A4019301A9 |
:104720000E9469313093DA052093D9058091830680 |
:10473000909184069093DC058093DB0580918C0634 |
:1047400090918D069093DE058093DD05809186061D |
:10475000909187069093E0058093DF058091680231 |
:10476000909169029093E2058093E10560914C027B |
:1047700070914D0280914E0290914F0220E032E004 |
:1047800040E050E00E9469313093E4052093E30556 |
:1047900029813A813093E6052093E5058091500206 |
:1047A000909151029093E8058093E7056091200273 |
:1047B00070912102809122029091230220907F0625 |
:1047C000309080064090810650908206E0907A06F4 |
:1047D000F0907B06609088067090890680908A062B |
:1047E00090908B060E943F30A20191010E94B93047 |
:1047F0005B016C010027F7FC0095102FC801B70181 |
:104800000E943F30A40193010E94B9309B01AC018A |
:10481000C601B5010E949A2F0E94223070937B0638 |
:1048200060937A06609128027091290280912A0291 |
:1048300090912B02E0907806F09079060E943F302C |
:10484000A20191010E94B9305B016C010027F7FCC5 |
:104850000095102FC801B7010E943F30A4019301B9 |
:104860000E94B9309B01AC01C601B5010E949A2F8C |
:104870000E942230709379066093780660918606D4 |
:1048800070918706A0903002B0903102C090320241 |
:10489000D0903302882777FD8095982F0E943F3073 |
:1048A0007B018C0120E030E040E05FE3C401B30114 |
:1048B0000E94B9309B01AC01C801B7010E94B93018 |
:1048C0007B018C01C601B5010E943F30A20191011C |
:1048D0000E94B9309B01AC01C801B7010E949A2F18 |
:1048E0000E942230709387066093860680917A0634 |
:1048F00090917B068150984034F080E098E090934E |
:104900007B0680937A0680917A0690917B06805090 |
:10491000984F34F480E098EF90937B0680937A066A |
:1049200080917806909179068150984034F080E02B |
:1049300098E090937906809378068091780690911C |
:1049400079068050984F34F480E098EF9093790680 |
:1049500080937806809186069091870681509840D2 |
:1049600034F080E098E090938706809386068091EB |
:104970008606909187068050984F34F480E098EF37 |
:10498000909387068093860680914606992780FF3C |
:10499000CFC02091810181FF0EC02233B0F48091FD |
:1049A000680290916902449790936B0280936A0227 |
:1049B000109257020DC080914B06289FC001112410 |
:1049C000449790936B0280936A0281E08093570230 |
:1049D00080915602882321F010926B0210926A0295 |
:1049E000209168023091690240916A0250916B02F5 |
:1049F000421753070CF09CC080915702882309F49A |
:104A000097C0241B350B809182019927AC01249F0C |
:104A1000C001259F900D349F900D112460E170E03E |
:104A20000E94343109811A81061B170B2091FD0168 |
:104A30003091FE01809180019927BC01269FC00121 |
:104A4000279F900D369F900D112468E070E00E9422 |
:104A50003431061B170B60914C0270914D0280910E |
:104A60004E0290914F0220E032E040E050E00E9480 |
:104A70006931CA01B90120918301332744275527A1 |
:104A80000E94013120E230E040E050E00E946931B4 |
:104A9000A9012E5C3F4F14F44EEC5FEF209174029D |
:104AA000309175028FE090E0FC012E9FC0012F9F96 |
:104AB000900D3E9F900D11249A014333510514F03F |
:104AC00022E330E0021B130B800F911F60E170E0C6 |
:104AD0000E9434317093750260937402809147068E |
:104AE0009927681779078CF429813A8128173907A3 |
:104AF0002CF0909375028093740207C049815A810B |
:104B000050937502409374020DC08091740290918D |
:104B1000750269817A816817790724F470937502A8 |
:104B20006093740280917402909175029A838983D4 |
:104B3000C0908606D0908706EB81FC81CE1ADF0AF2 |
:104B4000F5E6CF16D10424F064E6C62ED12C09C0B8 |
:104B50002CE9C2162FEFD20624F45CE9C52E5FEFD4 |
:104B6000D52E409078015090790160907A01709034 |
:104B70007B0160917A0670917B06209161023091F1 |
:104B800062024091950250919602241B350B621BE4 |
:104B9000730B882777FD8095982F0E943F309B01EB |
:104BA000AC01C301B2010E94B9300E94223070935F |
:104BB000B6036093B5038091B5039091B6038C0161 |
:104BC000222717FD2095322F809191029091920219 |
:104BD000A0919302B0919402080F191F2A1F3B1F46 |
:104BE00000939102109392022093930230939402C7 |
:104BF0001016110612061306ACF4C80117FF03C005 |
:104C0000909581959F4F60E071E00E9434316F5F15 |
:104C10007F4F882777FD8095982F061B170B280B51 |
:104C2000390B14C0C80117FF03C0909581959F4FA1 |
:104C300060E071E00E9434316F5F7F4F882777FD1D |
:104C40008095982F060F171F281F391F0093910278 |
:104C500010939202209393023093940280919102D8 |
:104C600090919202A0919302B091940281383EE318 |
:104C7000930730E0A30730E0B3072CF080E89EE311 |
:104C8000A0E0B0E009C08058914CAF4FBF4F64F432 |
:104C900080E891ECAFEFBFEF809391029093920286 |
:104CA000A0939302B09394026091B5037091B60300 |
:104CB00080907C0190907D01A0907E01B0907F015A |
:104CC000882777FD8095982F0E943F307B018C01CB |
:104CD000609191027091920280919302909194025E |
:104CE0000E943F309B01AC01C501B4010E94B93064 |
:104CF0009B01AC01C801B7010E949A2F0E9422308B |
:104D00009601260F371F89819A81280F391F222487 |
:104D10000A9714F441E0242E37FD02C0222019F036 |
:104D200040E050E008C080918506482F55272417A1 |
:104D300035070CF4A90180917C06E82FFF27F8873E |
:104D4000EF839F01E417F5070CF49A012093AF025B |
:104D500029813A81261B370BB9016C0D7D1D77FD2A |
:104D600002C0222019F080E090E007C08091850603 |
:104D70009927681779070CF4CB012F8138852817FC |
:104D800039070CF49C012093B00260917806709171 |
:104D9000790620916302309164024091970250910C |
:104DA0009802241B350B621B730B882777FD8095B7 |
:104DB000982F0E943F309B01AC01C301B2010E94B9 |
:104DC000B9300E9422307093AE026093AD028091A0 |
:104DD000AD029091AE028C01222717FD2095322F53 |
:104DE00080918D0290918E02A0918F02B0919002DD |
:104DF000080F191F2A1F3B1F00938D0210938E026C |
:104E000020938F023093900210161106120613069B |
:104E1000ACF4C80117FF03C0909581959F4F60E0E7 |
:104E200071E00E9434316F5F7F4F882777FD809556 |
:104E3000982F061B170B280B390B14C0C80117FF3E |
:104E400003C0909581959F4F60E071E00E943431DE |
:104E50006F5F7F4F882777FD8095982F060F171F6C |
:104E6000281F391F00938D0210938E0220938F020A |
:104E70003093900280918D0290918E02A0918F02CA |
:104E8000B091900281383EE3930730E0A30730E011 |
:104E9000B3072CF080E89EE3A0E0B0E009C08058A2 |
:104EA000914CAF4FBF4F64F480E891ECAFEFBFEF90 |
:104EB00080938D0290938E02A0938F02B093900204 |
:104EC0006091AD027091AE02882777FD8095982F92 |
:104ED0000E943F307B018C0160918D0270918E02A7 |
:104EE00080918F02909190020E943F309B01AC0113 |
:104EF000C501B4010E94B9309B01AC01C801B701E2 |
:104F00000E949A2F0E94223029813A81260F371F52 |
:104F10002C193D0937FD02C0222019F040E050E075 |
:104F200008C080918506482F5527241735070CF4B3 |
:104F3000A9012F813885241735070CF49A01209395 |
:104F4000E20389819A81861B970BBC016C197D094C |
:104F500077FD02C0222019F020E030E008C08091E7 |
:104F60008506282F3327621773070CF49B018F8166 |
:104F70009885821793070CF4C9018093B70328968C |
:104F80000FB6F894DEBF0FBECDBFDF91CF911F915A |
:104F90000F91FF90EF90DF90CF90BF90AF909F90D8 |
:104FA0008F907F906F905F904F903F902F900895DB |
:104FB00080919D0290919E02A0919F02B091A002CB |
:104FC0008093A5029093A602A093A702B093A80293 |
:104FD0008091A1029091A202A091A302B091A4029B |
:104FE0008093A9029093AA02A093AB02B093AC0263 |
:104FF00010929602109295021092980210929702C7 |
:105000000895CF92DF92EF92FF921F93CF93DF9399 |
:10501000CDB7DEB72A970FB6F894DEBF0FBECDBF6F |
:105020009C01162F40E0E62EFF246E010894C11C5F |
:10503000D11C14C0F701E41BF109EC0DFD1D3197E3 |
:10504000C9016AE070E00E942031805D8083C9015F |
:105050006AE070E00E9420319B014F5F411751F7D9 |
:1050600040E050E0212F332721503040BE016F5FD8 |
:105070007F4FA0E209C04F5F5F4FFB01E80FF91FB0 |
:105080008081803331F4A083842F9927821793077E |
:1050900094F390919B0620E0AE014F5F5F4F0BC0F1 |
:1050A000E92FE20FFF27DA01A20FB11D8C91E45125 |
:1050B000FC4F80832F5F211799F7910F90939B06E8 |
:1050C0002A960FB6F894DEBF0FBECDBFDF91CF9109 |
:1050D0001F91FF90EF90DF90CF900895CF92DF92D5 |
:1050E000EF92FF920F931F93CF93DF93CDB7DEB76D |
:1050F0002A970FB6F894DEBF0FBECDBF9C01F62EE7 |
:1051000097FD02C0EE2405C0309521953F4F81E008 |
:10511000E82E40E00F2D11276E010894C11CD11C10 |
:1051200014C0F801E41BF109EC0DFD1D3197C90114 |
:105130006AE070E00E943431805D8083C9016AE0DA |
:1051400070E00E9434319B014F5F4F1551F712C040 |
:105150002F5F3F4FFE013196E40FF51F80818033B2 |
:1051600019F480E2808308C0EE2071F031978DE25F |
:1051700080830AC020E030E0422F55278F2D9927E9 |
:1051800001974817590724F390919B0620E0AE0140 |
:105190004F5F5F4F0BC0E92FE20FFF27DA01A20F2D |
:1051A000B11D8C91E451FC4F80832F5F2F1599F72F |
:1051B0009F0D90939B062A960FB6F894DEBF0FBE04 |
:1051C000CDBFDF91CF911F910F91FF90EF90DF90B6 |
:1051D000CF900895DC010BC080919B06E82FFF273C |
:1051E000E451FC4F90838F5F80939B0611969C91B6 |
:1051F000992391F708950F931F9310929B06809126 |
:10520000BE0361E099270E9401288AE891E00E948C |
:10521000EA2867E080918E0690918F060E946E28A2 |
:1052200067E080919706909198060E946E280CE89E |
:1052300011E0C8010E94EA2867E0809193069091EE |
:1052400094060E946E2867E080919C0690919D06CE |
:105250000E946E28C8010E94EA2867E080919702A8 |
:10526000909198020E946E2867E08091950290913B |
:1052700096020E946E2880E991E00E94EA2867E089 |
:1052800080916302909164020E946E2867E0809191 |
:105290006102909162020E946E2884E991E00E946E |
:1052A000EA28109200018091EC038093C6001F91C0 |
:1052B0000F9108952F923F924F925F926F927F923B |
:1052C0008F929F92AF92BF92CF92DF92EF92FF9216 |
:1052D0000F931F93CF93DF93CDB7DEB728970FB609 |
:1052E000F894DEBF0FBECDBF80915C0290915D024D |
:1052F0008E37910574F18091BE03882309F446C06E |
:1053000080919206882309F041C080919D0290917E |
:105310009E02A0919F02B091A0028093A50290935B |
:10532000A602A093A702B093A8028091A102909137 |
:10533000A202A091A302B091A4028093A90290932B |
:10534000AA02A093AB02B093AC0281E080939206D4 |
:105350001DC08D379105D4F41092A5021092A602BB |
:105360001092A7021092A8021092A9021092AA020B |
:105370001092AB021092AC0210929602109295021B |
:105380001092980210929702109292068091B102A8 |
:10539000882309F4FEC01092B10281EB92E00E94D2 |
:1053A000472B8091B903882309F4F1C01092B90307 |
:1053B0008091BE03882331F088B194E0892788B9B1 |
:1053C000439805C088B198E0892788B942988091B0 |
:1053D000BF039091C003A091C103B091C203809319 |
:1053E0009D0290939E02A0939F02B093A0022091F1 |
:1053F000C3033091C4034091C5035091C603209369 |
:10540000A1023093A2024093A3025093A402E09021 |
:10541000A502F090A6020091A7021091A802E81A36 |
:10542000F90A0A0B1B0BE0929706F092980600937C |
:10543000990610939A062090A9023090AA024090F3 |
:10544000AB025090AC02221A330A440A550A209249 |
:105450008E0630928F06409290065092910680916F |
:10546000CF039091D003A091D103B091D203222712 |
:105470003327A901281B390B4A0B5B0B2D833E8375 |
:105480004F83588720939C0630939D0640939E0639 |
:1054900050939F068091D3039091D403A091D5039C |
:1054A000B091D60322273327A901281B390B4A0BB9 |
:1054B0005B0B29833A834B835C8320939306309361 |
:1054C0009406409395065093960680919206882301 |
:1054D00009F455C0A0905802B0905902CC24B7FCF2 |
:1054E000C094DC2C60905A0270905B02882477FC98 |
:1054F0008094982CC801B701A60195010E94013142 |
:1055000020E032E040E050E00E94693179018A01F8 |
:105510006D817E818F819885A40193010E94013164 |
:1055200020E830E040E050E00E946931E20EF31ED6 |
:10553000F0929602E0929502C201B101A601950196 |
:105540000E94013120E032E040E050E00E946931E9 |
:1055500079018A0169817A818B819C81A4019301FF |
:105560000E94013120E830E040E050E00E946931C3 |
:10557000E20EF31EF0929802E092970208C0109299 |
:1055800096021092950210929802109297020E9431 |
:10559000FB2828960FB6F894DEBF0FBECDBFDF9173 |
:1055A000CF911F910F91FF90EF90DF90CF90BF9020 |
:1055B000AF909F908F907F906F905F904F903F90B3 |
:1055C0002F900895CF93DF939091A006E92FFF27A6 |
:1055D000EF55F94F8083892F8F5F8093A00681302C |
:1055E00031F48091A106853B09F44EC04BC0823056 |
:1055F00031F48091A206823609F446C043C0863059 |
:1056000008F442C04091A506A82FBB27842F9927F4 |
:105610000896A817B907C4F190E050E0C3EAD6E0B5 |
:10562000FD0132979F012F55394F03C08991980F83 |
:10563000590FC217D307D1F7EF55F94F808198174B |
:1056400009F5A056B94F8C915817E1F48091A30643 |
:105650008093B2028091A4068093B3024093B40277 |
:1056600020E030E0A7EAB6E0E5EBF2E0552704C021 |
:105670008D9181932F5F3F4F24173507C8F381E049 |
:105680008093B1021092A006DF91CF910895CF933D |
:10569000DF93EC012981213009F080C08A818630B6 |
:1056A00009F07CC08C819D81AE81BF818093BA035B |
:1056B0009093BB03A093BC03B093BD038E858093EE |
:1056C000BE03FE01349684859585A685B7858093B3 |
:1056D000BF039093C003A093C103B093C20380891A |
:1056E0009189A289B3898093C3039093C403A09343 |
:1056F000C503B093C60384899589A689B789809329 |
:10570000C7039093C803A093C903B093CA03808DC5 |
:10571000918DA28DB38D8093CB039093CC03A093F6 |
:10572000CD03B093CE03848D958DA68DB78D8093D8 |
:10573000CF039093D003A093D103B093D20380A161 |
:1057400091A1A2A1B3A18093D3039093D403A0937A |
:10575000D503B093D60384A195A1A6A1B7A1809348 |
:10576000D7039093D803A093D903B093DA0380A50D |
:1057700091A5A2A5B3A58093DB039093DC03A0932E |
:10578000DD03B093DE0388A999279093E00380930B |
:10579000DF038BA98093E1032093B903DF91CF91BD |
:1057A00008950F931F93CF93DF93EC01898199277D |
:1057B0009F938F9387E991E09F938F930E94322C60 |
:1057C0008A8199279F938F9384EA91E09F938F9387 |
:1057D0000E94322C8B8199279F938F938EEA91E0C0 |
:1057E0009F938F930E94322C89EB91E09F938F932C |
:1057F0000E94322C00E010E08DB79EB70E960FB6D7 |
:10580000F8949EBF0FBE8DBF11C0FE01E90FF11DC0 |
:10581000848199279F938F9380EC91E09F938F933E |
:105820000E94322C0F900F900F900F90902F0F5FCF |
:105830001F4F8B81981748F386EC91E00E94522C01 |
:10584000DF91CF911F910F910895FC01415050407D |
:1058500030F001900616D1F73197CF0108958827CF |
:1058600099270895CF93DF93CDB7DEB722970FB670 |
:10587000F894DEBF0FBECDBFFE01379661917191E6 |
:10588000FA83E983AF018091A3079091A4070E9456 |
:10589000852C22960FB6F894DEBF0FBECDBFDF91E8 |
:1058A000CF9108950F931F93CF93DF938C01E091D5 |
:1058B000A307F091A407838181FF1FC0C0E0D0E05F |
:1058C0000AC0FD0120853185BD01F9010995892BAB |
:1058D00011F0CFEFDFEFF80181918F01A091A307C5 |
:1058E000B091A407882369F7FD0120853185BD01AA |
:1058F0008AE0F9010995892B11F0CFEFDFEFCE0196 |
:10590000DF91CF911F910F9108952F923F924F9267 |
:105910005F926F927F928F929F92AF92BF92CF923F |
:10592000DF92EF92FF920F931F93CF93DF93CDB748 |
:10593000DEB764970FB6F894DEBF0FBECDBFCC24A0 |
:10594000DD2476011C017C8B6B8B2A01FC01178204 |
:105950001682838181FD03C08FEF9FEF85C2AA2449 |
:10596000BB246FC2A0FE54C28A8980538A30E8F4F7 |
:10597000FA89F03341F42D85222329F4A3FC03C0D6 |
:1059800080E091E06FC08AE0ED85E802C00111245B |
:10599000FA89F80FF053FD87F7FF02C02FE72D8734 |
:1059A000A3FC49C23D853E8746C2C5018870907000 |
:1059B000A3FE05C0ED85EE2311F4F1E0FD872A89F1 |
:1059C000283624F525360CF05BC0233509F480C059 |
:1059D00024358CF42B32C1F12C3234F42032C1F155 |
:1059E000233209F00AC23CC03A893D32B1F13E325D |
:1059F00009F003C23AC08A89833609F449C0843663 |
:105A00000CF081C0883509F0F8C11BC0EA89E03785 |
:105A100009F4A3C0E13744F4EC3669F1EF3671F0D4 |
:105A2000E93609F0EAC16FC0FA89F53709F49DC07B |
:105A3000F83739F0F33709F0E0C134C028E0298B9A |
:105A400094C030E1398B91C080E190E0A82AB92A56 |
:105A5000E0E2F0E0AE2ABF2AEEC120E830E00DC05F |
:105A600080E490E0A82AB92AE6C1E8E0F0E0AE2A96 |
:105A7000BF2A1D86E0C124E030E0A22AB32ADBC1A0 |
:105A80003FE3C32E3E8531503E8783E68A8B41C17A |
:105A9000F201C080FE85F150FE8722E030E0420E28 |
:105AA000531E37C1F201C080D180892B49F0FD859A |
:105AB0006F2F772767FD7095C6010E94612F19C06F |
:105AC000F60101900020E9F73197EC19E98B12C03B |
:105AD000F201C080D180892B49F0FD856F2F772797 |
:105AE00067FD7095C6010E94562F03C0C6010E9433 |
:105AF0004D2F898B22E030E0420E531E3E8589896E |
:105B0000381B3E8706C1A2FE08C0F2018081918148 |
:105B1000A281B38124E030E009C0F201808191814B |
:105B2000AA2797FDA095BA2F22E030E0420E531E1F |
:105B30006C017D01B7FF0CC082E090E0A82AB92A71 |
:105B4000F094E094D094C094C11CD11CE11CF11CD1 |
:105B5000EFEBFFEFAE22BF2221C020E430E0A22A0B |
:105B6000B32A38E73A8B80E1898BA2FE08C0F201A4 |
:105B700080819181A281B38124E030E007C0F201ED |
:105B800080819181AA27BB2722E030E0420E531E7C |
:105B90006C017D018FEC9FEFA822B922870176016D |
:105BA000FE013196F88BEF87F9896F2E77248824D0 |
:105BB0009924C801B701A40193010E9447316A30BA |
:105BC00024F02A89620F615201C0605DEF85F88977 |
:105BD0006193F88BEF87C801B701A40193010E947C |
:105BE000473179018A01211531054105510509F730 |
:105BF000CC24DD247601CE010196CF84C81AC501DC |
:105C000082739070892B19F0FE85F150FE87A6FEF5 |
:105C100009C02989203111F482E001C081E03E856C |
:105C2000381B3E8728E0822E912C8A209B20A3FEE1 |
:105C300018C08D85282F332727FD30958C2D992767 |
:105C4000821793073CF0E7EFFFEFAE22BF228824D4 |
:105C5000992407C0FD85FC19FD872E852F1B2E87F3 |
:105C600003C03E853C193E87C50180789170892B21 |
:105C700069F48E8506C0B10180E290E00E946C2F2D |
:105C8000812F182F11501816B4F31E87A1FE04C0DF |
:105C9000B1018DE290E00BC0A4FE04C0B1018BE223 |
:105CA00090E005C0A5FE05C0B10180E290E00E9431 |
:105CB0006C2FA6FE10C0B10180E390E00E946C2F13 |
:105CC0008989803141F4B101EA898E2F992787FDB6 |
:105CD00090950E946C2FB0FE0DC08E8506C0B1015C |
:105CE00080E390E00E946C2F812F182F115018161E |
:105CF000B4F31E87892869F02D8506C0B10180E3C1 |
:105D000090E00E946C2F212F122F11501216B4F325 |
:105D10001D8790E8692E712C6A207B20A7FC0DC09E |
:105D20008E8506C0B10180E290E00E946C2F812F29 |
:105D3000182F11501816B4F31E87FA89F33641F460 |
:105D4000B1018C2D992787FD90950E946C2F45C03D |
:105D50002A892337B1F446015601198909C0F50192 |
:105D600081915F01B101992787FD90950E946C2F69 |
:105D70001150A8F76401F989CF0ED11C2FEF298BA0 |
:105D80002CC03A89333519F00F8518891FC0460198 |
:105D90008601B98808C0F8018491B10199270E9451 |
:105DA0006C2F0F5F1F4FBA94FFEFBF16A1F764016E |
:105DB0002989C20ED11CF98B10C0F80182918F0184 |
:105DC000B101992787FD90950E946C2FCE01019615 |
:105DD0000817190791F7188B0F876728B1F08E8580 |
:105DE00006C0B10180E290E00E946C2F812F182F35 |
:105DF00011501816B4F31E8708C0B101FA898F2F0D |
:105E0000992787FD90950E946C2FAA24BB2413C06C |
:105E10002A89253241F43AE0398B1E861D8681E0BD |
:105E2000A82EB12C08C0B101EA898E2F992787FDD1 |
:105E300090950E946C2F2B893C892F5F3F4F3C8BA4 |
:105E40002B8BF101838183FF04C0EB89FC89F491E2 |
:105E500003C0EB89FC89F081FA8B2A89222309F09F |
:105E600081CDF1018681978164960FB6F894DEBFEB |
:105E70000FBECDBFDF91CF911F910F91FF90EF909B |
:105E8000DF90CF90BF90AF909F908F907F906F905A |
:105E90005F904F903F902F900895FC010590002057 |
:105EA000E9F7809590958E0F9F1F0895FC0105904E |
:105EB000615070400110D8F7809590958E0F9F1F0C |
:105EC0000895FC016150704001900110D8F7809551 |
:105ED00090958E0F9F1F08950F931F93CF93DF937D |
:105EE0008C01EB018B81992781FF1BC082FF0DC0C4 |
:105EF0002E813F818C819D812817390764F4E881C8 |
:105F0000F9810193F983E88306C0E885F985802F3C |
:105F10000995892B31F48E819F8101969F838E8311 |
:105F200002C00FEF1FEFC801DF91CF911F910F91BA |
:105F300008955058192EEFD001D0D2C0BA17620779 |
:105F4000730784079507B1F188F40EF410940B2EB3 |
:105F5000BA2FA02D062E622F202D072E732F302D45 |
:105F6000082E842F402D092E952F502DFF275523C5 |
:105F7000B9F0591B49F0573E98F04695379527954B |
:105F8000A795F0405395C9F776F0BA0F621F731FBB |
:105F9000841F30F4879577956795B795F040939572 |
:105FA00017FA0F2E0895BF1BBB27BA0B620B730B9A |
:105FB000840BF6CFDEF6DBC0AED001D091C0552306 |
:105FC00059F0992369F09F575F57951B33F442F4BA |
:105FD000903811F4915805C09BC091589F3F09F427 |
:105FE000C6C0BB27112462177307840730F4660FFD |
:105FF000771F881FBB1F915098F311D00F920FD0BD |
:106000000F920DD0A0E82617370748071B0609F0A6 |
:10601000A048BA2F602D7F918F9100240895A0E8A9 |
:106020000024621773078407B10528F0621B730B05 |
:10603000840BB1090A2A660F771F881FBB1FA6951C |
:1060400081F7089597FB73D09F3738F0FEE9F91B6D |
:10605000982F872F762F6B2F05C086C09695879532 |
:1060600077956795F150D0F73EF4909580957095AF |
:1060700061957F4F8F4F9F4F0895E89403C097FB22 |
:106080000EF4F3DFB62F672F782F892F9EE90024B7 |
:1060900027C00ED05EF004C00BD026F001C008D09F |
:1060A00019F020F48FEF089580E0089581E00895BD |
:1060B00097FB092E052600F8689430D0E89407FC79 |
:1060C00007C0621773078407950721F008F400944E |
:1060D0000794989408959A95BB0F661F771F881FA1 |
:1060E00011249923A1F08823B2F79F3F59F0BB0FE9 |
:1060F00048F421F4002011F460FF04C06F5F7F4F6B |
:106100008F4F9F4F881F9795879597F908952CC0BB |
:106110009FEF80EC0895052E092607FA440F551FBE |
:106120005F3F79F0AA27A51708F051E04795880F3F |
:10613000991F9F3F31F0BB27B91708F091E0879571 |
:1061400008959F919F911124E3CF97FB880F991F8A |
:106150009F3F31F0BB27B91708F091E0879508956C |
:106160009F919F911124D4CF66277727882799275D |
:106170000895D1DF01D0B4CF992339F0552329F008 |
:106180009F575F57950F13F49AF1F1CF91589F3FA6 |
:10619000E1F3629FA12D0F92BB27639FA00DB11D5C |
:1061A000EE27729FA00DB11DEE1FAF93AA27649F2B |
:1061B000B00DE11D739FB00DE11DAA1F6627829FE0 |
:1061C000B00DE11DA61F5527749FE00DA11D551FA1 |
:1061D000839FE00DA11D561F849FA00D511D852F8B |
:1061E0007A2F6E2F1F900F9088231AF4939539F40D |
:1061F0008FCF000C111CBB1F661F771F881F012843 |
:106200000895629FD001739FF001829FE00DF11D00 |
:10621000649FE00DF11D929FF00D839FF00D749F20 |
:10622000F00D659FF00D9927729FB00DE11DF91FCC |
:10623000639FB00DE11DF91FBD01CF011124089529 |
:10624000AA1BBB1B51E107C0AA1FBB1FA617B7079C |
:1062500010F0A61BB70B881F991F5A95A9F78095B8 |
:106260009095BC01CD01089597FB092E07260AD011 |
:1062700077FD04D0E5DF06D000201AF47095619513 |
:106280007F4F0895F6F7909581959F4F0895A1E26D |
:106290001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FA0 |
:1062A000FF1FA217B307E407F50720F0A21BB30BEB |
:1062B000E40BF50B661F771F881F991F1A9469F767 |
:1062C00060957095809590959B01AC01BD01CF01C3 |
:1062D000089597FB092E05260ED057FD04D0D7DF71 |
:1062E0000AD0001C38F450954095309521953F4FC9 |
:1062F0004F4F5F4F0895F6F7909580957095619593 |
:106300007F4F8F4F9F4F0895F999FECFB2BDA1BD2A |
:10631000F89A119600B40895F999FECFB2BDA1BDC7 |
:1063200000BC11960FB6F894FA9AF99A0FBE089528 |
:1063300001640A016400007D0000FF030102030400 |
:1063400005060708090A48616C6C6F2057656C7474 |
:10635000000000000000000000000000000000003D |
:10636000000000000000000000000000000000002D |
:10637000000000000000000000000000000000001D |
:10638000000000000000000000000000000000000D |
:106390000000000000000B014B616D6572610000A0 |
:1063A0004E6F726D616C00000000803F17B7D138EE |
:1063B00030FB103A403296020A642000207C200014 |
:1063C000202320000D0A004D7367436C6173733DF9 |
:1063D000257520004D736749643D257520004C6587 |
:1063E0006E6774683D25752000446174613D20002E |
:0863F0002530325820000D0099 |
:00000001FF |
/branches/mixer/V0.60_GPS_BETA_martosi/GPS.c |
---|
0,0 → 1,290 |
//------------------------------------------------------------------------------ |
// _ _ |
// | | | | |
// ___ _ __ ___ ___ _ _ ___| |_ ___ ___| |__ |
// / _ \ '_ ` _ \/ __| | | / __| __/ _ \/ __| '_ \. |
// | __/ | | | | \__ \ |_| \__ \ || __/ (__| | | | |
// \___|_| |_| |_|___/\__, |___/\__\___|\___|_| |_| |
// __/ | |
// |___/ Engineering |
// |
// Filename: GPS.c |
// Description: |
// |
// Author: Martin Steppuhn |
// History: 15.06.2007 Initial version |
// |
//------------------------------------------------------------------------------ |
/**** Includes ****************************************************************/ |
#include "std_c.h" |
#include "main.h" |
#include "fc.h" |
#include "gps_ubx.h" |
/**** Preprocessing directives (#define) **************************************/ |
/**** Type definitions (typedef) **********************************************/ |
/**** Global constants ********************************************************/ |
/**** Global variables ********************************************************/ |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
/**** Local constants ********************************************************/ |
/**** Local variables *********************************************************/ |
signed int test_nick = 0; |
signed int test_roll = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsAktuell_Z = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
long gps_dx; |
long gps_dy; |
long gps_dz; |
long gps_vx; |
long gps_vy; |
long gps_vz; |
bool gps_hold; |
uint8 print_pos; |
/**** Local function prototypes ***********************************************/ |
void print_uint16(uint16 value,uint8 width); |
void print_int16(int16 value,uint8 width); |
void print_string(char *s); |
//------------------------------------------------------------------------------ |
// Name: GPS_Neutral |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
GPS_Nick = 0; |
GPS_Roll = 0; |
// LED_GPS_DATA_OFF; |
//LED_GPS_FIX_OFF; |
//LED_GPS_DATA_ON; |
} |
//------------------------------------------------------------------------------ |
// Name: gps_trace |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void gps_trace(void) |
{ |
print_pos = 0; |
print_uint16(nav_sol.gpsfix,1); |
print_string(" "); |
print_int16(gps_dy,7); |
print_int16(gps_dx,7); |
print_string(" | "); |
print_int16(gps_vy,7); |
print_int16(gps_vx,7); |
print_string(" | "); |
print_int16(GPS_Roll,7); |
print_int16(GPS_Nick,7); |
print_string(" # "); |
print_int16(StickRoll,7); |
print_int16(StickNick,7); |
print_string("\r\n"); |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; // Start |
} |
//------------------------------------------------------------------------------ |
// Name: gps_main |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void GPS_Main(void) |
{ |
if((Poti3 > 125) && (nav_sol.gpsfix) && (gps_hold == false)) // Enable Hold |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
gps_hold = true; |
} |
if(Poti3 < 125) // Disable Hold |
{ |
GpsZiel_X = 0; |
GpsZiel_Y = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
gps_hold = false; |
} |
if(ubx.update) |
{ |
ubx.update = false; |
ubx_decode(&ubx); |
if(nav_sol.update) |
{ |
//trace_nav_sol(); |
nav_sol.update = false; |
if(nav_sol.gpsfix) |
{ |
LED_GPS_FIX_TOGGLE; |
LED_GPS_DATA_OFF; |
} |
else |
{ |
LED_GPS_DATA_TOGGLE; |
LED_GPS_FIX_OFF; |
} |
//=== new Position ==================== |
GpsAktuell_X = nav_sol.ecef_x; |
GpsAktuell_Y = nav_sol.ecef_y; |
gps_dx = GpsZiel_X - GpsAktuell_X; // Süden + |
gps_dy = GpsZiel_Y - GpsAktuell_Y; // Osten + |
gps_vx = -nav_sol.ecefvx; // cm/s ECEF X velocity |
gps_vy = -nav_sol.ecefvy; // cm/s ECEF Y velocity |
if(gps_hold) |
{ |
GPS_Nick = ((gps_dx * Poti1) / 512) + ((gps_vx * Poti2) / 128); |
GPS_Roll = ((gps_dy * Poti1) / 512) + ((gps_vy * Poti2) / 128); |
} |
else |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
//===================================== |
} |
gps_trace(); |
} |
} |
//============================================================================== |
//============================================================================== |
//============================================================================== |
// |
//============================================================================== |
//============================================================================== |
//============================================================================== |
//------------------------------------------------------------------------------ |
// Name: |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void print_uint16(uint16 value,uint8 width) |
{ |
uint8 i,s[10]; |
for (i = 0; i < width; i++) |
{ |
s[width - i - 1] = '0' + (value % 10); |
value /= 10; |
} |
for (i=0; i<(width - 1); i++) // Overwrite trailing Zeros |
{ |
if (s[i] == '0') s[i] = ' '; |
else break; |
} |
for (i=0; i<width; i++) SendeBuffer[print_pos++] = s[i]; // Output String |
// for (i=0; i<width; i++) putchar(s[i]); // Output String |
} |
//------------------------------------------------------------------------------ |
// Name: |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void print_int16(int16 value,uint8 width) |
{ |
uint8 i,s[10]; |
bool neg; |
neg = false; |
if(value < 0) { value = -value; neg = true; } |
for (i = 0; i < width; i++) |
{ |
s[width - i - 1] = '0' + (value % 10); |
value /= 10; |
} |
for (i=0; i<(width - 1); i++) // Overwrite trailing Zeros |
{ |
if (s[i] == '0') s[i] = ' '; |
else |
{ |
if(neg) s[i-1] = '-'; |
break; |
} |
} |
for (i=0; i<width; i++) SendeBuffer[print_pos++] = s[i]; // Output String |
// for (i=0; i<width; i++) putchar(s[i]); // Output String |
} |
//------------------------------------------------------------------------------ |
// Name: |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void print_string(char *s) |
{ |
while(*s) |
{ |
SendeBuffer[print_pos++] = *s; |
s++; |
} |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/mixer/V0.60_GPS_BETA_martosi/Settings.h |
---|
--- _Settings.h (nonexistent) |
+++ _Settings.h (revision 1109) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 16 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/mixer/V0.60_GPS_BETA_martosi/analog.c |
---|
0,0 → 1,155 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 AccumulateNick = 0, AccumulateRoll = 0, AccumulateGier = 0; |
volatile int accumulate_AccRoll = 0,accumulate_AccNick = 0,accumulate_AccHoch = 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; |
for(off=0; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
DruckOffsetSetting = off; |
Delay_ms(200); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
signed int wert; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
wert = (signed int) AdNeutralGier - ADC; |
AccumulateGier += wert; // |
MessanzahlGier++; |
Mess_Integral_Gier += wert;// / 16; |
Mess_Integral_Gier2 += wert; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
wert = (signed int) ADC - AdNeutralRoll; |
Mess_IntegralRoll += wert; |
Mess_IntegralRoll2 += wert; |
if(ADC < 10) wert = -700; |
if(ADC > 1000) wert = +700; |
AccumulateRoll += wert; |
MessanzahlRoll++; |
kanal = 2; |
break; |
case 2: |
wert = (signed int) ADC - AdNeutralNick; |
Mess_IntegralNick += wert; |
Mess_IntegralNick2 += wert; |
if(ADC < 10) wert = -700; |
if(ADC > 1000) wert = +700; |
AccumulateNick += wert; |
MessanzahlNick++; |
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; |
accumulate_AccRoll += Aktuell_ay; |
messanzahl_AccRoll++; |
kanal = 7; |
break; |
case 5: |
Aktuell_ay = ADC - NeutralAccX; |
accumulate_AccNick += Aktuell_ay; |
messanzahl_AccNick++; |
kanal = 5; |
state = 6; |
break; |
case 6: |
accumulate_AccHoch = (signed int) ADC - NeutralAccZ; |
accumulate_AccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(accumulate_AccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(accumulate_AccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += accumulate_AccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
// Mess_Integral_Hoch -= Mess_Integral_Hoch / 512; // dämfen |
/* if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
kanal = 3; |
state = 7; |
} |
else |
{ |
kanal = 0; |
state = 0; |
}*/ |
kanal = 3; |
state = 7; |
break; |
case 7: |
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; |
ANALOG_ON; |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/analog.h |
---|
0,0 → 1,23 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AccumulateNick, AccumulateRoll, AccumulateGier,accumulate_AccRoll,accumulate_AccNick,accumulate_AccHoch; |
extern volatile char MessanzahlNick, MessanzahlRoll, MessanzahlGier,messanzahl_AccNick, messanzahl_AccRoll,messanzahl_AccHoch; |
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 unsigned int ReadADC(unsigned char adc_input); |
extern void ADC_Init(void); |
extern void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/mixer/V0.60_GPS_BETA_martosi/eeprom.c |
---|
--- fc.c (nonexistent) |
+++ fc.c (revision 1109) |
@@ -0,0 +1,812 @@ |
+/*####################################################################################### |
+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" |
+ |
+unsigned char h,m,s; |
+volatile unsigned char Timeout = 0; |
+volatile int MesswertNick,MesswertRoll,MesswertGier; |
+volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 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 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 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; |
+ |
+float GyroFaktor; |
+float IntegralFaktor; |
+ |
+volatile int DiffNick,DiffRoll; |
+int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
+volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
+unsigned char MotorWert[5]; |
+volatile unsigned char SenderOkay = 0; |
+int StickNick = 0,StickRoll = 0,StickGier = 0; |
+char MotorenEin = 0; |
+int HoehenWert = 0; |
+int SollHoehe = 0; |
+ |
+float Kp = FAKTOR_P; |
+float Ki = FAKTOR_I; |
+ |
+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 = 50; // 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_ServoNickControl = 100; |
+struct mk_param_struct EE_Parameter; |
+ |
+void Piep(unsigned char Anzahl) |
+{ |
+ while(Anzahl--) |
+ { |
+ if(MotorenEin) return; //auf keinen Fall im Flug! |
+ beeptime = 100; |
+ Delay_ms(250); |
+ } |
+} |
+ |
+//############################################################################ |
+// Nullwerte ermitteln |
+void SetNeutral(void) |
+//############################################################################ |
+{ |
+ unsigned int timer; |
+ NeutralAccX = 0; |
+ NeutralAccY = 0; |
+ NeutralAccZ = 0; |
+ AdNeutralNick = 0; |
+ AdNeutralRoll = 0; |
+ AdNeutralGier = 0; |
+ CalibrierMittelwert(); |
+ timer = SetDelay(5); |
+ while (!CheckDelay(timer)); |
+ CalibrierMittelwert(); |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ AdNeutralNick= abs(MesswertNick); |
+ AdNeutralRoll= abs(MesswertRoll); |
+ AdNeutralGier= abs(MesswertGier); |
+ NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
+ NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
+ NeutralAccZ = Aktuell_az; |
+ |
+ 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; |
+} |
+ |
+//############################################################################ |
+// Bildet den Mittelwert aus den Messwerten |
+void Mittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((long)Mittelwert_AccNick * 7 + ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick)) / 8L; |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 7 + ((ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll)) / 8L; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 7 + ((long)accumulate_AccHoch) / messanzahl_AccHoch) / 8L; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ Integral_Gier = Mess_Integral_Gier; |
+// Integral_Gier2 = Mess_Integral_Gier2; |
+ IntegralNick = Mess_IntegralNick; |
+ IntegralRoll = Mess_IntegralRoll; |
+ IntegralNick2 = Mess_IntegralNick2; |
+ IntegralRoll2 = Mess_IntegralRoll2; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ |
+//------------------------------------------------------------------------------ |
+ 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; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick); |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = (ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)accumulate_AccHoch) / messanzahl_AccHoch; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ // 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; |
+} |
+ |
+//############################################################################ |
+// 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(); |
+} |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + 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 = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 70; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 2; // 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 = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
+ EE_Parameter.Gyro_P = 120; //80 // Wert : 0-250 |
+ EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
+ EE_Parameter.UnterspannungsWarnung = 90; // 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 = 5; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.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; |
+ memcpy(EE_Parameter.Name, "Normal\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.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
+ EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
+ EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
+ EE_Parameter.UnterspannungsWarnung = 90; // 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 = 5; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 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; |
+ memcpy(EE_Parameter.Name, "Kamera\0", 12); |
+} |
+ |
+ |
+//############################################################################ |
+// 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); |
+ |
+ unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
+ unsigned char ServoNickCompInvert; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
+ unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
+ |
+ |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,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 int IntegralFehlerNick = 0; |
+ static int 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; |
+ Mittelwert(); |
+ |
+ GRN_ON; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gaswert ermitteln |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
+ if(GasMischanteil < 0) GasMischanteil = 0; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang schlecht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay < 100) |
+ { |
+ if(!PcZugriff) beeptime = 500; |
+ 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; |
+/* Poti1 = 65; |
+ Poti2 = 48; |
+ Poti3 = 0; |
+*/ } |
+ else MotorenEin = 0; |
+ } |
+ else |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang gut |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay > 140) |
+ { |
+ Notlandung = 0; |
+ RcLostTimer = EE_Parameter.NotGasZeit * 50; |
+ if(GasMischanteil > 40) |
+ { |
+ if(modell_fliegt < 0xffff) modell_fliegt++; |
+ } |
+ if((modell_fliegt < 200) || (GasMischanteil < 40)) |
+ { |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ } |
+ if((GasMischanteil > 200) && MotorenEin == 0) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// auf Nullwerte kalibrieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
+ { |
+ unsigned char setting; |
+ if(++delay_neutral > 200) // nicht sofort |
+ { |
+ GRN_OFF; |
+ SetNeutral(); |
+ 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) |
+ { |
+ 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 |
+ } |
+ ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
+ Piep(GetActiveParamSetNumber()); |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ } |
+ } |
+ else delay_neutral = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gas ist unten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(GasMischanteil < 35) |
+ { |
+ // Starten |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Einschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(++delay_einschalten > 200) |
+ { |
+ delay_einschalten = 200; |
+ modell_fliegt = 1; |
+ MotorenEin = 1; |
+ sollGier = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ Mess_IntegralNick = 0; |
+ Mess_IntegralRoll = 0; |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ } |
+ } |
+ else delay_einschalten = 0; |
+ //Auf Neutralwerte setzen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Auschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
+ { |
+ if(++delay_ausschalten > 200) // nicht sofort |
+ { |
+ MotorenEin = 0; |
+ delay_ausschalten = 200; |
+ modell_fliegt = 0; |
+ } |
+ } |
+ else delay_ausschalten = 0; |
+ } |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// neue Werte von der Funke |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!NewPpmData-- || Notlandung) |
+ { |
+ ParameterZuordnung(); |
+ StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
+ StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
+ StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
+ StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
+ StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
+ |
+ GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
+ IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
+ |
+ if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
+ if(GyroFaktor < 0) GyroFaktor = 0; |
+ if(IntegralFaktor < 0) IntegralFaktor = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Bei Empfangsausfall im Flug |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Notlandung) |
+ { |
+ StickGier = 0; |
+ StickNick = 0; |
+ StickRoll = 0; |
+ GyroFaktor = 0.1; |
+ IntegralFaktor = 0.005; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gyro-Drift kompensieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define DRIFT_FAKTOR 3 |
+ if(ZaehlMessungen >= 1000 / DRIFT_FAKTOR) |
+ { |
+ IntegralFehlerNick = IntegralNick2 - IntegralNick; |
+ IntegralFehlerRoll = IntegralRoll2 - IntegralRoll; |
+ ZaehlMessungen = 0; |
+ if(IntegralFehlerNick > 500/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -500/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 500/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -500/DRIFT_FAKTOR) AdNeutralRoll--; |
+ if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR) AdNeutralGier--; |
+ if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ Mess_Integral_Gier2 = Integral_Gier; |
+ ANALOG_ON; // ADC einschalten |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Integrale auf ACC-Signal abgleichen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick) / 16; |
+ tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll) / 16; |
+#define AUSGLEICH 500 |
+ 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; |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick -= tmp_long; |
+ Mess_IntegralRoll -= tmp_long2; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ sollGier = StickGier; |
+ if(abs(StickGier) > 35) |
+ { |
+ if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
+ } |
+ tmp_int = EE_Parameter.Gier_P * (sollGier * abs(sollGier)) / 256; // expo |
+ Mess_Integral_Gier -= tmp_int; |
+ if(Mess_Integral_Gier > 30000) Mess_Integral_Gier = 30000; // begrenzen |
+ if(Mess_Integral_Gier <-30000) Mess_Integral_Gier =-30000; |
+ |
+ ANALOG_ON; // ADC einschalten |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Kompass |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ //KompassValue = 12; |
+ 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) |
+ { |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ if(!SignalSchlecht) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
+ ANALOG_ON; // ADC einschalten |
+ if(SignalSchlecht) SignalSchlecht--; |
+ } |
+ else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debugwerte zuordnen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+DebugOut.Sekunden++; |
+ if(!TimerWerteausgabe--) |
+ { |
+ TimerWerteausgabe = 49; |
+// DebugOut.Analog[0] = MesswertNick; |
+// DebugOut.Analog[1] = MesswertRoll; |
+// DebugOut.Analog[2] = MesswertGier; |
+ 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[7] = GasMischanteil; |
+ DebugOut.Analog[8] = KompassValue; |
+// 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 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
+ MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
+ MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
+ |
+ // Maximalwerte abfangen |
+ #define MAX_SENSOR 2048 |
+ if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
+ if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
+ if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
+ if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
+ if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
+ if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Höhenregelung |
+// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+//OCR0B = 180 - (Poti1 + 120) / 4; |
+//DruckOffsetSetting = OCR0B; |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
+ { |
+ int tmp_int; |
+ if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
+ { |
+ if(Parameter_MaxHoehe < 50) |
+ { |
+ SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
+ HoehenReglerAktiv = 0; |
+ } |
+ else |
+ HoehenReglerAktiv = 1; |
+ } |
+ else |
+ { |
+ SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 20; |
+ HoehenReglerAktiv = 1; |
+ } |
+ |
+ if(Notlandung) SollHoehe = 0; |
+ h = HoehenWert; |
+ if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
+ { h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
+ h = GasMischanteil - h; // vom Gas abziehen |
+ h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
+ tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
+ if(tmp_int > 50) tmp_int = 50; |
+ else if(tmp_int < -50) tmp_int = -50; |
+ h -= tmp_int; |
+ hoehenregler = (hoehenregler*15 + h) / 16; |
+ if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
+ { |
+ if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
+ if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
+ } |
+ if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
+ GasMischanteil = hoehenregler; |
+ } |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Mischer und PI-Regler |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gier-Anteil |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
+ if(GierMischanteil > 100) GierMischanteil = 100; |
+ if(GierMischanteil < -100) GierMischanteil = -100; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Nick-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
+ SummeNick += DiffNick; // I-Anteil |
+ if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
+ if(SummeNick > 16000) SummeNick = 16000; |
+ if(SummeNick < -16000) SummeNick = -16000; |
+ pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
+ // Motor Vorn |
+ motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
+ if ((motorwert < 0) | (GasMischanteil < 10)) 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) | (GasMischanteil < 10)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Hinten = motorwert; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Roll-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
+ SummeRoll += DiffRoll; // I-Anteil |
+ if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
+ if(SummeRoll > 16000) SummeRoll = 16000; |
+ if(SummeRoll < -16000) SummeRoll = -16000; |
+ pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
+ // Motor Links |
+ motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0) | (GasMischanteil < 10)) 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) | (GasMischanteil < 10)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Rechts = motorwert; |
+ // +++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+} |
+ |
/branches/mixer/V0.60_GPS_BETA_martosi/fc.h |
---|
0,0 → 1,106 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned char Timeout; |
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 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; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
unsigned char h,m,s; |
volatile unsigned char Timeout ; |
unsigned char CosinusNickWinkel, CosinusRollWinkel; |
volatile long IntegralNick,IntegralNick2; |
volatile long IntegralRoll,IntegralRoll2; |
volatile long Integral_Gier; |
volatile long Mess_IntegralNick,Mess_IntegralNick2; |
volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
volatile long Mess_Integral_Gier; |
volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay; |
int StickNick,StickRoll,StickGier; |
char MotorenEin; |
extern void DefaultKonstanten(void); |
#define STRUCT_PARAM_LAENGE 58 |
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; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
unsigned char ServoNickCompInvert; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
unsigned char Reserved[7]; |
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; |
#endif //_FC_H |
/branches/mixer/V0.60_GPS_BETA_martosi/flight-ctrl_mega644_v0_60.aws |
---|
0,0 → 1,0 |
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA644"/><Files><File00000 Name="C:\hubi\ufo\mickrokopter\gps codes\V0.60_GPS_BETA_martosi\main.c" Position="336 71 1048 624" LineCol="198 0" State="Maximized"/></Files></AVRWorkspace> |
/branches/mixer/V0.60_GPS_BETA_martosi/gps.h |
---|
0,0 → 1,73 |
//------------------------------------------------------------------------------ |
// _ _ |
// | | | | |
// ___ _ __ ___ ___ _ _ ___| |_ ___ ___| |__ |
// / _ \ '_ ` _ \/ __| | | / __| __/ _ \/ __| '_ \. |
// | __/ | | | | \__ \ |_| \__ \ || __/ (__| | | | |
// \___|_| |_| |_|___/\__, |___/\__\___|\___|_| |_| |
// __/ | |
// |___/ Engineering |
// |
// Filename: gps.h |
// Description: |
// |
// Author: Martin Steppuhn |
// History: 15.06.2007 Initial version |
// |
//------------------------------------------------------------------------------ |
#ifndef GPS_H |
#define GPS_H |
/**** Includes ****************************************************************/ |
/**** Preprocessing directives (#define) **************************************/ |
#define LED_GPS_FIX_TOGGLE PORTC ^= (1<<2) |
#define LED_GPS_FIX_ON PORTC |= (1<<2) |
#define LED_GPS_FIX_OFF PORTC &= ~(1<<2) |
#define LED_GPS_DATA_TOGGLE PORTC ^= (1<<3) |
#define LED_GPS_DATA_ON PORTC |= (1<<3) |
#define LED_GPS_DATA_OFF PORTC &= ~(1<<3) |
/**** Type definitions (typedef) **********************************************/ |
/**** Global constants (extern) ***********************************************/ |
/**** Global variables (extern) ***********************************************/ |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern void GPS_Neutral(void); |
extern void GPS_Main(void); |
/**** Global function prototypes **********************************************/ |
#endif |
/branches/mixer/V0.60_GPS_BETA_martosi/gps_ubx.c |
---|
0,0 → 1,137 |
//------------------------------------------------------------------------------ |
// _ _ |
// | | | | |
// ___ _ __ ___ ___ _ _ ___| |_ ___ ___| |__ |
// / _ \ '_ ` _ \/ __| | | / __| __/ _ \/ __| '_ \. |
// | __/ | | | | \__ \ |_| \__ \ || __/ (__| | | | |
// \___|_| |_| |_|___/\__, |___/\__\___|\___|_| |_| |
// __/ | |
// |___/ Engineering |
// |
// Filename: gps_ubx.c |
// Description: |
// |
// Author: Martin Steppuhn |
// History: 08.06.2007 Initial version |
// |
//------------------------------------------------------------------------------ |
/**** Includes ****************************************************************/ |
#include "std_c.h" |
#include "gps_ubx.h" |
/**** Preprocessing directives (#define) **************************************/ |
/**** Type definitions (typedef) **********************************************/ |
/**** Global constants ********************************************************/ |
/**** Global variables ********************************************************/ |
struct ubx_struct ubx; |
struct nav_sol_struct nav_sol; |
/**** Local constants ********************************************************/ |
/**** Local variables *********************************************************/ |
uint8 ubx_buf[256]; |
uint8 ubx_buf_len; |
/**** Local function prototypes ***********************************************/ |
//------------------------------------------------------------------------------ |
// Name: ubx_push |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void ubx_push(uint8 c) |
{ |
uint8 length; |
uint8 check_a,check_b; |
uint16 i; |
ubx_buf[ubx_buf_len] = c; |
ubx_buf_len++; |
if(ubx_buf_len == 1) { if(ubx_buf[0] != 0xB5) ubx_buf_len = 0; } // Sync |
else if(ubx_buf_len == 2) { if(ubx_buf[1] != 0x62) ubx_buf_len = 0; } // Sync |
else if(ubx_buf_len >= 6) |
{ |
length = (((uint16)ubx_buf[5]) << 8)+ ubx_buf[4]; // length |
if(ubx_buf_len >= (length+8)) // frame complete |
{ |
//=== Calculate checksum === |
check_a = 0; |
check_b = 0; |
for(i=2;i<(ubx_buf_len-2);i++) |
{ |
check_a = check_a + ubx_buf[i]; |
check_b = check_b + check_a; |
} |
//=== Test checksum === |
if((check_a == ubx_buf[ubx_buf_len-2]) && (check_b == ubx_buf[ubx_buf_len-1])) |
{ |
ubx.msg_class = ubx_buf[2]; |
ubx.msg_id = ubx_buf[3]; |
ubx.length = length; |
for(i=0;i<ubx.length;i++) ubx.data[i] = ubx_buf[i+6]; // copy data |
ubx.update = true; |
} |
ubx_buf_len = 0; |
} |
} |
} |
//------------------------------------------------------------------------------ |
// Name: ubx_decode |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void ubx_decode(struct ubx_struct *ubx) |
{ |
if((ubx->msg_class == 0x01) && (ubx->msg_id == 0x06)) // NAV-SOL |
{ |
nav_sol.itow = *(uint32*)(&ubx->data[0]); // ms |
nav_sol.gpsfix = ubx->data[10]; |
nav_sol.ecef_x = *(int32*)(&ubx->data[12]); // cm |
nav_sol.ecef_y = *(int32*)(&ubx->data[16]); // cm |
nav_sol.ecef_z = *(int32*)(&ubx->data[20]); // cm |
nav_sol.pacc = *(int32*)(&ubx->data[24]); // cm |
nav_sol.ecefvx = *(uint32*)(&ubx->data[28]); // cm/s |
nav_sol.ecefvy = *(uint32*)(&ubx->data[32]); // cm/s |
nav_sol.ecefvz = *(uint32*)(&ubx->data[36]); // cm/s |
nav_sol.sacc = *(uint32*)(&ubx->data[40]); // cm/s |
nav_sol.pdop = (uint16)ubx->data[44]; |
nav_sol.numsv = ubx->data[47]; |
nav_sol.update = true; |
} |
} |
//------------------------------------------------------------------------------ |
// Name: show_ubx |
// Function: |
// |
// Parameter: |
// Return: |
//------------------------------------------------------------------------------ |
void show_ubx(struct ubx_struct *ubx) |
{ |
uint8 i; |
printf("MsgClass=%u ",ubx->msg_class); |
printf("MsgId=%u ",ubx->msg_id); |
printf("Length=%u ",ubx->length); |
printf("Data= "); |
for(i=0;i<ubx->length;i++) printf("%02X ",ubx->data[i]); |
printf("\r\n"); |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/gps_ubx.h |
---|
0,0 → 1,71 |
//------------------------------------------------------------------------------ |
// _ _ |
// | | | | |
// ___ _ __ ___ ___ _ _ ___| |_ ___ ___| |__ |
// / _ \ '_ ` _ \/ __| | | / __| __/ _ \/ __| '_ \. |
// | __/ | | | | \__ \ |_| \__ \ || __/ (__| | | | |
// \___|_| |_| |_|___/\__, |___/\__\___|\___|_| |_| |
// __/ | |
// |___/ Engineering |
// |
// Filename: gps_ubx.h |
// Description: |
// |
// Author: Martin Steppuhn |
// History: 08.06.2007 Initial version |
// |
//------------------------------------------------------------------------------ |
#ifndef GPS_UBX_H |
#define GPS_UBX_H |
/**** Includes ****************************************************************/ |
#include "std_c.h" |
/**** Preprocessing directives (#define) **************************************/ |
/**** Type definitions (typedef) **********************************************/ |
typedef struct ubx_struct |
{ |
bool update; |
uint8 msg_class; |
uint8 msg_id; |
uint8 length; |
uint8 data[256]; |
}; |
typedef struct nav_sol_struct |
{ |
uint8 update; |
uint32 itow; // Time |
uint8 gpsfix; // GPSfix |
int32 ecef_x; // cm ECEF X coordinate |
int32 ecef_y; // cm ECEF Y coordinate |
int32 ecef_z; // cm ECEF Z coordinate |
uint32 pacc; // cm 3D Position Accuracy Estimate |
int32 ecefvx; // cm/s ECEF X velocity |
int32 ecefvy; // cm/s ECEF Y velocity |
int32 ecefvz; // cm/s ECEF Z velocity |
uint32 sacc; // cm/s Speed Accuracy Estimate |
uint16 pdop; // Position DOP |
uint8 numsv; // Number of SVs used in Nav Solution |
}; |
/**** Global constants (extern) ***********************************************/ |
/**** Global variables (extern) ***********************************************/ |
struct ubx_struct ubx; |
struct nav_sol_struct nav_sol; |
/**** Global function prototypes **********************************************/ |
extern void ubx_push(uint8 c); |
extern void ubx_decode(struct ubx_struct *ubx); |
#endif |
/branches/mixer/V0.60_GPS_BETA_martosi/main.c |
---|
0,0 → 1,221 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
// -- 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) |
{ |
return(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET])); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
unsigned int timer2 = 0; |
DDRC = 0x01; // 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(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl V%d.%d ", VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
printf("\n\r=============================="); |
GRN_ON; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 59) // seit V 0.60 |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 1); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], 59); |
} |
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(2500); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if (UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
beeptime = 2000; |
} |
if(!Timeout) |
{ |
i2c_init(); |
} |
else |
{ |
ROT_OFF; |
} |
} |
if(EE_Parameter.GlobalConfig & CFG_GPS_AKTIV) |
{ |
GPS_Main(); |
} |
else |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer2)) |
{ |
if(MotorenEin) PORTC ^= 0x10; else PORTC &= ~0x10; |
timer = SetDelay(500); |
} |
} |
return (1); |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/main.h |
---|
0,0 → 1,93 |
#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 PORTB &=~0x01 |
#define ROT_ON PORTB |= 0x01 |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTD ^= 0x02 |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//#define ANZ_MITTELWERT 4 |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#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 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 void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
extern 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 "gps_ubx.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/mixer/V0.60_GPS_BETA_martosi/makefile |
---|
0,0 → 1,391 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 60 |
VERSION_KOMPATIBEL = 4 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION) |
# 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 gps_ubx.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) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/mixer/V0.60_GPS_BETA_martosi/menu.c |
---|
0,0 → 1,125 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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(); } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); } |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,0,"[%i]",MenuePunkt); |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"++ MikroKopter ++"); |
LCD_printfxy(0,1,"V%d.%d",VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
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 Kanäle ",PPM_in[7]); |
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 Kanäle ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AccumulateNick / MessanzahlNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AccumulateRoll / MessanzahlRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AccumulateGier / MessanzahlGier, AdNeutralGier); |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",accumulate_AccNick / messanzahl_AccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",accumulate_AccRoll / messanzahl_AccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Aktuell_az/*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,"GPS " ); |
LCD_printfxy(0,1,"GPS_Nick %3i",GPS_Nick); |
LCD_printfxy(0,2,"GPS_Roll: %3i",GPS_Roll); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/menu.h |
---|
0,0 → 1,5 |
extern void Menu(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
unsigned char RemoteTasten; |
/branches/mixer/V0.60_GPS_BETA_martosi/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/mixer/V0.60_GPS_BETA_martosi/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/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 |
extern void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/mixer/V0.60_GPS_BETA_martosi/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
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; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if ((signal > 1500) && (signal < 8000)) |
{ |
index = 1; |
NewPpmData = 0; // Null bedeutet: Neue Daten |
// OCR2A = Poti2/2 + 80; |
} |
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;} |
signal = (3 * (PPM_in[index]) + signal) / 4; |
//373 entspricht ca. 1.5ms also Mittelstellung |
PPM_diff[index] = signal - PPM_in[index]; |
PPM_in[index] = signal; |
} |
index++; |
/* if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen */ |
} |
} |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/mixer/V0.60_GPS_BETA_martosi/std_c.h |
---|
0,0 → 1,49 |
//*---------------------------------------------------------------------------- |
//* ATMEL Microcontroller Software Support - ROUSSET - |
//*---------------------------------------------------------------------------- |
//* The software is delivered "AS IS" without warranty or condition of any |
//* kind, either express, implied or statutory. This includes without |
//* limitation any warranty or condition with respect to merchantability or |
//* fitness for any particular purpose, or against the infringements of |
//* intellectual property rights of others. |
//*---------------------------------------------------------------------------- |
//* File Name : std_c.h |
//* Object : Standard C Header File |
//* |
//* 1.0 01/04/00 JCZ : Creation |
//*---------------------------------------------------------------------------- |
#ifndef std_c_h |
#define std_c_h |
/*----------------*/ |
/* Standard types */ |
/*----------------*/ |
typedef unsigned char uint8; |
typedef unsigned short uint16; |
typedef unsigned long uint32; |
typedef unsigned char bool; |
typedef signed char int8; |
typedef signed short int16; |
typedef signed long int32; |
/* 16-bit Flash Data type */ |
typedef volatile unsigned short flash_word ; |
/* AT91 Register type */ |
typedef volatile unsigned int at91_reg ; |
/*----------------*/ |
/* Boolean values */ |
/*----------------*/ |
#define true 1 |
#define false 0 |
#endif /* std_c_h */ |
/branches/mixer/V0.60_GPS_BETA_martosi/timer0.c |
---|
0,0 → 1,139 |
#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; |
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; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
if(Timeout) Timeout--; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
PORTD |= (1<<2); |
} |
else |
PORTD &= ~(1<<2); |
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 = -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)); |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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; |
DebugOut.Analog[10] = ServoValue; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/timer0.h |
---|
0,0 → 1,14 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(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; |
/branches/mixer/V0.60_GPS_BETA_martosi/twimaster.c |
---|
0,0 → 1,131 |
/*############################################################################ |
############################################################################*/ |
#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); |
} |
//############################################################################ |
//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(); |
twi_state = 0; |
} |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/twimaster.h |
---|
0,0 → 1,32 |
/*############################################################################ |
############################################################################*/ |
#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_init (void); // I2C initialisieren |
char i2c_start (void); // Start I2C |
void i2c_stop (void); // Stop I2C |
char i2c_write_byte (char byte); // 1 Byte schreiben |
#endif |
/branches/mixer/V0.60_GPS_BETA_martosi/uart.c |
---|
0,0 → 1,331 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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; |
ubx_push(SioTmp); // push die GPS daten in die GPS routine |
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[1] == MeineSlaveAdresse || (RxdBuffer[1] == 'a')) && */(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 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
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) |
{ |
static char dis_zeile = 0; |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++dis_zeile == 4) dis_zeile = 0; |
SendOutData('0' + dis_zeile,0,&DisplayBuff[20 * dis_zeile],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/mixer/V0.60_GPS_BETA_martosi/uart.h |
---|
0,0 → 1,93 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
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 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 unsigned char MotorTest[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[13]; |
unsigned int AnzahlZyklen; |
unsigned int Zeit; |
unsigned char Sekunden; |
unsigned int Analog[16]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/mixer/V0.60_GPS_BETA_martosi/version.txt |
---|
0,0 → 1,57 |
------- |
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 |
++ martosi |
Ich habe den von mart veröffentlichen code 1 zu 1 verbaut und noch das fehlende |
und später erklärte std_c.h hinzugefügt. Das ganze ist ein avrstudio4 Projekt. |
Viel Spass damit und schaut nach Updates. |
Die Lizenz lautet alles geht nix muss ausser bestehende lizenzen beachten!! |
Das ganze ist Beerware also wer möchte darf mart und/oder mir ein Bier spendieren. |
Osiair |
/branches/mixer/V0.60_GPS_BETA_martosi/. |
---|
Property changes: |
Added: svn:ignore |
+gps_ubx.d |
+main.d |
+menu.d |
+printf_P.d |
+rc.d |
+timer0.d |
+twimaster.d |
+uart.d |
+analog.d |
+fc.d |
+GPS.d |