/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Flight-Ctrl_MEGA644_V0_643.hex |
---|
0,0 → 1,2323 |
:100000000C94F8010C9413020C9413020C94130238 |
:100010000C9413020C9413020C9413020C9413020C |
:100020000C9413020C94A90D0C9413020C9413025B |
:100030000C9471180C9413020C9413020C94130278 |
:100040000C9413020C9413020C94B00C0C94130235 |
:100050000C9428050C9413020C9412040C941302B3 |
:100060000C94AE0E0C9413020C949B170C94130278 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A00020000A0D3D3D3D3D3D3D3D3D3D3D3D3D3D |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D000A0D496E69742E20454550524F42 |
:1000D0004D3A2047656E65726965726520446566B4 |
:1000E00061756C742D506172616D657465722E2E30 |
:1000F0002E000A0D42656E75747A6520506172613A |
:100100006D657465727361747A202564000A0D410F |
:1001100062676C65696368204C75667464727563A8 |
:100120006B73656E736F722E2E004F4B0A0D000AB3 |
:100130000D537465756572756E673A200048656188 |
:1001400064696E67486F6C64004E65757472616CAB |
:10015000000A0A0D002E005B25695D002B2B204D47 |
:10016000696B726F4B6F70746572202B2B00485750 |
:100170003A5625642E25642053573A25642E25646B |
:100180000053657474696E673A2025642000286303 |
:100190002920486F6C676572204275737300486F41 |
:1001A0006568653A202020202025356900536F6C52 |
:1001B0006C486F6568653A20253569004C75667432 |
:1001C000647275636B3A20253569004F666620209E |
:1001D000202020203A20253569004B65696E652076 |
:1001E0000048F668656E726567656C756E670061DC |
:1001F0006B742E204C616765004E69636B3A20205A |
:100200002020202025356900526F6C6C3A20202078 |
:10021000202020253569004B6F6D706173733A2083 |
:100220002020253569004B313A25346920204B3296 |
:100230003A25346920004B333A25346920204B3469 |
:100240003A25346920004B353A25346920204B3655 |
:100250003A25346920004B373A25346920204B3841 |
:100260003A25346920004E693A2534692020526FBE |
:100270003A253469200047733A25346920204769BC |
:100280003A253469200050313A2534692020503213 |
:100290003A253469200050333A25346920205034FF |
:1002A0003A25346920004779726F202D2053656EFE |
:1002B000736F72004E69636B2025346920282533E3 |
:1002C000692900526F6C6C20253469202825336918 |
:1002D000290047696572202534692028253369295A |
:1002E00000414343202D2053656E736F72004E69A9 |
:1002F000636B2025346920282533692900526F6CEF |
:100300006C2025346920282533692900486F6368EB |
:1003100020253469202825336929005370616E6EC9 |
:10032000756E673A202025356900456D70662E5040 |
:100330006567656C3A253569004B6F6D7061737345 |
:1003400020202020202020005269636874756E6789 |
:100350003A2020253569004D657373776572743ACC |
:1003600020202535690053746172743A20202020C2 |
:100370002025356900506F313A2025336920506FB0 |
:10038000353A2025336900506F323A2025336920F1 |
:10039000506F363A2025336900506F333A202533A9 |
:1003A0006920506F373A2025336900506F343A2066 |
:1003B00025336920506F383A202533690053657220 |
:1003C000766F202000536574706F696E742020254D |
:1003D0003369005374656C6C756E673A2025336918 |
:1003E0000052616E67653A2533692D253369000037 |
:1003F00011241FBECFEFD0E1DEBFCDBF18E0A0E0DB |
:10040000B1E0E0EFF9E802C005900D92A033B1072A |
:10041000D9F71DE0A0E3B8E001C01D92A433B107F5 |
:10042000E1F70C944E020C940000FB01863008F0BA |
:1004300085E0489FD0011124AC59BF4F842F9927E4 |
:10044000019724F00E94E4440192FACF0895282FE6 |
:10045000FB01863008F025E0429FD0011124AC5901 |
:10046000BF4F842F9927019724F001900E94EC44FC |
:10047000FACFA2E0B0E0022E0E94EC440895A2E080 |
:10048000B0E09D010E94E444802D863028F082E097 |
:10049000D901082E0E94EC4499270895CFEFD0E1AE |
:1004A000DEBFCDBF14B815B897EEE92E93E0F92E54 |
:1004B0008EEC9FEFE80EF91EF7FEFACF88EEE82EDD |
:1004C00083E0F82E189B02C08BE001C08AE0809385 |
:1004D000000181E887B98FEF88B98BE184B981E0A9 |
:1004E00085B98EE38AB9579A87EF8BB984B7877F2E |
:1004F00084BF8091600088618093600010926000EA |
:1005000080ED97E090934B0880934A0810928408FE |
:100510001092830810926D0C10926C0C1092860849 |
:100520001092850810928808109287088091000127 |
:100530008A3011F4289801C0289A0E946A0D0E94FE |
:1005400035090E945C180E94600E0E94641778941E |
:100550001092CA0A83E88093CB0A85E08093CC0A84 |
:1005600083E892E09F938F931F921F9280910001E6 |
:100570006AE00E943D44892F99279F938F93809131 |
:1005800000010E943D4499279F938F9380E790E05C |
:100590009F938F931F920E94260A8DB79EB70B964A |
:1005A0000FB6F8949EBF0FBE8DBF82EA90E09F9376 |
:1005B0008F931F920E94260A299A0F900F900F90F6 |
:1005C000C1E0D0E0DE010E94E444802D8E3329F1A9 |
:1005D00083EC90E09F938F931F920E94260A0E94C3 |
:1005E000A02010E00F900F900F90123011F40E9495 |
:1005F00016214AE364EA7CE0812F0E9427021F5FF4 |
:10060000163098F3A2E0B0E082E0082E0E94EC449D |
:100610008EE3DE01082E0E94EC440E943F024AE372 |
:1006200064EA7CE00E9415020E943F0299279F9392 |
:100630008F9382EF90E09F938F931F920E94260AE0 |
:100640008091AC0C0F900F900F900F900F9080FF47 |
:1006500020C08DE091E09F938F931F920E94260A05 |
:1006600088EE93E00E94610D7C010E94660E0F905F |
:100670000F900F90C7010E94900D8823D9F38AE252 |
:1006800091E09F938F931F920E94260A0F900F90E4 |
:100690000F900E94BE1B809100018A3011F42898AF |
:1006A00001C0289A80ED97E090934B0880934A0808 |
:1006B00088EE93E09093C50A8093C40A85E5809301 |
:1006C000BF0A8FE291E09F938F931F920E94260AA8 |
:1006D0008091AC0C0F900F900F9082FF03C08DE3C0 |
:1006E00091E002C089E491E09F938F931F920E9452 |
:1006F000260A0F900F900F9081E591E09F938F93C2 |
:100700001F920E94260A0E94A91288E893E1909302 |
:100710007F0180937E010F900F900F9080914E0883 |
:10072000882309F451C010924E080E94D4230E94DD |
:100730007520209100012A3011F4289801C0289AD0 |
:1007400080910101882319F08150809301018091EB |
:100750008908882329F0809189088150809389082D |
:1007600080917E0190917F01892B01F585E090E0D9 |
:1007700090937F0180937E010E947E1780910301F8 |
:10078000909104018F5F9F4FF9F480918208882334 |
:10079000D9F080E197E290934B0880934A0880E873 |
:1007A00090E090930401809303010EC080917E013C |
:1007B00090917F01019790937F0180937E012A3071 |
:1007C00011F4289801C0289A0E9455090E947108C6 |
:1007D000C7010E94900D882309F4A0CF8091BC0C22 |
:1007E000282F332780910D0190910E0182179307D6 |
:1007F0009CF480910301909104018F5F9F4F61F4FD |
:1008000080E797E190934B0880934A0880E093E05B |
:10081000909304018093030184E690E00E94610DAF |
:100820007C017CCF1F920F920FB60F9211248F93F1 |
:100830009F93EF93FF93809102018823E1F48091CD |
:100840003E0890913F08019690933F0880933E08A0 |
:10085000FC01E158F64FE081ED3019F08639910541 |
:1008600039F410923F0810923E0881E08093020113 |
:10087000E093C60004C010923F0810923E08FF911A |
:10088000EF919F918F910F900FBE0F901F90189531 |
:100890008091B40B813091F58091A40B9091A50BC0 |
:1008A000A091A60BB091A70B8093F70B9093F80B38 |
:1008B000A093F90BB093FA0B8091A80B9091A90B20 |
:1008C000A091AA0BB091AB0B8093FB0B9093FC0B08 |
:1008D000A093FD0BB093FE0B8091AC0B9091AD0BF0 |
:1008E000A091AE0BB091AF0B8093FF0B9093000CD7 |
:1008F000A093010CB093020C1092B40B9091BE0A1D |
:10090000913041F48091B20A8093240C9093230C8F |
:100910001092BE0A8091EE0A813091F58091DE0A34 |
:100920009091DF0AA091E00AB091E10A8093030C54 |
:100930009093040CA093050CB093060C8091E20AEE |
:100940009091E30AA091E40AB091E50A8093070C24 |
:100950009093080CA093090CB0930A0C8091E60ABE |
:100960009091E70AA091E80AB091E90A80930B0CF4 |
:1009700090930C0CA0930D0CB0930E0C1092EE0AF9 |
:100980008091970B813091F580918D0B90918E0B1A |
:10099000A0918F0BB091900B80930F0C9093100C43 |
:1009A000A093110CB093120C8091890B90918A0B3B |
:1009B000A0918B0BB0918C0B8093130C9093140C23 |
:1009C000A093150CB093160C8091910B9091920B03 |
:1009D000A091930BB091940B8093170C9093180CEB |
:1009E000A093190CB0931A0C1092970B80914C0C99 |
:1009F000813011F580912C0C90912D0CA0912E0C32 |
:100A0000B0912F0C80931B0C90931C0CA0931D0C89 |
:100A1000B0931E0C8091300C9091310CA091320C4F |
:100A2000B091330C80931F0C9093200CA093210C59 |
:100A3000B093220C10924C0C8091230C882339F037 |
:100A4000809100018A3011F4289A08952898089519 |
:100A50001F920F920FB60F9211242F933F934F9333 |
:100A60005F936F937F938F939F93AF93BF93EF9316 |
:100A7000FF9320E08091C600809339088091C000E8 |
:100A8000887140913908882309F04DC18091470849 |
:100A900099278430910509F4CBC0853091057CF409 |
:100AA0008130910509F1823091051CF4892BB9F050 |
:100AB00037C18230910501F1039719F131C18630B8 |
:100AC000910509F4E5C0863091050CF4C5C0873066 |
:100AD000910509F40EC1089709F416C121C1453BDF |
:100AE00009F025C181E00AC1423611F482E006C155 |
:100AF000453B09F41CC105C1413009F002C183E046 |
:100B0000FDC04093260C4F5F40937E0980917E0983 |
:100B10008F5F8093AD0A84E0809347088091260C14 |
:100B200099278830910509F44FC08930910534F434 |
:100B300081309105F9F0039741F072C08131910540 |
:100B400071F1429709F455C06BC08EEA9AE0909318 |
:100B5000D90A8093D80A8F5D9E4F90937C09809329 |
:100B60007B09815191409093990B8093980B8091D0 |
:100B7000BE0A53C080EA9BE09093D90A8093D80ABA |
:100B800087549E4F90937C0980937B09855A9140AE |
:100B90009093990B8093980B8091B40B3EC08AED93 |
:100BA0009AE09093D90A8093D80A87549E4F9093E5 |
:100BB0007C0980937B09855A91409093990B80938F |
:100BC000980B8091EE0A29C085E89BE09093D90AA2 |
:100BD0008093D80A87599E4F90937C0980937B0914 |
:100BE000875591409093990B8093980B8091970B28 |
:100BF00014C088E29CE09093D90A8093D80A875A5F |
:100C00009A4F90937C0980937B09855395409093EC |
:100C1000990B8093980B80914C0C8093270C87C084 |
:100C200081E08093270C1092990B1092980B7FC053 |
:100C3000842F992790939B0B80939A0B80917E0928 |
:100C4000840F80937E098091AD0A90917E09890F6F |
:100C50008093AD0A85E052C0842F9927382F222730 |
:100C600080919A0B90919B0B820F931F90939B0BFB |
:100C700080939A0B80917E09840F80937E098091E6 |
:100C8000AD0A90917E09890F8093AD0A86E036C047 |
:100C900080917E09840F80937E098091AD0A9091A6 |
:100CA0007E09890F8093AD0A8091270C882381F4F7 |
:100CB000E091D80AF091D90A80917B0990917C0942 |
:100CC000E817F90728F44193F093D90AE093D80A7A |
:100CD00080919A0B90919B0B019790939B0B809323 |
:100CE0009A0B80919A0B90919B0B892B01F587E0D1 |
:100CF00005C080917E09481721F488E08093470859 |
:100D000016C02093470813C08091AD0A481741F4DC |
:100D1000E091980BF091990B309711F081E080836E |
:100D20001092470804C0209347080E9448040E947C |
:100D3000480450914408563910F0109245088091AB |
:100D400039088D3009F05FC080914508823009F084 |
:100D50005AC010924508852F99278151954FFC0163 |
:100D6000329740812091400830914108241B31097D |
:100D7000DC0111978C91281B3109C9019F70909358 |
:100D800041088093400846E0969587954A95E1F79B |
:100D9000982F935C909342082F733070235C2093BC |
:100DA00043088081981729F48C91281711F421E0C9 |
:100DB00006C020E0809136088F5F809336088091CE |
:100DC0003808882309F06EC0222309F46BC081E043 |
:100DD0008093380850933508E52FFF27E151F54FF0 |
:100DE0008DE080838091F10A823509F05BC088E153 |
:100DF00090E02CE00FB6F894A895809360000FBEA9 |
:100E0000209360004FC020914508822F99278130A0 |
:100E10009105F9F0823091051CF4892B21F040C036 |
:100E2000029711F13DC080913908833239F48091E5 |
:100E30003808882319F481E08093450880913908A7 |
:100E40008093EF0A81E080934408809139089927C4 |
:100E500022C02F5F20934508E52FFF27E151F54F72 |
:100E600080913908808309C0E52FFF27E151F54FB4 |
:100E7000809139088083563920F45F5F509344088D |
:100E800002C0109245082091390880914008909145 |
:100E90004108820F911D909341088093400802C041 |
:100EA00010924508FF91EF91BF91AF919F918F9163 |
:100EB0007F916F915F914F913F912F910F900FBE56 |
:100EC0000F901F901895AC01A0E0B0E09D01A8170D |
:100ED000B90748F4EFE7F9E08191280F311D119629 |
:100EE000A417B507C8F33F70FD01E158F64FC901DB |
:100EF00066E0969587956A95E1F7835C8083119605 |
:100F0000FD01E158F64F2F733070822F835C808390 |
:100F1000A058B64F8DE08C931092020180917F090A |
:100F20008093C60008951F93CF93DF93382FEA0173 |
:100F3000722F10E083E280937F09609380093093E1 |
:100F40008109A3E0B0E0772309F458C0772311F4B6 |
:100F5000972F07C0FE01E10FF11D1F5F90817150B7 |
:100F600011F4472F0EC0FE01E10FF11D1F5F4081FC |
:100F7000715039F0FE01E10FF11D1F5F608171506A |
:100F800001C0672FFD01E158F64F892F86958695A0 |
:100F9000835C80831196FD01E158F64F892F9927D4 |
:100FA0008370907024E0880F991F2A95E1F75527E8 |
:100FB0009A0194E0369527959A95E1F7822B835C08 |
:100FC00080831196FD01E158F64F4F705070440F29 |
:100FD000551F440F551F862F992726E09695879514 |
:100FE0002A95E1F7842B835C80831196FD01E158FB |
:100FF000F64F6F73635C60831196A5CFCD010E949D |
:101000006307DF91CF911F9108951F93CF93DF93D3 |
:10101000EC0110E0662309F460C0A22FBB271297F1 |
:10102000E42FFF27E151F54F30813D534F5FE42F0F |
:10103000FF27E151F54F50815D534F5FE42FFF27AC |
:10104000E151F54F70817D534F5FE42FFF27E15150 |
:10105000F54FE081ED534F5F842F9927A817B9070B |
:10106000E4F1832F9927880F991F880F991F352F37 |
:1010700032953F70382B852F99278F709070F4E050 |
:10108000880F991FFA95E1F7572F56955695582BCB |
:10109000872F99278370907076E0880F991F7A9533 |
:1010A000E1F78E2B61506F3FC1F0FE01E10FF11DA2 |
:1010B00030831F5F61506F3F81F0FE01E10FF11D32 |
:1010C00050831F5F61506F3F41F0FE01E10FF11D42 |
:1010D00080831F5F662309F0A3CFDF91CF911F911B |
:1010E0000895CF93DF93CDB7DEB72B970FB6F89463 |
:1010F000DEBF0FBECDBF80913808882309F49AC0A7 |
:101100008FEF809301018091F10A99278137910532 |
:101110009CF48C3691050CF06EC08736910509F46D |
:1011200044C08836910524F48336910599F080C037 |
:1011300088369105D9F07CC08437910549F185370F |
:10114000910524F481379105A1F172C0863791058C |
:1011500041F16EC02091350843E06BE08FEB9AE0DF |
:101160000E94050881E080933B0862C02091350809 |
:1011700043E062E0CE010A960E94050880916C0867 |
:101180009A85892B80936C0881E080933C0850C03D |
:101190002091350843E064E080E398E00E94050870 |
:1011A00047C081E080933A0843C081E080933D08C6 |
:1011B0003FC02091350843E062E0CE010A960E94CC |
:1011C00005088A858F3F61F0863010F085E08A87B8 |
:1011D0004AE364EA7CE08A850E9415028A8502C09F |
:1011E0000E943F022AE344EA5CE060917D09855B4E |
:1011F0000E9493071DC02091350843E06AE384EA0A |
:101200009CE00E9405088091F10A4AE364EA7CE0D0 |
:101210008B560E942702A2E0B0E08091F10A8B5623 |
:10122000082E0E94EC440E943F0299270E94231935 |
:10123000109238082B960FB6F894DEBF0FBECDBFC4 |
:10124000DF91CF910895CF93C82F8A3019F48DE0A4 |
:101250000E9423098091C00085FFFCCFC093C60087 |
:1012600080E090E0CF910895089588E18093C100D7 |
:101270008091C00082608093C0008091C10080682E |
:101280008093C1008091C10080648093C1008AE294 |
:101290008093C40088EC90E00E94610D9093AC0AAA |
:1012A0008093AB0A10924708089580910201882329 |
:1012B00009F471C080913D08882371F0809102018A |
:1012C000882351F02BE04FEB5AE060917D0987E4D1 |
:1012D0000E94930710923D088091AB0A9091AC0A4E |
:1012E0000E94900D882321F480913B088823B1F05F |
:1012F00080910201882391F022E445EB5BE060914C |
:101300007D0984E40E94930710923B0884EF91E0EA |
:101310000E94610D9093AC0A8093AB0A80913C08C7 |
:10132000882339F180910201882319F10E94B212B9 |
:1013300010923C0830914608832F8F5F80934608B7 |
:10134000843059F42EE148E65CE060E084E30E94DA |
:1013500093078FEF809346080CC024E1829FC00161 |
:101360001124815F9E4FAC0160E0832F8F5C0E944F |
:10137000930780913A08882371F0809102018823B5 |
:1013800051F02AE04AEC5AE060917D0986E50E941E |
:10139000930710923A080895982F80914D0C813050 |
:1013A00069F480916D08E82FFF27E15FFE4F90837D |
:1013B0008F5F80936D0821E030E005C0892F0E9487 |
:1013C0002309282F3327C90108950F931F93CF9323 |
:1013D000DF938C01EB01672B39F0F80181918F01CC |
:1013E0000E94CC092197C9F7DF91CF911F910F91EE |
:1013F00008950F931F93CF93DF938C01EB01672B1D |
:1014000041F0F8010F5F1F4F84910E94CC09219792 |
:10141000C1F7DF91CF911F910F910895CF93C82FFE |
:10142000181634F480E20E94CC09C1501C16D4F383 |
:10143000CF910895CF93C82F181634F480E30E94FB |
:10144000CC09C1501C16D4F3CF9108952F923F922E |
:101450004F925F926F927F928F929F92AF92BF92C4 |
:10146000CF92DF92EF92FF920F931F93CF93DF9370 |
:10147000CDB7DEB7E0970FB6F894DEBF0FBECDBF95 |
:1014800026968FAD26972896EEADFFAD28971CA621 |
:101490001DA61EA61FA680934D0CA8E46A2E712CD3 |
:1014A0006C0E7D1E5F01C50105C0053239F0089440 |
:1014B000A11CB11CF50104910023B9F7B501681B0B |
:1014C000790B11F00E94F909002309F430C2089445 |
:1014D000A11CB11C552458AA252C1FEF59A6F501B3 |
:1014E0000894A11CB11C0491053721F0802F806263 |
:1014F0008837F1F450FE0EC0F30124E030E0620EB4 |
:10150000731E80819181A281B3818CA79DA7AEA714 |
:10151000BFA70EC0F301A2E0B0E06A0E7B1E80817F |
:1015200091819C01442755272CA73DA74EA75FA773 |
:10153000003221F489A5882391F61BC0033211F4EF |
:1015400038E081C00A3211F00D3289F40A3251F4C8 |
:10155000F30142E050E0640E751E208022200CF062 |
:10156000BECF219450E1552A8FED5822B8CF0B32CF |
:1015700011F409A7B4CF0E32C1F5F5010894A11CEE |
:10158000B11C04910A3279F4F301A2E0B0E06A0ED2 |
:101590007B1E60817181BFEF6F3F7B0714F46FEF9B |
:1015A0007FEF162F9CCF60E070E0802F80538A3051 |
:1015B000A0F4CB01F3E0880F991FFA95E1F7860FAD |
:1015C000971F680F791F600F711D60537040F50100 |
:1015D0000894A11CB11C0491E8CFEFEF6F3F7E0788 |
:1015E00014F46FEF7FEF162F7FCF003329F454FCF4 |
:1015F00076CFF0E25F2A73CF802F81538930D8F401 |
:1016000060E070E0CB01E3E0880F991FEA95E1F715 |
:10161000860F971F680F791F600F711D6053704010 |
:10162000F5010894A11CB11C0491802F80538A30CD |
:1016300048F3262E59CF083619F424E0522A4FCF0A |
:101640000C3619F431E0532A4ACF033661F44E01C7 |
:101650000894811C911CF30142E050E0640E751E59 |
:10166000808189831BC1043421F0043611F00936CE |
:10167000B1F5043411F451E0552A50FE0AC0F301CB |
:1016800084E090E0680E791E20813181428153818F |
:101690000CC0F30142E050E0640E751E8081918120 |
:1016A0009C01442737FD4095542F2CA73DA74EA7FA |
:1016B0005FA78CA59DA5AEA5BFA5B7FF0DC0B09532 |
:1016C000A095909581959F4FAF4FBF4F8CA79DA739 |
:1016D000AEA7BFA78DE289A77AE0472E7BC00F3463 |
:1016E00011F00F3639F40F3411F491E0592A68E003 |
:1016F000462E6FC00037A1F4F301A2E0B0E06A0EFD |
:101700007B1E808191819C01442755272CA73DA7F2 |
:101710004EA75FA750E1452E30E4532A08E759C091 |
:101720000337C1F5F30142E050E0640E751E80807E |
:1017300091808114910489F44E010894811C911CBC |
:1017400088E289838EE6F401818385E78B838CE6CA |
:101750008C838D8389E28E831F8217FD13C0812FB6 |
:10176000992787FD9095AC0160E070E0C4010E946C |
:10177000A942009729F0D82ED8181D150CF090C05A |
:10178000D12E8EC0F40101900020E9F73197DE2EB2 |
:10179000D81886C0053511F0053739F4053511F430 |
:1017A000F1E05F2A4AE0442E14C0083519F00837EA |
:1017B00009F06CC030E1432E53FE0BC02CA53DA5B3 |
:1017C0004EA55FA5211531054105510511F030E405 |
:1017D000532A19A618AB17FD02C04FED542229E277 |
:1017E000822E912C8C0E9D1E8CA59DA5AEA5BFA50D |
:1017F0000097A105B10521F498A9992309F43FC0E8 |
:10180000C42CDD24EE24FF2433242CA53DA54EA5B5 |
:101810005FA52C153D054E055F0510F091E0392EB2 |
:101820006CA57DA58EA59FA5A70196010E94704479 |
:10183000DC01CB01182F8A3010F4105D04C0195A56 |
:10184000083509F41F7DD4011E934D016CA57DA5BB |
:101850008EA59FA5A70196010E9470442CA73DA7C5 |
:101860004EA75FA7332081F6B8E04B1641F453FE34 |
:1018700006C0103321F080E3F40182934F01CE01C2 |
:101880000196D82ED818F8E2DF0E0BC0002309F419 |
:101890004EC04E010894811C911C098381E0D82E12 |
:1018A00019A61D2DC8A8CD18C7FCCC2489A588234E |
:1018B00011F01F5F02C056FC1E5F1C0DE52CFF24BB |
:1018C000C70180739070892B21F4822D811B0E94A7 |
:1018D0000E0A89A5882329F061E070E0CE0189967F |
:1018E00009C0E6FE09C080E38AA70BA762E070E0AA |
:1018F000CE018A960E94E509C70180739070809797 |
:1019000021F4822D811B0E941A0A8C2D0E941A0A32 |
:101910008D2D992787FD9095BC01C4010E94E50992 |
:10192000E4FEC1CD822D811B0E940E0ABCCDE09643 |
:101930000FB6F894DEBF0FBECDBFDF91CF911F91E0 |
:101940000F91FF90EF90DF90CF90BF90AF909F905E |
:101950008F907F906F905F904F903F902F90089561 |
:101960001F920F920FB60F9211242F933F935F9304 |
:101970006F937F938F939F93AF93BF938091510801 |
:101980008150809351088F3FB9F489E080935108CA |
:10199000809105018F5F817080930501882319F480 |
:1019A00081E080934E0880914F08909150080196F5 |
:1019B0009093500880934F0880914A0890914B086B |
:1019C0000297C8F080914A0890914B080197909334 |
:1019D0004B0880934A0880914A0890914B082091C7 |
:1019E00003013091040182239323892B11F021E01C |
:1019F00009C020E007C020E08FEF9FEF9093040123 |
:101A00008093030180910001222331F08A3011F488 |
:101A10005A9A07C0479A05C08A3011F45A9801C0F3 |
:101A200047988091AC0C992783FD02C085FF3BC08D |
:101A3000349B0AC080914C0890914D080196909378 |
:101A40004D0880934C082FC080914C0890914D0810 |
:101A5000892B79F080914C0890914D08805A9F40D5 |
:101A600040F480914C0890914D089093A508809384 |
:101A7000A4088091A4089091A5082091A208309113 |
:101A8000A308821B930B845E9D4F68E671E00E9461 |
:101A90005D44845B90409093A1088093A0081092CD |
:101AA0004D0810924C08BF91AF919F918F917F91FB |
:101AB0006F915F913F912F910F900FBE0F901F90EC |
:101AC000189520914F0830915008280F391FC901EF |
:101AD000019608958AE090E00E94610D909353086A |
:101AE0008093520882E085BD83EA84BD17BC88E7F5 |
:101AF00088BD96E096BD83EC8093B0009093B100D2 |
:101B00008091700082608093700080916E0081608F |
:101B100080936E008AE08093B3001092B200089523 |
:101B200020914F0830915008821B930B892F9927E1 |
:101B30008695807490700895CF93DF930E94610D15 |
:101B4000EC01CE010E94900D8823D9F3DF91CF9153 |
:101B500008951F920F920FB60F9211242F933F9367 |
:101B60004F935F936F937F938F939F93AF93BF93A5 |
:101B7000CF93DF93EF93FF93809106018150809381 |
:101B800006018F3F09F085C083E88093B000809103 |
:101B90006C01C82FDD27D0934908C0934808809175 |
:101BA000CD0C6091C60C80FF2AC077278827992723 |
:101BB0002091D2083091D3084091D4085091D50893 |
:101BC00057FF04C021583F4F4F4F5F4FA7E0559537 |
:101BD000479537952795AA95D1F70E941E4497FF00 |
:101BE00004C061507E4F8F4F9F4FF9E095958795C8 |
:101BF00077956795FA95D1F7C60FD71F29C0772734 |
:101C0000882799272091D2083091D3084091D40891 |
:101C10005091D50857FF04C021583F4F4F4F5F4F99 |
:101C2000E7E05595479537952795EA95D1F70E94B6 |
:101C30001E4497FF04C061507E4F8F4F9F4F39E085 |
:101C400095958795779567953A95D1F7C61BD70BEC |
:101C5000D0934908C09348088091C70C99272091D8 |
:101C60004808309149082817390734F08091C80C8A |
:101C700099278217930724F4909349088093480882 |
:101C8000809148088093B3008091C90C809306012D |
:101C900004C083E08093B0005F98FF91EF91DF91E3 |
:101CA000CF91BF91AF919F918F917F916F915F91F4 |
:101CB0004F913F912F910F900FBE0F901F9018954D |
:101CC00010927C008FEE80937A0008950F931F93FB |
:101CD000CF93DF9303E010E0D8010E94E444802D0D |
:101CE000C82FDD27C531D10508F02A97C7BD84E686 |
:101CF00090E00E949C0D809107019091080182550F |
:101D0000934010F4C0E0D0E0CA3FD105C0F4C7BD95 |
:101D100082E390E00E949C0D85E591E09F938F9374 |
:101D20001F920E94260A80910701909108010F904E |
:101D30000F900F908458934010F02196E5CFD80172 |
:101D40000C2E0E94EC44C0935B0C8CE291E00E944C |
:101D50009C0DDF91CF911F910F9108951F920F92CB |
:101D60000FB60F921124EF92FF920F931F932F93B0 |
:101D70003F934F935F936F937F938F939F93AF9313 |
:101D8000BF93CF93DF93EF93FF9310927A008091EC |
:101D90006B08682F77278F5F80936B08633071051E |
:101DA00009F4BCC1643071055CF46130710509F45B |
:101DB00071C0623071050CF00FC1672B91F0A7C3A1 |
:101DC0006530710509F4EAC1653071050CF4C1C1D3 |
:101DD0006630710509F408C26730710509F417C34C |
:101DE00096C36091E0087091E1088091780090912D |
:101DF0007900681B790B809100018A3011F0660F21 |
:101E0000771F8091640890916508860F971F9093C3 |
:101E100065088093640880915B088F5F80935B08FE |
:101E20009B01442737FD4095542F8091AE08909137 |
:101E3000AF08A091B008B091B108820F931FA41F02 |
:101E4000B51F8093AE089093AF08A093B008B093ED |
:101E5000B1088091AA089091AB08A091AC08B0910C |
:101E6000AD08820F931FA41FB51F8093AA089093FB |
:101E7000AB08A093AC08B093AD0881E080936A08EA |
:101E8000809154089091550801969093550880933D |
:101E9000540841C360917800709179008091E20804 |
:101EA0009091E308681B790B809100018A3011F052 |
:101EB000660F771F9B01442737FD4095542F809173 |
:101EC000B6089091B708A091B808B091B908820FF0 |
:101ED000931FA41FB51F8093B6089093B708A093D3 |
:101EE000B808B093B9088091B2089091B308A09156 |
:101EF000B408B091B508820F931FA41FB51F80933B |
:101F0000B2089093B308A093B408B093B508809139 |
:101F1000B6089091B708A091B808B091B908815F50 |
:101F20009A4BA440B04064F080E393E9ABEFBFEF7D |
:101F30008093B6089093B708A093B808B093B908F7 |
:101F40008091B6089091B708A091B808B091B908EF |
:101F500080519544AB4FBF4F64F480ED9CE6A4E004 |
:101F6000B0E08093B6089093B708A093B808B093F8 |
:101F7000B90880917800909179000F9710F468E18A |
:101F80007CEF8091780090917900079710F460E3DE |
:101F900078EF8091780090917900835F934010F002 |
:101FA00068EE73E080917800909179008A5F9340A9 |
:101FB00010F060ED77E08091660890916708860FD9 |
:101FC000971F909367088093660880915C088F5FE5 |
:101FD00080935C0882E0DFC06091780070917900A6 |
:101FE0008091E4089091E508681B790B80910001CD |
:101FF0008A3011F0660F771F9B01442737FD40950B |
:10200000542F8091BE089091BF08A091C008B09154 |
:10201000C108820F931FA41FB51F8093BE08909321 |
:10202000BF08A093C008B093C1088091BA089091EE |
:10203000BB08A091BC08B091BD08820F931FA41FDC |
:10204000B51F8093BA089093BB08A093BC08B093C7 |
:10205000BD088091BE089091BF08A091C008B091C2 |
:10206000C108815F9A4BA440B04064F080E393E9DB |
:10207000ABEFBFEF8093BE089093BF08A093C0085A |
:10208000B093C1088091BE089091BF08A091C0088C |
:10209000B091C10880519544AB4FBF4F64F480EDBF |
:1020A0009CE6A4E0B0E08093BE089093BF08A093A4 |
:1020B000C008B093C10880917800909179000F9783 |
:1020C00010F468E17CEF8091780090917900079797 |
:1020D00010F460E378EF8091780090917900835F4D |
:1020E000934010F068EE73E0809178009091790051 |
:1020F0008A5F934010F060ED77E0809168089091DE |
:102100006908860F971F90936908809368088091EB |
:102110005D088F5F80935D0884E03DC080910D0174 |
:1021200090910E019C01220F331F280F391F8091BF |
:102130007800909179000E944944260F371F369508 |
:1021400027953695279530930E0120930D0186E053 |
:1021500022C08091DC089091DD08209178003091B8 |
:102160007900821B930B90934F0C80934E0C8091BF |
:1021700062089091630820914E0C30914F0C820FB1 |
:10218000931F9093630880936208809159088F5F32 |
:102190008093590887E080936A08BDC180917800D8 |
:1021A000909179002091DE083091DF08821B930B1B |
:1021B00090935A0C8093590C80916008909161081B |
:1021C0002091590C30915A0C820F931F9093610803 |
:1021D0008093600880915A088F5F80935A0885E049 |
:1021E00080936A0886E010C1809178009091790010 |
:1021F000AA2797FDA095BA2FBC01CD010E945C4390 |
:102200007B018C018091D8089091D908A091DA08BF |
:10221000B091DB089C01AD01C801B7010E94B64234 |
:10222000DC01CB01BC01CD010E943F43DC01CB01AD |
:1022300090935F0880935E0880914E0C90914F0CB4 |
:1022400080914E0C90914F0C97FF03C09095819513 |
:102250009F4F97FD0396AC0155954795559547952A |
:102260008091590C90915A0C8091590C90915A0C74 |
:1022700097FF03C0909581959F4F9C0197FF02C0E7 |
:102280002D5F3F4F3595279535952795240F351FA1 |
:1022900080915E0890915F08820F931F90935F0872 |
:1022A00080935E0880915E0890915F08029724F108 |
:1022B0008091D8089091D908A091DA08B091DB08F4 |
:1022C00020E030E048E454E4BC01CD010E946643C4 |
:1022D00088230CF044C08091D8089091D908A0912F |
:1022E000DA08B091DB082AE037ED43EA5CE3BC0191 |
:1022F000CD010E94B74229C080915E0890915F088D |
:102300008F5F9F4F64F58091D8089091D908A09174 |
:10231000DA08B091DB0820E030E046E154E4BC018B |
:10232000CD010E9469431816D4F48091D808909189 |
:10233000D908A091DA08B091DB082AE037ED43EA2A |
:102340005CE3BC01CD010E94B642DC01CB0180936D |
:10235000D8089093D908A093DA08B093DB0881E0FD |
:102360008093580880917800909179009093510C57 |
:102370008093500C80915E0890915F089C014427E7 |
:1023800037FD4095542F8091A6089091A708A09101 |
:10239000A808B091A908820F931FA41FB51F8093AE |
:1023A000A6089093A708A093A808B093A908209125 |
:1023B000A6083091A7084091A8085091A90857FF96 |
:1023C00004C021503C4F4F4F5F4F7AE055954795E1 |
:1023D000379527957A95D1F78091A6089091A7080F |
:1023E000A091A808B091A908821B930BA40BB50B70 |
:1023F0008093A6089093A708A093A808B093A90873 |
:1024000083E080936A0887E080936B0884C08091A2 |
:102410005E0C90915F0C2091780030917900820FD2 |
:10242000931F90935F0C80935E0C8091560C8F5F8E |
:102430008093560C8091560C853008F468C08091CA |
:102440007800909179009093080180930701109291 |
:10245000560C8091520C9091530C20915E0C30914F |
:102460005F0C821B930B2091800830918108821BA6 |
:10247000930B909357088093560880915E0C90912F |
:102480005F0CEC01EE27D7FDE095FE2F20910901AE |
:1024900030910A0140910B0150910C01DA01C90100 |
:1024A000880F991FAA1FBB1F820F931FA41FB51F60 |
:1024B000C80FD91FEA1FFB1FF7FF03C02396E11DBA |
:1024C000F11D82E0F595E795D795C7958A95D1F7E7 |
:1024D000C0930901D0930A01E0930B01F0930C0122 |
:1024E0008091090190910A01A0910B01B0910C011A |
:1024F0009C018091520C9091530C821B930B9093F2 |
:1025000081088093800810925F0C10925E0C1092EC |
:102510006A0810926B0880916A0880937C008FEEA5 |
:1025200080937A00FF91EF91DF91CF91BF91AF91AE |
:102530009F918F917F916F915F914F913F912F91DB |
:102540001F910F91FF90EF900F900FBE0F901F9073 |
:10255000189590E2EFE0F1E08FE49193815087FFCE |
:10256000FCCF08951F93CF93DF9380916C0880FF79 |
:102570000CC080917008882311F0815002C08091B6 |
:102580006901809370080E94A91280916C0881FFF4 |
:1025900007C0809170088F5F809370080E94A91215 |
:1025A00080916C08992780FF04C081FF02C01092BF |
:1025B000700881E180936D088091700899279F933E |
:1025C0008F9387E591E09F938F9311E01F930E9473 |
:1025D000260A0F900F900F900F900F908091700827 |
:1025E000C82FDD27C530D10509F459C2C630D10541 |
:1025F000ACF4C230D10509F4DEC0C330D10534F4E7 |
:10260000209719F1219709F46EC053C4C330D10546 |
:1026100009F43FC1249709F4A7C14BC4C830D105C0 |
:1026200009F43EC3C930D10544F4C630D10509F4DC |
:10263000A5C2279709F414C33CC4C930D10509F4D5 |
:102640007BC32A9709F4E3C334C410926D088CE568 |
:1026500091E09F938F931F930E94260A84E18093B9 |
:102660006D080F900F900F9083E892E09F938F93E7 |
:10267000DF93CF93809100016AE00E943D44892F4F |
:1026800099279F938F93809100010E943D44992741 |
:102690009F938F938EE691E09F938F931F930E9459 |
:1026A000260A88E280936D088DB79EB70B960FB609 |
:1026B000F8949EBF0FBE8DBF0E943F0299279F9343 |
:1026C0008F9381E891E09F938F931F930E94260A36 |
:1026D0008CE380936D080F900F900F900F900F90E8 |
:1026E0008EE891E05FC08091AC0C80FF49C01092F1 |
:1026F0006D0880918008909181089F938F938EE957 |
:1027000091E09F938F931F930E94260A84E1809308 |
:102710006D080F900F900F900F900F9080917E0892 |
:1027200090917F089F938F938DEA91E09F938F9371 |
:102730001F930E94260A88E280936D080F900F90E5 |
:102740000F900F900F9080910701909108019F9337 |
:102750008F938CEB91E09F938F931F930E94260A97 |
:102760008CE380936D080F900F900F900F900F9057 |
:1027700080915B0C99279F938F938BEC91E0D1C252 |
:1027800084E180936D088AED91E09F938F931F936E |
:102790000E94260A88E280936D080F900F900F9098 |
:1027A00081EE91E09F938F931F930E94260A0F90D2 |
:1027B0000F900F9083C310926D088FEE91E09F935E |
:1027C0008F931F930E94260A84E180936D080F90D7 |
:1027D0000F900F908091D2089091D308A091D408C7 |
:1027E000B091D508B7FF04C081509C4FAF4FBF4F89 |
:1027F0003AE0B595A795979587953A95D1F7BF9308 |
:10280000AF939F938F9389EF91E09F938F931F9343 |
:102810000E94260A88E280936D088DB79EB70796BE |
:102820000FB6F8949EBF0FBE8DBF8091CA089091DD |
:10283000CB08A091CC08B091CD08B7FF04C081505F |
:102840009C4FAF4FBF4F2AE0B595A79597958795B9 |
:102850002A95D1F7BF93AF939F938F9388E092E02F |
:102860009F938F931F930E94260A8CE380936D0899 |
:102870008DB79EB707960FB6F8949EBF0FBE8DBF5B |
:102880008091A4089091A5089F938F9387E192E08F |
:1028900048C210926D0880916C0C90916D0C9F93C2 |
:1028A0008F9380916A0C90916B0C9F938F9386E22B |
:1028B00092E09F938F931F930E94260A84E1809356 |
:1028C0006D088DB79EB707960FB6F8949EBF0FBEE2 |
:1028D0008DBF8091700C9091710C9F938F9380911C |
:1028E0006E0C90916F0C9F938F9386E392E09F9371 |
:1028F0008F931F930E94260A88E280936D088DB7FC |
:102900009EB707960FB6F8949EBF0FBE8DBF8091FD |
:10291000740C9091750C9F938F938091720C909191 |
:10292000730C9F938F9386E492E09F938F931F93F2 |
:102930000E94260A8CE380936D088DB79EB7079698 |
:102940000FB6F8949EBF0FBE8DBF8091780C90910A |
:10295000790C9F938F938091760C9091770C9F9335 |
:102960008F9386E592E097C210926D088091A50C36 |
:10297000E82FFF27EE0FFF1FE859F34F8081918169 |
:102980009F938F938091A40CE82FFF27EE0FFF1FDA |
:10299000E859F34F808191819F938F9386E692E06F |
:1029A0009F938F931F930E94260A84E180936D0862 |
:1029B0008DB79EB707960FB6F8949EBF0FBE8DBF1A |
:1029C0008091A70CE82FFF27EE0FFF1FE859F34F68 |
:1029D000808191819F938F938091A60CE82FFF2790 |
:1029E000EE0FFF1FE859F34F808191819F938F93E2 |
:1029F00086E792E09F938F931F930E94260A88E2B6 |
:102A000080936D088DB79EB707960FB6F8949EBF5A |
:102A10000FBE8DBF8091A90CE82FFF27EE0FFF1F7F |
:102A2000E859F34F808191819F938F938091A80CF7 |
:102A3000E82FFF27EE0FFF1FE859F34F80819181A8 |
:102A40009F938F9386E892E09F938F931F930E94AA |
:102A5000260A8CE380936D088DB79EB707960FB654 |
:102A6000F8949EBF0FBE8DBF8091AB0CE82FFF275F |
:102A7000EE0FFF1FE859F34F808191819F938F9351 |
:102A80008091AA0CE82FFF27EE0FFF1FE859F34FA4 |
:102A9000808191819F938F9386E992E0FCC110928F |
:102AA0006D0886EA92E09F938F931F930E94260AF7 |
:102AB00084E180936D080F900F900F908091E4084F |
:102AC0009091E5089F938F9380915D08282F33277D |
:102AD0008091680890916908B9010E945D447F93D4 |
:102AE0006F9384EB92E09F938F931F930E94260A2B |
:102AF00088E280936D088DB79EB707960FB6F8945D |
:102B00009EBF0FBE8DBF8091E2089091E3089F9316 |
:102B10008F9380915C08282F3327809166089091CD |
:102B20006708B9010E945D447F936F9383EC92E044 |
:102B30009F938F931F930E94260A8CE380936D08C6 |
:102B40008DB79EB707960FB6F8949EBF0FBE8DBF88 |
:102B50008091E0089091E1089F938F9380915B08AA |
:102B6000282F33278091640890916508B9010E944D |
:102B70005D447F936F9382ED92E08DC110926D085A |
:102B800081EE92E09F938F931F930E94260A84E127 |
:102B900080936D080F900F900F908091DE089091B8 |
:102BA000DF089F938F9380915A08282F33278091B5 |
:102BB000600890916108B9010E945D447F936F9312 |
:102BC0008EEE92E09F938F931F930E94260A88E2D5 |
:102BD00080936D088DB79EB707960FB6F8949EBF89 |
:102BE0000FBE8DBF8091DC089091DD089F938F937D |
:102BF00080915908282F33278091620890916308AB |
:102C0000B9010E945D447F936F938DEF92E09F9393 |
:102C10008F931F930E94260A8CE380936D088DB7D3 |
:102C20009EB707960FB6F8949EBF0FBE8DBF8091DA |
:102C3000D8089091D908A091DA08B091DB08BC01BE |
:102C4000CD010E943F43DC01CB019F938F93809184 |
:102C5000500C9091510C9F938F938CE093E01BC18B |
:102C600084E180936D0880910D0190910E019F93F6 |
:102C70008F938BE193E09F938F931F930E94260A7B |
:102C800088E280936D080F900F900F900F900F9037 |
:102C90008091890899279F938F938AE293E041C09E |
:102CA00010926D0889E393E09F938F931F930E9486 |
:102CB000260A84E180936D080F900F900F90809109 |
:102CC000A0089091A1089F938F9388E493E09F932D |
:102CD0008F931F930E94260A88E280936D080F90BD |
:102CE0000F900F900F900F908091A4089091A508DD |
:102CF0009F938F9387E593E09F938F931F930E94F9 |
:102D0000260A8CE380936D080F900F900F900F9020 |
:102D10000F908091A2089091A3089F938F9386E6CD |
:102D200093E09F938F931F930E94260A0F900F901A |
:102D30000F900F900F90C2C010926D088091900874 |
:102D4000909191089F938F93809198089091990802 |
:102D50009F938F9385E793E09F938F931F930E9498 |
:102D6000260A84E180936D088DB79EB707960FB64B |
:102D7000F8949EBF0FBE8DBF80918E0890918F08F2 |
:102D80009F938F9380919608909197089F938F932C |
:102D900087E893E09F938F931F930E94260A88E20F |
:102DA00080936D088DB79EB707960FB6F8949EBFB7 |
:102DB0000FBE8DBF80918C0890918D089F938F934B |
:102DC00080919408909195089F938F9389E993E05F |
:102DD0009F938F931F930E94260A8CE380936D0824 |
:102DE0008DB79EB707960FB6F8949EBF0FBE8DBFE6 |
:102DF00080918A0890918B089F938F93809192087D |
:102E0000909193089F938F938BEA93E044C0109224 |
:102E10006D088DEB93E09F938F931F930E94260A7A |
:102E200084E180936D080F900F900F9080916C015A |
:102E300099279F938F9385EC93E09F938F931F9394 |
:102E40000E94260A88E280936D080F900F900F90E1 |
:102E50000F900F9080914808909149089F938F930D |
:102E600083ED93E09F938F931F930E94260A8CE338 |
:102E700080936D080F900F900F900F900F9080919E |
:102E8000C80C99279F938F938091C70C99279F9384 |
:102E90008F9381EE93E09F938F931F930E94260A56 |
:102EA0008DB79EB707960FB6F8949EBF0FBE8DBF25 |
:102EB00005C08150809369011092700810926C08CF |
:102EC000DF91CF911F9108951092B9008AE280930B |
:102ED000B800089585EA8093BC0080E090E00895F2 |
:102EE00084E98093BC0008951092B9008093BB00E0 |
:102EF00085E88093BC0080E090E008950E94701700 |
:102F0000109273088091BB001092720880E8809341 |
:102F1000BC001092BD001092BA001092BB0010923B |
:102F2000B9001092B8000E9464170E946A1780E0EE |
:102F30000E94741708951F920F920FB60F921124DA |
:102F40002F933F934F935F936F937F938F939F93B1 |
:102F5000AF93BF93EF93FF9380917308282F33278C |
:102F60008F5F809373082330310509F446C0243005 |
:102F700031054CF421303105D1F0223031057CF59A |
:102F8000232B81F083C025303105E1F12530310557 |
:102F90000CF441C026303105F1F12730310509F438 |
:102FA0005AC074C080917208880F8E5A51C08091A7 |
:102FB0007208282F33278F5F8093720821303105E4 |
:102FC00009F43EC0223031051CF4232BB1F15EC060 |
:102FD00022303105C1F123303105C1F157C00E94C3 |
:102FE000701780917208843018F41092730802C030 |
:102FF000109272080E946A1749C080917108880F68 |
:103000008D5A26C080917108E82FFF27E05AF34FB0 |
:103010008091BB0080838091710899278130910550 |
:1030200079F0823091051CF4892B39F02FC0823061 |
:10303000910549F0039751F029C08091630908C0B8 |
:103040008091640905C08091690902C080916F096F |
:103050000E9474171BC090917108E92FFF27E05A56 |
:10306000F34F8091BB008483892F8F5F8093710819 |
:10307000843010F0109271080E9470178AE090E07E |
:1030800090937F0180937E01109273088091BC0021 |
:1030900080688093BC00FF91EF91BF91AF919F91A9 |
:1030A0008F917F916F915F914F913F912F910F90F1 |
:1030B0000FBE0F901F90189583EC80938100809134 |
:1030C0006F00806280936F001092E1081092E00818 |
:1030D0001092E3081092E2081092E5081092E408BA |
:1030E00008951F920F920FB60F9211242F933F93C2 |
:1030F0004F935F936F937F938F939F93AF93BF9300 |
:10310000EF93FF934091860050918700809174085F |
:1031100090917508481B590B80918600909187000B |
:103120009093750880937408CA018D5D954083560D |
:10313000994148F481E090E0909377088093760875 |
:1031400010926A016FC020917608309177082E3076 |
:1031500031050CF067C0CA018B5F9040845B9140E1 |
:1031600008F043C0425D5140F901E20FF31FE859F6 |
:10317000F34F80819181BA01681B790BCB0177FFF6 |
:1031800003C0909581959F4F06974CF480918908D4 |
:10319000883C28F480918908865F80938908F9012A |
:1031A000E20FF31FDF01A859B34F8D919C91119746 |
:1031B0009C01220F331F280F391F240F351F37FFA3 |
:1031C00002C02D5F3F4FC9019595879595958795CD |
:1031D000EA57F34F2D913C911197AC01421B530BD1 |
:1031E0005183408311969C938E93809176089091A1 |
:1031F000770801969093770880937608059711F4E5 |
:103200005D9A01C05D98809176089091770886302C |
:10321000910511F45C9A01C05C98079711F45B9AD0 |
:1032200001C05B98FF91EF91BF91AF919F918F91FA |
:103230007F916F915F914F913F912F910F900FBEB2 |
:103240000F901F901895CF93C82FC150CF3F81F09A |
:1032500080918208882361F484E690E090934B0883 |
:1032600080934A088AEF90E00E949C0DC15080F73D |
:10327000CF91089510927A0080915D08882379F0AB |
:1032800080915D08282F3327809168089091690804 |
:10329000B9010E945D447093E10C6093E00C809151 |
:1032A0005C08882379F080915C08282F332780916F |
:1032B000660890916708B9010E945D447093DF0C25 |
:1032C0006093DE0C80915B08882379F080915B0825 |
:1032D000282F33278091640890916508B9010E94D6 |
:1032E0005D447093ED0C6093EC0C80915A08882338 |
:1032F000E1F08091600890916108AA2797FDA09560 |
:10330000BA2F34E0880F991FAA1FBB1F3A95D1F737 |
:1033100020915A08332744275527BC01CD010E942C |
:1033200092443093EA0C2093E90C80915908882349 |
:10333000E1F08091620890916308AA2797FDA0951B |
:10334000BA2F24E0880F991FAA1FBB1F2A95D1F717 |
:1033500020915908332744275527BC01CD010E94ED |
:1033600092443093F30C2093F20C809158088823F8 |
:10337000A9F080915E0890915F08AA2797FDA0951B |
:10338000BA2F20915808332744275527BC01CD0177 |
:103390000E9492443093E40C2093E30C109269084D |
:1033A0001092680810925D081092670810926608E3 |
:1033B00010925C08109265081092640810925B08E5 |
:1033C00010926308109262081092590810926108D6 |
:1033D0001092600810925A0810925F0810925E08CE |
:1033E000109258088FEE80937A008091A80CE82FF5 |
:1033F000FF27EE0FFF1FE859F34F8081918182591B |
:103400009F4F2091980830919908281739071CF48C |
:103410002F5F3F4F0CC08081918182599F4F82174F |
:1034200093074CF42115310531F021503040309391 |
:103430009908209398088091A90CE82FFF27EE0F98 |
:10344000FF1FE859F34F8081918182599F4F20914E |
:10345000960830919708281739071CF42F5F3F4FC3 |
:103460000CC08081918182599F4F821793074CF441 |
:103470002115310531F021503040309397082093C9 |
:1034800096088091AA0CE82FFF27EE0FFF1FE8593E |
:10349000F34F8081918182599F4F20919408309100 |
:1034A0009508281739071CF42F5F3F4F0CC0808107 |
:1034B000918182599F4F821793074CF42115310552 |
:1034C00031F021503040309395082093940880913A |
:1034D000AB0CE82FFF27EE0FFF1FE859F34F808159 |
:1034E000918182599F4F209192083091930828171B |
:1034F00039071CF42F5F3F4F0CC0808191818259A6 |
:103500009F4F821793074CF42115310531F021505C |
:103510003040309393082093920880917A0C9091D8 |
:103520007B0C82599F4F2091900830919108281769 |
:1035300039071CF42F5F3F4F0EC080917A0C909199 |
:103540007B0C82599F4F821793074CF4211531054C |
:1035500031F02150304030939108209390088091B1 |
:103560007C0C90917D0C82599F4F20918E08309158 |
:103570008F08281739071CF42F5F3F4F0EC080912A |
:103580007C0C90917D0C82599F4F821793074CF4CD |
:103590002115310531F02150304030938F082093B0 |
:1035A0008E0880917E0C90917F0C82599F4F2091C4 |
:1035B0008C0830918D08281739071CF42F5F3F4F76 |
:1035C0000EC080917E0C90917F0C82599F4F821784 |
:1035D00093074CF42115310531F0215030403093E0 |
:1035E0008D0820938C088091800C9091810C8259D9 |
:1035F0009F4F20918A0830918B08281739071CF4B7 |
:103600002F5F3F4F0EC08091800C9091810C8259AA |
:103610009F4F821793074CF42115310531F021504B |
:10362000304030938B0820938A08809198089091BD |
:10363000990897FF05C010929908109298080AC03F |
:103640008F3F910539F034F08FEF90E09093990817 |
:1036500080939808809196089091970897FF05C0ED |
:1036600010929708109296080AC08F3F910539F082 |
:1036700034F08FEF90E090939708809396088091B4 |
:1036800094089091950897FF05C0109295081092A4 |
:1036900094080AC08F3F910539F034F08FEF90E025 |
:1036A0009093950880939408809192089091930844 |
:1036B00097FF05C010929308109292080AC08F3F9E |
:1036C000910539F034F08FEF90E090939308809358 |
:1036D0009208809190089091910897FF05C01092F0 |
:1036E0009108109290080AC08F3F910539F034F08C |
:1036F0008FEF90E0909391088093900880918E08CE |
:1037000090918F0897FF05C010928F0810928E0835 |
:103710000AC08F3F910539F034F08FEF90E090931D |
:103720008F0880938E0880918C0890918D0897FF68 |
:1037300005C010928D0810928C080AC08F3F910529 |
:1037400039F034F08FEF90E090938D0880938C08DF |
:1037500080918A0890918B0897FF05C010928B0882 |
:1037600010928A0808958F3F910539F034F08FEF59 |
:1037700090E090938B0880938A080895CF93DF930D |
:103780001092DF081092DE081092DD081092DC081B |
:1037900080E090E0A0E0B0E08093D8089093D90852 |
:1037A000A093DA08B093DB081092E5081092E408C1 |
:1037B0001092E3081092E2081092E1081092E008DB |
:1037C0000E943A1985E090E00E94610DEC01CE0163 |
:1037D0000E94900D8823D9F30E943A198091AC0C75 |
:1037E00080FF10C08091070190910801875B934092 |
:1037F00038F480910701909108018E5E924010F498 |
:103800000E94660E809100018A3081F58091E00C63 |
:103810009091E10C8091E00C9091E10C97FF03C036 |
:10382000909581959F4F9093E5088093E40880914F |
:10383000DE0C9091DF0C8091DE0C9091DF0C97FFF5 |
:1038400003C0909581959F4F9093E3088093E20881 |
:103850008091EC0C9091ED0C8091EC0C9091ED0C22 |
:1038600097FF3FC0909581959F4F3BC08091E00CA2 |
:103870009091E10C8091E00C9091E10C97FF03C0D6 |
:10388000909581959F4F97FD01969595879590937B |
:10389000E5088093E4088091DE0C9091DF0C809124 |
:1038A000DE0C9091DF0C97FF03C0909581959F4FA0 |
:1038B00097FD0196959587959093E3088093E2088C |
:1038C0008091EC0C9091ED0C8091EC0C9091ED0CB2 |
:1038D00097FF03C0909581959F4F97FD0196959511 |
:1038E00087959093E1088093E0088091F20C909185 |
:1038F000F30C8091F20C9091F30C97FF03C090951C |
:1039000081959F4F97FD0F9654E0959587955A9511 |
:10391000E1F79093DD088093DC088091E90C9091A9 |
:10392000EA0C8091E90C9091EA0C97FF03C0909506 |
:1039300081959F4F97FD0F9644E0959587954A9501 |
:10394000E1F79093DF088093DE088091500C90910E |
:10395000510CAA2797FDA095BA2FBC01CD010E945A |
:103960005C43DC01CB018093D8089093D908A093E5 |
:10397000DA08B093DB081092BE081092BF081092CC |
:10398000C0081092C1081092BA081092BB08109299 |
:10399000BC081092BD081092B6081092B708109299 |
:1039A000B8081092B9081092B2081092B308109299 |
:1039B000B4081092B5081092AE081092AF08109299 |
:1039C000B0081092B1081092E10C1092E00C109225 |
:1039D000DF0C1092DE0C1092ED0C1092EC0C80912A |
:1039E000090190910A01A0910B01B0910C019093F3 |
:1039F000530C8093520C1092570810925608109254 |
:103A0000A6081092A7081092A8081092A908809101 |
:103A1000A4089091A5089093A3088093A20882E33C |
:103A200090E090934B0880934A08DF91CF910895DE |
:103A3000EF92FF920F931F9310927A0080915D088E |
:103A4000882379F080915D08282F332780916808BA |
:103A500090916908B9010E945D447093E10C6093F4 |
:103A6000E00C80915C08882379F080915C08282F15 |
:103A700033278091660890916708B9010E945D44E0 |
:103A80007093DF0C6093DE0C80915B08882379F0E3 |
:103A900080915B08282F33278091640890916508F6 |
:103AA000B9010E945D447093ED0C6093EC0C809121 |
:103AB0005A08882309F446C08091E90C9091EA0CD9 |
:103AC000AA2797FDA095BA2F7C018D01E3E0EE0CAB |
:103AD000FF1C001F111FEA95D1F7E81AF90A0A0B1B |
:103AE0001B0B8091600890916108AA2797FDA09513 |
:103AF000BA2F74E0880F991FAA1FBB1F7A95D1F7C0 |
:103B000020915A08332744275527BC01CD010E9434 |
:103B10009244E20EF31E041F151F17FF08C087E032 |
:103B200090E0A0E0B0E0E80EF91E0A1F1B1F63E062 |
:103B300015950795F794E7946A95D1F7F092EA0CFA |
:103B4000E092E90C80915908882309F446C08091DD |
:103B5000F20C9091F30CAA2797FDA095BA2F7C0147 |
:103B60008D0153E0EE0CFF1C001F111F5A95D1F779 |
:103B7000E81AF90A0A0B1B0B8091620890916308FE |
:103B8000AA2797FDA095BA2F44E0880F991FAA1F76 |
:103B9000BB1F4A95D1F72091590833274427552751 |
:103BA000BC01CD010E949244E20EF31E041F151FBA |
:103BB00017FF08C087E090E0A0E0B0E0E80EF91E33 |
:103BC0000A1F1B1F33E015950795F794E7943A9564 |
:103BD000D1F7F092F30CE092F20C80915808882310 |
:103BE00009F43FC08091E30C9091E40CAA2797FD63 |
:103BF000A095BA2F7C018D0123E0EE0CFF1C001F65 |
:103C0000111F2A95D1F7E81AF90A0A0B1B0B8091AC |
:103C10005E0890915F08AA2797FDA095BA2F209182 |
:103C20005808332744275527BC01CD010E949244F0 |
:103C3000E20EF31E041F151F17FF08C087E090E077 |
:103C4000A0E0B0E0E80EF91E0A1F1B1FF3E0159577 |
:103C50000795F794E794FA95D1F7F092E40CE09287 |
:103C6000E30C109269081092680810925D08109297 |
:103C700067081092660810925C081092650810920E |
:103C8000640810925B081092630810926208109208 |
:103C90005908109261081092600810925A08109208 |
:103CA0005F0810925E08109258088091AE089091BB |
:103CB000AF08A091B008B091B1088093C20890936A |
:103CC000C308A093C408B093C5088091BE08909122 |
:103CD000BF08A091C008B091C1088093D20890930A |
:103CE000D308A093D408B093D5088091B6089091DA |
:103CF000B708A091B808B091B9088093CA0890930A |
:103D0000CB08A093CC08B093CD088091BA089091CD |
:103D1000BB08A091BC08B091BD088093CE089093D9 |
:103D2000CF08A093D008B093D1088091B2089091A9 |
:103D3000B308A091B408B091B5088093C6089093D9 |
:103D4000C708A093C808B093C9088FEE80937A0083 |
:103D50008091A80CE82FFF27EE0FFF1FE859F34FC3 |
:103D60008081918182599F4F2091980830919908C4 |
:103D7000281739071CF42F5F3F4F0CC080819181B9 |
:103D800082599F4F821793074CF42115310531F06A |
:103D90002150304030939908209398088091A90CC5 |
:103DA000E82FFF27EE0FFF1FE859F34F8081918125 |
:103DB00082599F4F2091960830919708281739070C |
:103DC0001CF42F5F3F4F0CC08081918182599F4F1F |
:103DD000821793074CF42115310531F02150304002 |
:103DE00030939708209396088091AA0CE82FFF271C |
:103DF000EE0FFF1FE859F34F8081918182599F4F49 |
:103E00002091940830919508281739071CF42F5FEA |
:103E10003F4F0CC08081918182599F4F8217930739 |
:103E20004CF42115310531F0215030403093950884 |
:103E3000209394088091AB0CE82FFF27EE0FFF1F13 |
:103E4000E859F34F8081918182599F4F20919208C8 |
:103E500030919308281739071CF42F5F3F4F0CC08F |
:103E60008081918182599F4F821793074CF42115CD |
:103E7000310531F02150304030939308209392085F |
:103E800080917A0C90917B0C82599F4F20919008E1 |
:103E900030919108281739071CF42F5F3F4F0EC04F |
:103EA00080917A0C90917B0C82599F4F82179307D7 |
:103EB0004CF42115310531F02150304030939108F8 |
:103EC0002093900880917C0C90917D0C82599F4F9B |
:103ED00020918E0830918F08281739071CF42F5F26 |
:103EE0003F4F0EC080917C0C90917D0C82599F4F6A |
:103EF000821793074CF42115310531F021503040E1 |
:103F000030938F0820938E0880917E0C90917F0CC7 |
:103F100082599F4F20918C0830918D0828173907BE |
:103F20001CF42F5F3F4F0EC080917E0C90917F0C50 |
:103F300082599F4F821793074CF42115310531F0B8 |
:103F40002150304030938D0820938C088091800C54 |
:103F50009091810C82599F4F20918A0830918B0853 |
:103F6000281739071CF42F5F3F4F0EC08091800C3B |
:103F70009091810C82599F4F821793074CF4211521 |
:103F8000310531F02150304030938B0820938A085E |
:103F9000809198089091990897FF05C01092990810 |
:103FA000109298080AC08F3F910539F034F08FEFD6 |
:103FB00090E090939908809398088091960890914A |
:103FC000970897FF05C010929708109296080AC0AC |
:103FD0008F3F910539F034F08FEF90E09093970880 |
:103FE00080939608809194089091950897FF05C05A |
:103FF00010929508109294080AC08F3F910539F0ED |
:1040000034F08FEF90E0909395088093940880911E |
:1040100092089091930897FF05C010929308109210 |
:1040200092080AC08F3F910539F034F08FEF90E08D |
:1040300090939308809392088091900890919108B2 |
:1040400097FF05C010929108109290080AC08F3F08 |
:10405000910539F034F08FEF90E0909391088093C0 |
:10406000900880918E0890918F0897FF05C010925C |
:104070008F0810928E080AC08F3F910539F034F0F6 |
:104080008FEF90E090938F0880938E0880918C083A |
:1040900090918D0897FF05C010928D0810928C08A2 |
:1040A0000AC08F3F910539F034F08FEF90E0909384 |
:1040B0008D0880938C0880918A0890918B0897FFD7 |
:1040C00005C010928B0810928A080AC08F3F910594 |
:1040D00039F034F08FEF90E090938B0880938A084A |
:1040E0001F910F91FF90EF9008958091820888238F |
:1040F00001F5809364098093630980936909809333 |
:104100006F0980913008882311F0809363098091B2 |
:104110003108882311F08093640980913208882344 |
:1041200011F080936F0980913308882311F08093F8 |
:10413000690910927308109272080E946A17089514 |
:1041400087E08093A40C86E08093A50C35E0309343 |
:10415000A60C48E04093A70C81E08093A80C82E075 |
:104160008093A90C83E08093AA0C94E09093AB0C0D |
:104170001092AC0C8EE18093AD0C8BEF8093AF0C62 |
:104180008AE08093B00C22E32093AE0C2093B20C13 |
:104190009093B10C9093B30C4093B40C80E1809356 |
:1041A000B50C3093B60C8AEF8093B70C8AE18093FC |
:1041B000B80C80E88093B90C88E78093BA0C96E934 |
:1041C0009093BB0C8FE58093BC0C83E28093BD0C75 |
:1041D00084E18093BE0C1092BF0C1092C00C109220 |
:1041E000C10C1092C20C1092C30C1092C40C84E645 |
:1041F0008093C50C88E28093C60C1092CD0C20935E |
:10420000C70C9093C80C3093C90C2093CA0C8AE554 |
:104210008093CB0C1092CC0C8CE0A0E8B1E0E2EDE6 |
:10422000FCE00D9001928A95E1F7089587E0809374 |
:10423000A40C86E08093A50C45E04093A60C88E092 |
:104240008093A70C81E08093A80C32E03093A90CF6 |
:1042500083E08093AA0C24E02093AB0C1092AC0C6A |
:104260008EE18093AD0C8BEF8093AF0C8AE080934E |
:10427000B00C92E39093AE0C9093B20C3093B10CCF |
:104280002093B30C1092B40C80E18093B50C409352 |
:10429000B60C8AEF8093B70C8AE18093B80C80E863 |
:1042A0008093B90C8FEA8093BA0C8093BB0C8FE596 |
:1042B0008093BC0C83E28093BD0C84E18093BE0CA0 |
:1042C0001092BF0C1092C00C1092C10C1092C20C34 |
:1042D0001092C30C1092C40C84E68093C50C88E243 |
:1042E0008093C60C1092CD0C9093C70C86E98093F6 |
:1042F000C80C4093C90C9093CA0C8AE58093CB0CF0 |
:104300001092CC0C8CE0A7E8B1E0E2EDFCE00D905F |
:1043100001928A95E1F708951F938091AF0C8B3F2E |
:1043200098F08B3F19F4809198080EC08C3F19F4D7 |
:104330008091960809C08D3F19F48091940804C0BB |
:104340008E3F21F4809192088093740180917401D2 |
:10435000882321F08F3F11F4809374018091AE0C7B |
:104360008B3F98F08B3F19F4809198080EC08C3FDA |
:1043700019F48091960809C08D3F19F48091940832 |
:1043800004C08E3F21F48091920880937501809142 |
:104390007501882329F0843618F084E6809375012E |
:1043A0008091B00C8B3F98F08B3F19F48091980866 |
:1043B0000EC08C3F19F48091960809C08D3F19F406 |
:1043C0008091940804C08E3F21F4809192088093DC |
:1043D000730180917301882329F0843618F084E6F4 |
:1043E000809373018091B20C8B3F98F08B3F19F44E |
:1043F000809198080EC08C3F19F48091960809C0EE |
:104400008D3F19F48091940804C08E3F21F480916F |
:1044100092088093720180917201882321F08F3F6E |
:1044200011F4809372018091B90C8B3F98F08B3F0F |
:1044300019F4809198080EC08C3F19F48091960869 |
:1044400009C08D3F19F48091940804C08E3F21F477 |
:10445000809192088093710180917101882321F0ED |
:104460008F3F11F4809371018091BA0C8B3F98F0CB |
:104470008B3F19F4809198080EC08C3F19F48091FD |
:10448000960809C08D3F19F48091940804C08E3FAE |
:1044900021F48091920880937001809170018B309B |
:1044A00010F48AE002C08F3F11F480937001809174 |
:1044B000BB0C8B3F98F08B3F19F4809198080EC08D |
:1044C0008C3F19F48091960809C08D3F19F48091B2 |
:1044D000940804C08E3F21F48091920880936F016C |
:1044E00080916F01882321F08F3F11F480936F0139 |
:1044F0008091C00C8B3F98F08B3F19F48091980805 |
:104500000EC08C3F19F48091960809C08D3F19F4B4 |
:104510008091940804C08E3F21F48091920880938A |
:104520006D0180916D01882321F08F3F11F48093FC |
:104530006D018091C10C8B3F98F08B3F19F48091F5 |
:1045400098080EC08C3F19F48091960809C08D3FE1 |
:1045500019F48091940804C08E3F21F48091920850 |
:1045600080937B0880917B08882321F08F3F11F492 |
:1045700080937B088091C20C8B3F98F08B3F19F49D |
:10458000809198080EC08C3F19F48091960809C05C |
:104590008D3F19F48091940804C08E3F21F48091DE |
:1045A000920880937A0880917A08882321F08F3FBF |
:1045B00011F480937A088091C30C8B3F98F08B3F65 |
:1045C00019F4809198080EC08C3F19F480919608D8 |
:1045D00009C08D3F19F48091940804C08E3F21F4E6 |
:1045E000809192088093790880917908882321F03E |
:1045F0008F3F11F4809379088091C40C8B3F98F021 |
:104600008B3F19F4809198080EC08C3F19F480916B |
:10461000960809C08D3F19F48091940804C08E3F1C |
:1046200021F48091920880937808809178088823FB |
:1046300021F08F3F11F4809378089091C50C9B3F37 |
:10464000B0F09B3F19F4809198080EC09C3F19F47C |
:104650008091960809C09D3F19F48091940804C088 |
:104660009E3F39F48091920880936C0102C0909330 |
:104670006C0180916C01882321F08F3F11F48093AD |
:104680006C019B3FB0F09B3F19F4809198080EC0DD |
:104690009C3F19F48091960809C09D3F19F48091C0 |
:1046A000940804C09E3F39F48091920880936C0175 |
:1046B00002C090936C0180916C01882321F08F3FA0 |
:1046C00011F480936C019B3FB0F09B3F19F48091F3 |
:1046D00098080EC09C3F19F48091960809C09D3F30 |
:1046E00019F48091940804C09E3F39F48091920897 |
:1046F00080936C0102C090936C0180916C018823BF |
:1047000021F08F3F11F480936C018091CA0C8B3F94 |
:1047100098F08B3F19F4809198080EC08C3F19F4E3 |
:104720008091960809C08D3F19F48091940804C0C7 |
:104730008E3F21F48091920880936B0180916B01F0 |
:10474000882321F08F3F11F480936B0110916D014C |
:10475000812F992787FD9095A92FB92FBC01CD01F5 |
:104760000E945C4317FF06C020E030E040E853E4BD |
:104770000E94B74227E137EB41ED58E30E94D64350 |
:10478000DC01CB018093760190937701A0937801AF |
:10479000B09379018091B70C8093EB0C8091B60CAB |
:1047A0008093E20C1F9108958F929F92AF92BF92D7 |
:1047B000CF92DF92EF92FF920F931F93CF93DF93ED |
:1047C0000E94181D299A8091A60CE82FFF27EE0F52 |
:1047D000FF1FE859F34F8080918028E730E0820E78 |
:1047E000931E97FE02C088249924809189088436FC |
:1047F00008F05EC080910101882399F48091030143 |
:10480000909104018F5F9F4F61F488E99AE3909340 |
:104810004B0880934A0880E09CE0909304018093C9 |
:1048200003018091FA089091FB08009731F00197FD |
:104830009093FB088093FA0804C0109282081092AB |
:104840009F08809100018A3011F4289A01C02898AD |
:104850008091FF0890910009815D974030F180912F |
:10486000BD0C882E992481E080939F088091A40C30 |
:10487000E82FFF27EE0FFF1FE859F34F1182108238 |
:104880008091A50CE82FFF27EE0FFF1FE859F34F8B |
:10489000118210828091A70CE82FFF27EE0FFF1FD7 |
:1048A000E859F34F11821082E8C110928208E5C1E5 |
:1048B000809189088D3808F4E0C110929F0890918A |
:1048C000BE0C82E3989FC00111249093FB08809353 |
:1048D000FA0859E285169104ACF08091FF08909196 |
:1048E00000096FEF8F3F960729F00196909300091A |
:1048F0008093FF088091FF089091000990939C0895 |
:1049000080939B088091FF0890910009883C910555 |
:1049100020F078E28716910404F51092E6081092D0 |
:10492000E7081092E8081092E9081092EA0810923D |
:10493000EB081092EC081092ED081092AE0810925D |
:10494000AF081092B0081092B1081092AA08109205 |
:10495000AB081092AC081092AD0889EC881691044F |
:104960000CF4EBC020918208222309F0E6C080916C |
:10497000A70CE82FFF27EE0FFF1FE859F34F8081A8 |
:1049800091818C3491050CF4D6C08091FC088F5F26 |
:104990008093FC08893C08F4D0C029982093FC0837 |
:1049A000109200091092FF083091A40CE32FFF270A |
:1049B000EE0FFF1FE859F34F8081918187349105F5 |
:1049C000B4F48091A50CE82FFF27EE0FFF1FE859E4 |
:1049D000F34F808191810190F081E02DF7FF03C0BA |
:1049E000F095E195FF4FE734F1050CF482C020917A |
:1049F000A50CE22FFF27EE0FFF1FE859F34F808130 |
:104A000091818734910564F0E32FFF27EE0FFF1F9C |
:104A1000E859F34F80819181863491050CF4C1E00F |
:104A2000E22FFF27EE0FFF1FE859F34F808191819E |
:104A30008734910574F08091A40CE82FFF27EE0FC6 |
:104A4000FF1FE859F34F80819181873491050CF065 |
:104A5000C2E0E22FFF27EE0FFF1FE859F34F8081DE |
:104A600091818634910574F48091A40CE82FFF277E |
:104A7000EE0FFF1FE859F34F808191818734910534 |
:104A80000CF0C3E0E22FFF27EE0FFF1FE859F34FB2 |
:104A9000808191818A5B9F4F74F48091A40CE82FF0 |
:104AA000FF27EE0FFF1FE859F34F80819181873474 |
:104AB00091050CF0C4E0E22FFF27EE0FFF1FE8592D |
:104AC000F34F808191818A5B9F4F74F48091A40C95 |
:104AD000E82FFF27EE0FFF1FE859F34F80819181E8 |
:104AE000863491050CF4C5E0A2E0B0E00C2E0E94E3 |
:104AF000EC448091AC0C80FF10C080910701909134 |
:104B00000801875B934038F4809107019091080178 |
:104B10008E5E924010F40E94660E0E943F024AE3AD |
:104B200064EA7CE00E9415020E94BE1B0E943F02C4 |
:104B30000E94231902C02093FC0873E28716910497 |
:104B40000CF09BC02091A70CE22FFF27EE0FFF1F58 |
:104B5000E859F34F80819181855B9F4F0CF06DC0C8 |
:104B60008091FD088F5F8093FD08893C08F467C041 |
:104B700088EC8093FD0881E090E090930009809399 |
:104B8000FF0881E0809382081092EE081092EF08EF |
:104B90001092F0081092F1081092AE081092AF082F |
:104BA0001092B0081092B1081092AA081092AB08A7 |
:104BB0001092AC081092AD081092BE081092BF0877 |
:104BC0001092C0081092C1081092B6081092B7084F |
:104BD0001092B8081092B9088091D2089091D30829 |
:104BE000A091D408B091D5088093BA089093BB08DF |
:104BF000A093BC08B093BD088091CA089091CB08DF |
:104C0000A091CC08B091CD088093B2089093B308DE |
:104C1000A093B408B093B5081092E6081092E70884 |
:104C20001092E8081092E9081092EA081092EB0836 |
:104C30001092EC081092ED0802C01092FD08E22FCD |
:104C4000FF27EE0FFF1FE859F34F808191818C34CD |
:104C500091058CF08091FE088F5F8093FE08893C5F |
:104C600060F01092820888EC8093FE081092000990 |
:104C70001092FF0802C01092FE0880916A018150D4 |
:104C800080936A0180916A018F3F29F080919F088B |
:104C9000882309F4BEC10E948C218091A40CE82FC6 |
:104CA000FF27EE0FFF1FDF01A859B34F0091B30C90 |
:104CB000C02FDD278D919C918C9F70018D9FF00CF2 |
:104CC0009C9FF00C1124EA57F34F8091B40C482FAD |
:104CD000552780819181849FB001859F700D949F9D |
:104CE000700D1124E60EF71EF0928808E0928708F6 |
:104CF0008091A50CE82FFF27EE0FFF1FDF01A859B9 |
:104D0000B34F8D919C918C9F90018D9F300D9C9FF6 |
:104D1000300D1124EA57F34F80819181849FB001B7 |
:104D2000859F700D949F700D1124260F371F3093AF |
:104D30008608209385088091A70CE82FFF27EE0FA7 |
:104D4000FF1FE859F34F80819181909581959F4F86 |
:104D5000909384088093830810917001812F992784 |
:104D600087FD9095A92FB92FBC01CD010E945C430E |
:104D700017FF06C020E030E040E853E40E94B7424D |
:104D800020E030E040E251E40E94B742DC01CB0178 |
:104D900020E030E040E85BE3BC01CD010E94D64357 |
:104DA0005B016C016093EE0C7093EF0C8093F00C40 |
:104DB0009093F10C10916F01812F992787FD9095A9 |
:104DC000A92FB92FBC01CD010E945C4317FF06C07B |
:104DD00020E030E040E853E40E94B74220E030EEAB |
:104DE0004BE257E40E94F942DC01CB018093E50CD1 |
:104DF0009093E60CA093E70CB093E80C8091AC0C78 |
:104E000082FF0CC080E090E0A0E0B0E08093E50C71 |
:104E10009093E60CA093E70CB093E80C20E030E010 |
:104E200040E050E0C601B5010E946643882364F467 |
:104E300080E090E0A0E0B0E08093EE0C9093EF0C67 |
:104E4000A093F00CB093F10C8091E50C9091E60CDE |
:104E5000A091E70CB091E80C20E030E040E050E099 |
:104E6000BC01CD010E946643882364F480E090E099 |
:104E7000A0E0B0E08093E50C9093E60CA093E70CE3 |
:104E8000B093E80C8091CC0C992782FDAEC083FDD5 |
:104E9000ACC08091D2089091D308A091D408B09171 |
:104EA000D50881569A4EA040B040DCF0CE0123E0F8 |
:104EB000880F991F2A95E1F79701281B390B30932A |
:104EC0008808209387088091D2089091D308A091F8 |
:104ED000D408B091D50881589843A140B04094F1CE |
:104EE00026C08091D2089091D308A091D408B091A7 |
:104EF000D508805A9541AF4FBF4F24F59E0113E06E |
:104F0000220F331F1A95E1F72E0D3F1D30938808AD |
:104F1000209387088091D2089091D308A091D4085B |
:104F2000B091D50881589843A140B0405CF0B4E0FE |
:104F3000CC0FDD1FBA95E1F72C1B3D0B3093880891 |
:104F4000209387088091CA089091CB08A091CC0843 |
:104F5000B091CD0881569A4EA040B0407CF0402FD1 |
:104F60005527CA01A3E0880F991FAA95E1F7209160 |
:104F7000850830918608281B390B1BC08091CA0810 |
:104F80009091CB08A091CC08B091CD08805A954162 |
:104F9000AF4FBF4F54F5402F5527CA01F3E0880F9C |
:104FA000991FFA95E1F72091850830918608280F1E |
:104FB000391F30938608209385088091CA08909104 |
:104FC000CB08A091CC08B091CD0881589843A1405E |
:104FD000B0405CF0E4E0440F551FEA95E1F7241B74 |
:104FE000350B3093860820938508429880919D0860 |
:104FF00090917808891740F0992331F088B194E0B6 |
:10500000892788B910929D0880919D088F5F8093B1 |
:105010009D088091A50CE82FFF27EE0FFF1FE85990 |
:10502000F34F4091CB0C242F332780819181281797 |
:10503000390724F48091CC0C82FD0CC03095219569 |
:105040003F4F80819181821793077CF48091CC0C33 |
:1050500083FF0BC081E080937C088091CA0C992764 |
:105060008815990524F44C0102C010927C088091A7 |
:10507000A40CE82FFF27EE0FFF1FE859F34F242F52 |
:105080003327808191812817390724F48091CC0C33 |
:1050900080FD0CC0309521953F4F80819181821712 |
:1050A00093078CF48091CC0C81FF0DC081E080933C |
:1050B0007D0810927C088091CA0C99278815990563 |
:1050C00024F44C0102C010927D0880919F0888232F |
:1050D00041F110928408109283081092880810926F |
:1050E000870810928608109285088DEC9CECACEC39 |
:1050F000BDE38093EE0C9093EF0CA093F00CB09373 |
:10510000F10C8AE097EDA3EABBE38093E50C909362 |
:10511000E60CA093E70CB093E80C10927C08109278 |
:105120007D0880915408909155088D54914008F461 |
:1051300099C02091CE083091CF084091D00850916D |
:10514000D1088091D2089091D308A091D408B09151 |
:10515000D508281B390B4A0B5B0BC091C608D091B0 |
:10516000C708E091C808F091C9088091CA089091D9 |
:10517000CB08A091CC08B091CD08C81BD90BEA0B85 |
:10518000FB0B1092550810925408273A310541053F |
:1051900051054CF08091E4089091E50801969093B8 |
:1051A000E5088093E4082A553F4F4F4F5F4F4CF47A |
:1051B0008091E4089091E50801979093E508809329 |
:1051C000E408C73AD105E105F1054CF08091E20809 |
:1051D0009091E30801969093E3088093E208CA5502 |
:1051E000DF4FEF4FFF4F4CF48091E2089091E308BE |
:1051F00001979093E3088093E20810927A008091DF |
:10520000D2089091D308A091D408B091D50880938A |
:10521000BA089093BB08A093BC08B093BD088091D6 |
:10522000CA089091CB08A091CC08B091CD0880938A |
:10523000B2089093B308A093B408B093B5088091D6 |
:10524000C2089091C308A091C408B091C50880938A |
:10525000AA089093AB08A093AC08B093AD088FEE6A |
:1052600080937A008091E50C9091E60CA091E70C78 |
:10527000B091E80C20E030E040E050E0BC01CD010E |
:105280000E946643882309F43DC180917D088823EC |
:1052900009F038C180917C08882309F033C1C0919E |
:1052A000B80C2C2F3327442755278091D208909192 |
:1052B000D308A091D408B091D508BC01CD010E94BB |
:1052C00092448091E90C9091EA0CAA2797FDA09551 |
:1052D000BA2F281B390B4A0B5B0B2093F208309333 |
:1052E000F3084093F4085093F5088091E90C9091ED |
:1052F000EA0CAA2797FDA095BA2FB7FF07C0B09573 |
:10530000A095909581959F4FAF4FBF4F883C9105D9 |
:10531000A105B105BCF4DA01C90157FF03C0079626 |
:10532000A11DB11D73E0B595A795979587957A95C1 |
:10533000D1F78093F2089093F308A093F408B09308 |
:10534000F50815C057FF04C0215F3F4F4F4F5F4F17 |
:1053500064E055954795379527956A95D1F7209341 |
:10536000F2083093F3084093F4085093F5082C2F7B |
:105370003327442755278091CA089091CB08A091E4 |
:10538000CC08B091CD08BC01CD010E94924480911F |
:10539000F20C9091F30CAA2797FDA095BA2F281B29 |
:1053A000390B4A0B5B0B2093F6083093F7084093B8 |
:1053B000F8085093F9088091F20C9091F30CAA2709 |
:1053C00097FDA095BA2FB7FF07C0B095A09590950F |
:1053D00081959F4FAF4FBF4F883C9105A105B10507 |
:1053E000BCF4DA01C90157FF03C00796A11DB11D26 |
:1053F00023E0B595A795979587952A95D1F7809342 |
:10540000F6089093F708A093F808B093F90815C030 |
:1054100057FF04C0215F3F4F4F4F5F4F94E05595BA |
:105420004795379527959A95D1F72093F6083093AD |
:10543000F7084093F8085093F9088091F20890918A |
:10544000F308A091F408B091F508855F9140A04061 |
:10545000B04064F084EF91E0A0E0B0E08093F20807 |
:105460009093F308A093F408B093F5088091F208A4 |
:105470009091F308A091F408B091F5088C509E4FDC |
:10548000AF4FBF4F64F48CE09EEFAFEFBFEF809360 |
:10549000F2089093F308A093F408B093F508809174 |
:1054A000F6089091F708A091F808B091F908855F87 |
:1054B0009140A040B04064F084EF91E0A0E0B0E003 |
:1054C0008093F6089093F708A093F808B093F90832 |
:1054D0008091F6089091F708A091F808B091F9082A |
:1054E0008C509E4FAF4FBF4FECF48CE09EEFAFEF70 |
:1054F000BFEF8093F6089093F708A093F808B09355 |
:10550000F90810C01092F2081092F3081092F408F3 |
:105510001092F5081092F6081092F7081092F80809 |
:105520001092F90810927A008091BE089091BF08FD |
:10553000A091C008B091C1082091F2083091F30801 |
:105540004091F4085091F508821B930BA40BB50B06 |
:105550008093BE089093BF08A093C008B093C10881 |
:105560008091B6089091B708A091B808B091B90899 |
:105570002091F6083091F7084091F8085091F90809 |
:10558000821B930BA40BB50B8093B6089093B708BE |
:10559000A093B808B093B90820918308309184088B |
:1055A000C90137FF04C088279927821B930B4597B1 |
:1055B0003CF08091AC0C84FD03C081E08093040931 |
:1055C0008091B50C682F7727C90137FF04C0882761 |
:1055D0009927821B930B289FA001299F500D389F6C |
:1055E000500D1124CA01689FA001699F500D789F3A |
:1055F000500D1124CA0157FF02C081509E4FAC01CB |
:10560000452F550F550B4595629FC001639F900D27 |
:10561000729F900D112497FD03969595879595950A |
:105620008795480F591FCA01AA2797FDA095BA2F41 |
:105630008093EE089093EF08A093F008B093F108E0 |
:105640002091AE083091AF084091B0085091B10858 |
:10565000281B390B4A0B5B0B2093AE083093AF0825 |
:105660004093B0085093B1088091AE089091AF0874 |
:10567000A091B008B091B108895A9146A040B040BD |
:1056800064F088EA91E6A0E0B0E08093AE089093E1 |
:10569000AF08A093B008B093B1088091AE08909184 |
:1056A000AF08A091B008B091B10888559E49AF4F9E |
:1056B000BF4F64F488E59EE9AFEFBFEF8093AE087B |
:1056C0009093AF08A093B008B093B1088FEE809389 |
:1056D0007A008091A4089091A508892B09F4B8C09C |
:1056E0008091AC0C83FFB4C08091D2089091D30814 |
:1056F000A091D408B091D508B7FF04C081509E4F47 |
:10570000AF4FBF4F19E0B595A795979587951A9517 |
:10571000D1F79C0197FF03C0309521953F4F8091B1 |
:10572000CA089091CB08A091CC08B091CD08B7FFE2 |
:1057300004C081509E4FAF4FBF4FC9E0B595A795AC |
:1057400097958795CA95D1F7BC0197FF03C07095CF |
:1057500061957F4F261737070CF49B0129313105DE |
:10576000A4F480910409882381F080910509909127 |
:105770000609892B51F48091A4089091A508909373 |
:10578000A3088093A2081092040980917101482F08 |
:105790005527249FC001259F900D349F900D112403 |
:1057A00097FDCF969C01B6E035952795BA95E1F720 |
:1057B000421B530B9A01141615060CF043C01092AD |
:1057C0007A0060910509709106096115710569F506 |
:1057D0008091A0089091A108829FA001839F500D05 |
:1057E000929F500D11249A0157FF02C0215E3F4F36 |
:1057F000A5E035952795AA95E1F7442737FD409513 |
:10580000542F8091AE089091AF08A091B008B0914C |
:10581000B108820F931FA41FB51F8093AE08909309 |
:10582000AF08A093B008B093B1088FEE80937A00D0 |
:105830006115710569F061507040709306096093BD |
:10584000050906C084EF91E090930609809305094D |
:105850008091AC0C99279C012072307085FF15C097 |
:1058600080917B08992790937409809373098091A4 |
:105870007A08992790936609809365098091790841 |
:1058800080939A080E94AC3208C03093300920936C |
:105890002F0930932E0920932D09809103098150FF |
:1058A000809303098F3F09F02AC181E380930309A4 |
:1058B0008091240C99279093B80B8093B70B80911B |
:1058C0002D0990912E099093BA0B8093B90B80917A |
:1058D0002F09909130099093BC0B8093BB0B809162 |
:1058E0005109909152099093BE0B8093BD0B80910A |
:1058F0004D0990914E099093C00B8093BF0B8091FE |
:10590000390990913A099093C20B8093C10B809111 |
:105910003509909136099093C40B8093C30B809105 |
:105920004109909142099093C60B8093C50B8091D9 |
:105930003D0990913E099093C80B8093C70B8091CD |
:10594000590990915A099093CA0B8093C90B809181 |
:105950005509909156099093CC0B8093CB0B809175 |
:105960007B0899279093CE0B8093CD0B80917A087A |
:1059700099279093D00B8093CF0B80918E089091B4 |
:105980008F089093D20B8093D10B8091A4089091B3 |
:10599000A5089093D40B8093D30B80912809909104 |
:1059A00029099093D60B8093D50B8091240990916F |
:1059B00025099093D80B8093D70B80911D09909166 |
:1059C0001E09A0911F09B09120099093DA0B8093D2 |
:1059D000D90B8091190990911A09A0911B09B091D6 |
:1059E0001C099093DC0B8093DB0B80910F0C909142 |
:1059F000100C9093DE0B8093DD0B8091130C909133 |
:105A0000140C9093E00B8093DF0B80911B0C909112 |
:105A10001C0C9093E20B8093E10B80911F0C9091F2 |
:105A2000200C9093E40B8093E30B80910D019091F7 |
:105A30000E019093E60B8093E50B9091600C8091A2 |
:105A4000610C890F912D911D2091620C820F911D87 |
:105A50002091630C820F911D9C01959587959595DA |
:105A600087959093E80B8093E70B3093EA0B209394 |
:105A7000E90B80918008909181089093EC0B8093C2 |
:105A8000EB0B8091B80CE82EFF24002711278091A2 |
:105A9000D2089091D308A091D408B091D508BC0148 |
:105AA000CD01A80197010E9492443093EE0B209300 |
:105AB000ED0B8091CA089091CB08A091CC08B091D1 |
:105AC000CD08BC01CD01A80197010E9492443093FA |
:105AD000F00B2093EF0B8091E90C9091EA0C9093DE |
:105AE000F20B8093F10B8091F20C9091F30C909358 |
:105AF000F40B8093F30B1092F60B1092F50B809140 |
:105B00007D08A090EE0CB090EF0CC090F00CD090FF |
:105B1000F10C8823A9F08091E00C9091E10CAA2768 |
:105B200097FDA095BA2FBC01CD010E945C43DC011A |
:105B3000CB01A6019501BC01CD010E94D6433AC01C |
:105B40008091D2089091D308A091D408B091D50843 |
:105B5000BC01CD010E945C437B018C018091E50C6E |
:105B60009091E60CA091E70CB091E80C9C01AD017E |
:105B7000C801B7010E94D6437B018C018091E00CE3 |
:105B80009091E10CAA2797FDA095BA2FBC01CD01F9 |
:105B90000E945C43DC01CB01A6019501BC01CD0153 |
:105BA0000E94D643DC01CB019C01AD01C801B701C5 |
:105BB0000E94B742DC01CB01BC01CD010E943F43F2 |
:105BC000DC01CB019093E10C8093E00C80917C0888 |
:105BD000A090EE0CB090EF0CC090F00CD090F10CB7 |
:105BE0008823A9F08091DE0C9091DF0CAA2797FD05 |
:105BF000A095BA2FBC01CD010E945C43DC01CB0112 |
:105C0000A6019501BC01CD010E94D6433AC0809106 |
:105C1000CA089091CB08A091CC08B091CD08BC01E6 |
:105C2000CD010E945C437B018C018091E50C909139 |
:105C3000E60CA091E70CB091E80C9C01AD01C80105 |
:105C4000B7010E94D6437B018C018091DE0C9091BC |
:105C5000DF0CAA2797FDA095BA2FBC01CD010E94A9 |
:105C60005C43DC01CB01A6019501BC01CD010E9482 |
:105C7000D643DC01CB019C01AD01C801B7010E94F4 |
:105C8000B742DC01CB01BC01CD010E943F43DC01E6 |
:105C9000CB019093DF0C8093DE0C8091EC0C909103 |
:105CA000ED0CAA2797FDA095BA2FBC01CD010E944B |
:105CB0005C437B018C018091EE0C9091EF0CA091E4 |
:105CC000F00CB091F10C9C01AD01C801B7010E942C |
:105CD000D6435B016C018091C2089091C308A091EA |
:105CE000C408B091C508BC01CD010E945C437B0192 |
:105CF0008C018091E50C9091E60CA091E70CB0919D |
:105D0000E80C9C01AD01C801B7010E94D643DC013B |
:105D1000CB0120E030E040E05FE3BC01CD010E9418 |
:105D2000D643DC01CB019C01AD01C601B5010E9447 |
:105D3000B742DC01CB01BC01CD010E943F43DC0135 |
:105D4000CB019093ED0C8093EC0C8091E00C909142 |
:105D5000E10C8150984034F080E098E09093E10CA1 |
:105D60008093E00C8091E00C9091E10C8050984F72 |
:105D700034F480E098EF9093E10C8093E00C8091F4 |
:105D8000DE0C9091DF0C8150984034F080E098E078 |
:105D90009093DF0C8093DE0C8091DE0C9091DF0CF1 |
:105DA0008050984F34F480E098EF9093DF0C80930C |
:105DB000DE0C8091EC0C9091ED0C8150984034F009 |
:105DC00080E098E09093ED0C8093EC0C8091EC0CCB |
:105DD0009091ED0C8050984F34F480E098EF9093C0 |
:105DE000ED0C8093EC0C8091AC0C992780FFE3C004 |
:105DF0002091740181FF0EC02233B0F4809180089D |
:105E000090918108889790937F0880937E081092E4 |
:105E10009E080DC08091B10C289FC0011124889765 |
:105E200090937F0880937E0881E080939E08809104 |
:105E30009F08882321F010927F0810927E08C0905E |
:105E40008008D090810820917E0830917F082C1521 |
:105E50003D050CF0B0C080919E08882309F4ABC0CA |
:105E6000C21AD30A809173019927C89EB001C99EB6 |
:105E7000700DD89E700D1124CB0177FD0F966C012B |
:105E8000E4E0D594C794EA95E1F7C4018C199D0923 |
:105E90006C0180917501282F3327809156089091CD |
:105EA0005708829FA001839F500D929F500D11248F |
:105EB000CA0157FD079673E0959587957A95E1F7A6 |
:105EC000C81AD90AA091A608B091A708C091A8083D |
:105ED000D091A908D7FF04C0A150BE4FCF4FDF4FCC |
:105EE00069E0D595C795B795A7956A95D1F7809143 |
:105EF0007201282F332744275527BD01CE010E9468 |
:105F00001E4497FF04C0615E7F4F8F4F9F4F55E047 |
:105F100095958795779567955A95D1F76333710570 |
:105F20001CF062E370E006C05FEF6E3C750714F48E |
:105F30006EEC7FEFC61AD70A809101099091020991 |
:105F40009C0144E0220F331F4A95E1F7281B390BCF |
:105F50002C0D3D1D37FF02C0215F3F4F04E03595FA |
:105F600027950A95E1F73093020920930109809162 |
:105F7000AD0C482F55272417350774F48416950661 |
:105F800024F050930209409301098416950624F4E5 |
:105F90009092020980920109809101099091020971 |
:105FA0008816990624F49092020980920109809043 |
:105FB000010990900209C091EC0CD091ED0C8091F8 |
:105FC000EE089091EF08C81BD90BCE01AA2797FDC8 |
:105FD000A095BA2FBC01CD010E945C437B018C01CE |
:105FE000C401AA2797FDA095BA2FBC01CD010E943C |
:105FF0005C435B016C019B01AC01C801B7010E94CD |
:10600000694318163CF4C601B5010E943F43DC0108 |
:10601000CB01EC01CE01AA2797FDA095BA2FBC01B8 |
:10602000CD010E945C43DC01CB01D7FAD094D7F8B4 |
:10603000D094A6019501BC01CD010E94664388233E |
:106040003CF4C601B5010E943F43DC01CB01EC01E9 |
:10605000C536D10514F0C4E6D0E06FEFCC39D607D1 |
:1060600014F4CCE9DFEF74E18716910414F4C0E076 |
:10607000D0E0209187083091880880912F09909175 |
:106080003009281B390B8091E00C9091E10C821BA8 |
:10609000930BAA2797FDA095BA2FBC01CD010E94B2 |
:1060A0005C43DC01CB01C0907A01D0907B01E09091 |
:1060B0007C01F0907D019C01AD01C701B6010E94F9 |
:1060C000D643DC01CB01BC01CD010E943F43DC0182 |
:1060D000CB0190936809809367098091670990913B |
:1060E0006809AA2797FDA095BA2F2091E60830915C |
:1060F000E7084091E8085091E908280F391F4A1F26 |
:106100005B1F2093E6083093E7084093E80850931C |
:10611000E9086091E6087091E70812161306140664 |
:106120001506C4F4CB0177FF04C088279927861B86 |
:10613000970B97FF02C081509F4F892F990F990BA2 |
:106140000196AA2797FDA095BA2F281B390B4A0B59 |
:106150005B0B16C0CB0177FF03C0909581959F4FD5 |
:1061600097FF02C081509F4F892F990F990B01967D |
:10617000AA2797FDA095BA2F280F391F4A1F5B1F2A |
:106180002093E6083093E7084093E8085093E90825 |
:106190008091E6089091E708A091E808B091E9089D |
:1061A00081589E43A040B04064F080E89EE3A0E0A8 |
:1061B000B0E08093E6089093E708A093E808B093D6 |
:1061C000E9088091E6089091E708A091E808B0916D |
:1061D000E9088058914CAF4FBF4F64F480E891ECD0 |
:1061E000AFEFBFEF8093E6089093E708A093E8082D |
:1061F000B093E9084091670950916809CE01D7FF33 |
:1062000004C0882799278C1B9D0B880D991D880F2A |
:10621000991F8417950764F4CE01D7FF04C088271F |
:1062200099278C1B9D0BA401480F591F440F551F24 |
:10623000CE01D7FF04C0882799278C1B9D0B880DA2 |
:10624000991D2EEF3FEF829FB001839F700D929FAB |
:10625000700D11244617570784F4CE01D7FF04C0F0 |
:10626000882799278C1B9D0B880D991D829FA00163 |
:10627000839F500D929F500D11249401240F351FC0 |
:106280002C0F3D1F37FF03C020E030E007C0809196 |
:10629000EB0C9927821793070CF49C011091E20CE8 |
:1062A000812F9927281739070CF49C012093630943 |
:1062B0009401241B350B2C0F3D1F37FF03C020E03A |
:1062C00030E007C08091EB0C9927821793070CF4FC |
:1062D0009C01812F9927281739070CF49C012093E2 |
:1062E0006409209185083091860880912D0990914C |
:1062F0002E09281B390B8091DE0C9091DF0C821B3C |
:10630000930BAA2797FDA095BA2FBC01CD010E943F |
:106310005C43DC01CB019C01AD01C701B6010E94C9 |
:10632000D643DC01CB01BC01CD010E943F43DC011F |
:10633000CB019093620980936109809161099091EA |
:106340006209AA2797FDA095BA2F2091EA083091FB |
:10635000EB084091EC085091ED08280F391F4A1FB7 |
:106360005B1F2093EA083093EB084093EC085093AE |
:10637000ED086091EA087091EB08121613061406F6 |
:106380001506C4F4CB0177FF04C088279927861B24 |
:10639000970B97FF02C081509F4F892F990F990B40 |
:1063A0000196AA2797FDA095BA2F281B390B4A0BF7 |
:1063B0005B0B16C0CB0177FF03C0909581959F4F73 |
:1063C00097FF02C081509F4F892F990F990B01961B |
:1063D000AA2797FDA095BA2F280F391F4A1F5B1FC8 |
:1063E0002093EA083093EB084093EC085093ED08B3 |
:1063F0008091EA089091EB08A091EC08B091ED082B |
:1064000081589E43A040B04064F080E89EE3A0E045 |
:10641000B0E08093EA089093EB08A093EC08B09367 |
:10642000ED088091EA089091EB08A091EC08B091FA |
:10643000ED088058914CAF4FBF4F64F480E891EC69 |
:10644000AFEFBFEF8093EA089093EB08A093EC08BE |
:10645000B093ED084091610950916209CE01D7FFD8 |
:1064600004C0882799278C1B9D0B880D991D880FC8 |
:10647000991F8417950764F4CE01D7FF04C08827BD |
:1064800099278C1B9D0BA401480F591F440F551FC2 |
:10649000CE01D7FF04C0882799278C1B9D0B880D40 |
:1064A000991D2EEF3FEF829FB001839F700D929F49 |
:1064B000700D11244617570784F4CE01D7FF04C08E |
:1064C000882799278C1B9D0B880D991D829FA00101 |
:1064D000839F500D929F500D11249401240F351F5E |
:1064E0002C1B3D0B37FF03C020E030E007C080913C |
:1064F000EB0C9927821793070CF49C01812F9927A5 |
:10650000281739070CF49C0120936F099401241B70 |
:10651000350B2C1B3D0B37FF03C020E030E007C0DC |
:106520008091EB0C9927821793070CF49C01812F23 |
:106530009927281739070CF49C0120936909DF91EA |
:10654000CF911F910F91FF90EF90DF90CF90BF9070 |
:10655000AF909F908F9008952F923F924F925F92AD |
:106560006F927F928F929F92AF92BF92CF92DF9263 |
:10657000EF92FF920F931F93CF93DF93CDB7DEB7C8 |
:1065800061970FB6F894DEBF0FBECDBF2091240CEB |
:106590002983233009F04EC280912109E82FFF277B |
:1065A000EE0FFF1FEE0FFF1FEC50F34F80910F0C0B |
:1065B0009091100CA091110CB091120C80839183DA |
:1065C000A283B38380912109E82FFF27EE0FFF1FDD |
:1065D000EE0FFF1FEC5EF24F8091130C9091140CA4 |
:1065E000A091150CB091160C80839183A283B38384 |
:1065F000809121098F5F8093210980912109883042 |
:1066000011F41092210980910709909108090897C7 |
:106610004CF480910709909108090196909308091C |
:106620008093070910921109109212091092130910 |
:106630001092140910921509109216091092170958 |
:10664000109218091092090910920A0910920B0968 |
:1066500010920C0910920D0910920E0910920F0958 |
:10666000109210094424552480910709909108093B |
:10667000481659060CF030C13201F301EC50F34FCB |
:106680002081318142815381DA01C901BB0F880B1E |
:10669000982FDC012A833B834C835D838E838F8319 |
:1066A000888789878090110990901209A09013091A |
:1066B000B0901409C0901509D0901609E090170900 |
:1066C000F09018090A81080D81E0081508F080E0B3 |
:1066D0001B81190DA1E0191508F0A0E0810F91E0D0 |
:1066E000811708F090E0A92B182F2C812A0DB1E01A |
:1066F0002A1508F0B0E08A2F820F91E0821708F087 |
:1067000090E0B92B282F3D813B0DA1E03B1508F00F |
:10671000A0E08B2F830F91E0831708F090E0A92B66 |
:10672000382F4E814C0DB1E04C1508F0B0E08A2FA7 |
:10673000840F91E0841708F090E0B92B482F5F8117 |
:106740005D0DA1E05D1508F0A0E08B2F850F91E0B5 |
:10675000851708F090E0A92B582F68856E0DF1E0A1 |
:106760006E1508F0F0E09A2F960F81E0961708F06A |
:1067700080E08F2B79857F0D870F0093110910938F |
:10678000120920931309309314094093150950936B |
:1067900016099093170980931809F301EC5EF24FE4 |
:1067A0002081318142815381DA01C901BB0F880BFD |
:1067B000982FDC012A873B874C875D878E878F87E0 |
:1067C000888B898B8090090990900A09A0900B0909 |
:1067D000B0900C09C0900D09D0900E09E0900F09FF |
:1067E000F09010090A85080D81E0081508F080E096 |
:1067F0001B85190DA1E0191508F0A0E0810F91E0AB |
:10680000811708F090E0A92B182F2C852A0DB1E0F4 |
:106810002A1508F0B0E08A2F820F91E0821708F065 |
:1068200090E0B92B282F3D853B0DA1E03B1508F0EA |
:10683000A0E08B2F830F91E0831708F090E0A92B45 |
:10684000382F4E854C0DB1E04C1508F0B0E08A2F82 |
:10685000840F91E0841708F090E0B92B482F5F85F2 |
:106860005D0DA1E05D1508F0A0E08B2F850F91E094 |
:10687000851708F090E0A92B582F68896E0DF1E07C |
:106880006E1508F0F0E09A2F960F81E0961708F049 |
:1068900080E08F2B79897F0D870F00930909109372 |
:1068A0000A0920930B0930930C0940930D0950936A |
:1068B0000E0990930F09809310090894411C511CF4 |
:1068C00084E090E0680E791E809107099091080994 |
:1068D000481659060CF4D1CEE0910709F091080949 |
:1068E000FF0FEE0BFE2F2091070930910809209031 |
:1068F00011093090120940901309509014096090CA |
:106900001509709016098090170990901809A22E09 |
:10691000B32ECE2EDE2EEE2EFE2E0E2F1E2F222D6D |
:10692000332D442D552D662D772D882D992D0E94C0 |
:10693000203A209311093093120940931309509380 |
:1069400014096093150970931609809317099093A1 |
:106950001809E0910709F0910809FF0FEE0BFE2FCF |
:1069600020910709309108092090090930900A09FF |
:1069700040900B0950900C0960900D0970900E0921 |
:1069800080900F0990901009A22EB32ECE2EDE2EED |
:10699000EE2EFE2E0E2F1E2F222D332D442D552D83 |
:1069A000662D772D882D992D0E94203A2093090974 |
:1069B00030930A0940930B0950930C0960930D0919 |
:1069C00070930E0980930F0990931009209111097B |
:1069D00030911209409113095091140960911509E1 |
:1069E00070911609809117099091180920931D093B |
:1069F00030931E0940931F095093200920910909E3 |
:106A000030910A0940910B0950910C0960910D09D0 |
:106A100070910E0980910F09909110092093190926 |
:106A200030931A0940931B0950931C0981E080930D |
:106A300022091DC099819330B0F4809194089091FF |
:106A40009508873491057CF01092300910922F0937 |
:106A500010922E0910922D09439882E390E09093B2 |
:106A60004B0880934A08E981E33009F05AC020912D |
:106A70008208213009F055C080912C09882309F043 |
:106A800050C080919B0890919C08805D974008F0D1 |
:106A900048C080911D0990911E09A0911F09B091D5 |
:106AA00020098093280990932909A0932A09B0937B |
:106AB0002B098091190990911A09A0911B09B09195 |
:106AC0001C098093240990932509A0932609B0936B |
:106AD000270980911D0990911E09A0911F09B0916D |
:106AE00020098093590990935A09A0935B09B093A8 |
:106AF0005C098091190990911A09A0911B09B09124 |
:106B00001C098093550990935609A0935709B09397 |
:106B1000580982E390E090934B0880934A082093B1 |
:106B20002C09809182088823B1F4109228091092D0 |
:106B3000290910922A0910922B0910922409109207 |
:106B40002509109226091092270980932C0910928A |
:106B50009C0810929B08809094089090950826E4D9 |
:106B6000821691044CF580911D0990911E09A09107 |
:106B70001F09B09120098093590990935A09A09355 |
:106B80005B09B0935C098091190990911A09A09151 |
:106B90001B09B0911C098093550990935609A09345 |
:106BA0005709B09358091092300910922F0910928A |
:106BB0002E0910922D0943983981333009F027C4EA |
:106BC00067E4861691040CF44DC086E9881691049A |
:106BD0000CF048C080918708909188080C964997DE |
:106BE00050F480918508909186088D3091051CF4B1 |
:106BF000845F9F4FBCF51092300910922F091092BC |
:106C00002E0910922D0980911D0990911E09A091C5 |
:106C10001F09B09120098093590990935A09A093B4 |
:106C20005B09B0935C098091190990911A09A091B0 |
:106C30001B09B0911C098093550990935609A093A4 |
:106C40005709B093580980912309883C30F088B1E6 |
:106C500098E0892788B910922309809123098F5FD2 |
:106C600080932309F7E48F1691040CF4D0C380912C |
:106C70002209813009F0CBC32091590930915A097A |
:106C800040915B0950915C09211531054105510581 |
:106C900009F4BDC3E0905509F090560900915709D9 |
:106CA00010915809E114F1040105110509F4AFC36D |
:106CB00080918708909188088D3091050CF0A7C3CA |
:106CC000845F9F4F0CF4A3C3809185089091860840 |
:106CD0008D3091050CF09BC3845F9F4F0CF497C3DC |
:106CE000F6E98F1691044CF580911D0990911E09CB |
:106CF000A0911F09B0912009281B390B4A0B5B0B8F |
:106D000020935109309352094093530950935409E9 |
:106D10008091190990911A09A0911B09B0911C0941 |
:106D2000E81AF90A0A0B1B0BE0924D09F0924E0982 |
:106D300000934F0910935009439A26E98216910453 |
:106D40000CF465C0209128093091290940912A0945 |
:106D500050912B09211531054105510509F457C002 |
:106D6000E0902409F0902509009126091091270947 |
:106D7000E114F1040105110509F449C080911D09D0 |
:106D800090911E09A0911F09B0912009281B390B71 |
:106D90004A0B5B0B209351093093520940935309DE |
:106DA000509354098091190990911A09A0911B09D7 |
:106DB000B0911C09E81AF90A0A0B1B0BE0924D0965 |
:106DC000F0924E0900934F091093500980911D09CC |
:106DD00090911E09A0911F09B09120098093590933 |
:106DE00090935A09A0935B09B0935C0980911909AB |
:106DF00090911A09A0911B09B0911C098093550923 |
:106E000090935609A0935709B0935809439A36E9CD |
:106E1000831691040CF459C0809128099091290996 |
:106E2000A0912A09B0912B090097A105B10509F09D |
:106E30004CC08091240990912509A0912609B09118 |
:106E400027090097A105B10509F03FC080915909B4 |
:106E500090915A09A0915B09B0915C0920911D099C |
:106E600030911E0940911F0950912009821B930BFC |
:106E7000A40BB50B8093510990935209A093530929 |
:106E8000B09354098091550990915609A0915709E2 |
:106E9000B09158092091190930911A0940911B09A4 |
:106EA00050911C09821B930BA40BB50B80934D09C9 |
:106EB00090934E09A0934F09B0935009439A82E3EF |
:106EC00090E090934B0880934A08E0901B0CF09060 |
:106ED0001C0C00911D0C10911E0CE0924909F092BF |
:106EE0004A0900934B0910934C09A0901F0CB090D5 |
:106EF000200CC090210CD090220CA0924509B09299 |
:106F00004609C0924709D09248098091730990912F |
:106F10007409AA2797FDA095BA2F209151093091A5 |
:106F200052094091530950915409BC01CD010E946E |
:106F30001E44DC01CB01BC01CD010E945C43DC019D |
:106F4000CB012FE632E143E05AE3BC01CD010E94C0 |
:106F5000D643DC01CB01BC01CD010E943F43DC01E3 |
:106F6000CB018093410990934209A0934309B093C8 |
:106F700044098091650990916609AA2797FDA0951B |
:106F8000BA2FBC01CD01A80197010E941E44DC016B |
:106F9000CB01BC01CD010E945C43DC01CB0121E2AD |
:106FA0003CE34AE55BE3BC01CD010E94D643DC0132 |
:106FB000CB01BC01CD010E943F43DC01CB0180939A |
:106FC0003D0990933E09A0933F09B09340098091F9 |
:106FD000730990917409AA2797FDA095BA2F209163 |
:106FE0004D0930914E0940914F0950915009BC0113 |
:106FF000CD010E941E44DC01CB01BC01CD010E94E9 |
:107000005C43DC01CB012FE632E143E05AE3BC01F3 |
:10701000CD010E94D643DC01CB01BC01CD010E9411 |
:107020003F43DC01CB018093390990933A09A09347 |
:107030003B09B0933C098091650990916609AA27A4 |
:1070400097FDA095BA2FBC01CD01A60195010E9424 |
:107050001E44DC01CB01BC01CD010E945C43DC017C |
:10706000CB0121E23CE34AE55BE3BC01CD010E9498 |
:10707000D643DC01CB01BC01CD010E943F43DC01C2 |
:10708000CB018093350990933609A0933709B093CB |
:10709000380966E9861691040CF497C08091280996 |
:1070A00090912909A0912A09B0912B090097A10577 |
:1070B000B10509F48AC08091240990912509A09115 |
:1070C0002609B09127090097A105B10509F47DC0F3 |
:1070D000809151099091520997FF03C09095819535 |
:1070E0009F4F8D5B92406CF480914D0990914E09B9 |
:1070F00097FF03C0909581959F4F8D5B92400CF454 |
:1071000064C060919A08262F332744275527809121 |
:107110003D0990913E09A0913F09B091400928177F |
:1071200039074A075B0744F420933D0930933E0931 |
:1071300040933F0950934009809135099091360959 |
:10714000A0913709B0913809281739074A075B071A |
:1071500044F420933509309336094093370950930E |
:107160003809862F9927909581959F4F9C01442738 |
:1071700037FD4095542F80913D0990913E09A09193 |
:107180003F09B091400982179307A407B50744F45B |
:1071900020933D0930933E0940933F0950934009A5 |
:1071A0008091350990913609A0913709B09138093D |
:1071B00082179307A407B50744F420933509309349 |
:1071C00036094093370950933809A0903D09B09093 |
:1071D0003E098091410990914209A81AB90AB092DA |
:1071E0003409A0923309C0903909D0903A098091AE |
:1071F000350990913609C81AD90AD0923209C0923D |
:107200003109E091A408F091A508EE0FFF1FE15AA3 |
:10721000FB4F80819181909581959F4FAA2797FD83 |
:10722000A095BA2FBC01CD010E945C43DC01CB01CB |
:107230002FE632E143E85AE3BC01CD010E94D64378 |
:107240007B018C01C601AA2797FDA095BA2FBC012E |
:10725000CD010E945C431B012C019B01AC01C801C4 |
:10726000B7010E94D6433B014C01E091A408F09184 |
:10727000A508EE0FFF1FE157FE4F80819181AA27DD |
:1072800097FDA095BA2FBC01CD010E945C43DC01A3 |
:10729000CB012FE632E143E85AE3BC01CD010E9465 |
:1072A000D6437B018C01C501AA2797FDA095BA2F73 |
:1072B000BC01CD010E945C435B016C019B01AC01F0 |
:1072C000C801B7010E94D643DC01CB019C01AD018E |
:1072D000C401B3010E94B742DC01CB01BC01CD0166 |
:1072E0000E943F43DC01CB014C0190933009809315 |
:1072F0002F09E091A408F091A508EE0FFF1FE157B8 |
:10730000FE4F80819181AA2797FDA095BA2FBC01DD |
:10731000CD010E945C43DC01CB012FE632E143E862 |
:107320005AE3BC01CD010E94D643DC01CB01A2018E |
:107330009101BC01CD010E94D6437B018C01E091FB |
:10734000A408F091A508EE0FFF1FE15AFB4F8081C2 |
:107350009181AA2797FDA095BA2FBC01CD010E946B |
:107360005C43DC01CB012FE632E143E85AE3BC0188 |
:10737000CD010E94D643DC01CB01A6019501BC01E1 |
:10738000CD010E94D643DC01CB019C01AD01C801B7 |
:10739000B7010E94B742DC01CB01BC01CD010E94C4 |
:1073A0003F43DC01CB019C0190932E0980932D0972 |
:1073B00064E28616910434F083E290E09093300901 |
:1073C00080932F092432310534F083E290E09093CA |
:1073D0002E0980932D0980912F09909130098D5DA0 |
:1073E0009F4F34F48DED9FEF9093300980932F09D8 |
:1073F00080912D0990912E098D5D9F4F34F48DED74 |
:107400009FEF90932E0980932D0910922209619687 |
:107410000FB6F894DEBF0FBECDBFDF91CF911F91A5 |
:107420000F91FF90EF90DF90CF90BF90AF909F9023 |
:107430008F907F906F905F904F903F902F90089526 |
:10744000A9E7B0E0E6E2FAE30C94AD44222E332E35 |
:10745000442E552E662E772E882E992E2A2D3B2DC2 |
:1074600019AAFE013196B8E0AB2E1192AA94E9F761 |
:1074700029823A824B825C826D827E828F829886DC |
:10748000FE013996A8E0BA2E1192BA94E9F729873D |
:107490003A87CB86DC86ED86FE860F87188B8D813A |
:1074A0009E81AF81B885B7FDCEC38D859E85AF85A2 |
:1074B000B889B7FDAAC329813A814B815C816D816E |
:1074C0007E818F819885A984BA84CB84DC84ED8405 |
:1074D000FE840F851889FE017196A8E01192AA9585 |
:1074E000E9F7298B3A8B4B8B5C8B6D8B7E8B8F8B6B |
:1074F000988FFE017996B8E01192BA95E9F7A98EB6 |
:10750000BA8ECB8EDC8EED8EFE8E0F8F18A3698C1B |
:107510007A8C8B8C9C8C6AAA7BAA8CAA9DAAAD8C37 |
:10752000BE8CCF8CD8A0E988FA880B891C89EEAA7A |
:10753000FFAA08AF19AF0D891E892F89388D0AAFB0 |
:107540001BAF2CAF3DAFA114B104C104D10409F0AD |
:1075500068C1061517052805390508F010C2A401F1 |
:107560009301203080E0380781E0480780E0580729 |
:1075700008F4BBC30AA91BA92CA93DA900501040BF |
:107580002040314008F026C720E130E040E050E0E4 |
:107590006AA87BA88CA89DA8022E04C09694879404 |
:1075A000779467940A94D2F7F301E15DF84F8081F4 |
:1075B000280F311D411D511D80E290E0A0E0B0E098 |
:1075C0001C012D01221A330A440A550A09F442C04B |
:1075D0008AA89BA8ACA8BDA8022C04C0880C991C42 |
:1075E000AA1CBB1C0A94D2F78AAA9BAAACAABDAA61 |
:1075F0002AAD3BAD4CAD5DAD022C04C0220F331F54 |
:10760000441F551F0A94D2F780E290E08219930933 |
:10761000AEA8BFA8C8ACD9AC04C0D694C794B794E0 |
:10762000A7948A95D2F72A293B294C295D292AAFAC |
:107630003BAF4CAF5DAFCEA8DFA8E8ACF9AC04C05F |
:10764000CC0CDD1CEE1CFF1C2A94D2F7CEAADFAABC |
:10765000E8AEF9AE0AA91BA92CA93DA9790100271A |
:1076600011272A96ECAEFDAE0EAF1FAF2A972AA9BE |
:107670003BA94CA95DA9407050702E962CAF3DAF30 |
:107680004EAF5FAF2E976AAD7BAD8CAD9DADA801BF |
:1076900097010E9470446B017C016AAD7BAD8CAD9B |
:1076A0009DAD2A962CAD3DAD4EAD5FAD2A970E94A3 |
:1076B000704462962CAF3DAF4EAF5FAF6297CA0188 |
:1076C000B9012E962CAD3DAD4EAD5FAD2E970E940B |
:1076D0001E442B013C01A601332722278EA89FA818 |
:1076E000A8ACB9ACC501AA27BB2769017A01C82A91 |
:1076F000D92AEA2AFB2AC414D504E604F70418F5AB |
:1077000062960CAD1DAD2EAD3FAD6297015010409D |
:107710002040304062960CAF1DAF2EAF3FAF629756 |
:107720002AA93BA94CA95DA9C20ED31EE41EF51ED1 |
:10773000C216D306E406F50630F0C414D504E604F8 |
:10774000F70408F47CC6C418D508E608F708C70192 |
:10775000B6012A962CAD3DAD4EAD5FAD2A970E9485 |
:1077600070444B015C01C701B6012A962CAD3DADBA |
:107770004EAD5FAD2A970E94704479018A01CA011B |
:10778000B9012E962CAD3DAD4EAD5FAD2E970E944A |
:107790001E442B013C01A401332722278EA99FA957 |
:1077A000A8ADB9ADA070B07049015A01882A992AD4 |
:1077B000AA2ABB2A84149504A604B704C0F408942A |
:1077C000E108F108010911092AA93BA94CA95DA901 |
:1077D000820E931EA41EB51E82169306A406B5063D |
:1077E00030F084149504A604B70408F422C6629607 |
:1077F0006CAC7DAC8EAC9FAC6297D3019927882787 |
:107800008E299F29A02BB12B22968CAF9DAFAEAFB6 |
:10781000BFAF229726961CAE1DAE1EAE1FAE26979A |
:107820001AC0EAACFBAC0CAD1DADEA14FB040C05B0 |
:107830001D0508F04AC026961CAE1DAE1EAE1FAE3A |
:10784000269700E010E020E030E022960CAF1DAF5C |
:107850002EAF3FAF229788E0FE01B99611928A952C |
:10786000E9F722962CAD3DAD4EAD5FAD229729A72D |
:107870003AA74BA75CA726968CAD9DADAEADBFAD2C |
:1078800026978DA79EA7AFA7B8AB29A53AA54BA56C |
:107890005CA56DA57EA58FA598A9222E332E442E1A |
:1078A000552E662E772E882E992E99A9992309F4A4 |
:1078B000F5C5992D0E945B42222E332E442E552E63 |
:1078C000662E772E882E992EE9C510E0A11610E0BD |
:1078D000B10611E0C10610E0D10608F4F9C130E0AC |
:1078E000A31630E0B30630E0C30631E0D30608F05B |
:1078F00076C520E130E040E050E035014601022E3F |
:1079000004C096948794779467940A94D2F7F3010D |
:10791000E15DF84F8081280F311D411D511D10E29E |
:10792000E12EF12C012D112D17012801221A330A05 |
:10793000440A550A09F0E3C1EAACFBAC0CAD1DAD3D |
:10794000AE14BF04C006D10670F00EA91FA928AD61 |
:1079500039AD8AA99BA9ACA9BDA9081719072A079F |
:107960003B0708F480C5F1E06F2E712C812C912C1F |
:1079700022966CAE7DAE8EAE9FAE22974BCFEAA81C |
:10798000FBA80CA91DA9E114F1040105110509F4D6 |
:1079900077C10AA91BA92CA93DA9003040E0140712 |
:1079A00041E0240740E0340708F083C10F3F110590 |
:1079B0002105310511F008F017C5A60195016AA847 |
:1079C0007BA88CA89DA8022E04C0969487947794D7 |
:1079D00067940A94D2F7F301E15DF84F8081280F94 |
:1079E000311D411D511DDA01C90120E230E040E0A6 |
:1079F00050E019012A01281A390A4A0A5B0A09F0DB |
:107A000098C38AAC9BACACACBDACCAA8DBA8ECA854 |
:107A1000FDA88C189D08AE08BF088AAE9BAEACAE20 |
:107A2000BDAE21E0E22EF12C012D112D2696ECAEFB |
:107A3000FDAE0EAF1FAF26972AA93BA94CA95DA9A1 |
:107A40008A0122273327E6960CAF1DAF2EAF3FAF3A |
:107A5000E6978AA99BA9ACA9BDA9A070B070EA96C7 |
:107A60008CAF9DAFAEAFBFAFEA976AAD7BAD8CADCB |
:107A70009DADE6962CAD3DAD4EAD5FADE6970E9457 |
:107A800070446B017C016AAD7BAD8CAD9DADE6961B |
:107A90002CAD3DAD4EAD5FADE6970E9470446A9649 |
:107AA0002CAF3DAF4EAF5FAF6A97CA01B901EA96FE |
:107AB0002CAD3DAD4EAD5FADEA970E941E442B014B |
:107AC0003C01A601332722278EA89FA8A8ACB9ACF9 |
:107AD000C501AA27BB2769017A01C82AD92AEA2A3F |
:107AE000FB2AC414D504E604F70418F56A960CAD15 |
:107AF0001DAD2EAD3FAD6A97015010402040304083 |
:107B00006A960CAF1DAF2EAF3FAF6A972AA93BA96B |
:107B10004CA95DA9C20ED31EE41EF51EC216D306E3 |
:107B2000E406F50630F0C414D504E604F70408F4BE |
:107B3000A1C4C418D508E608F708C701B601E6963F |
:107B40002CAD3DAD4EAD5FADE6970E9470444B014C |
:107B50005C01C701B601E6962CAD3DAD4EAD5FAD03 |
:107B6000E6970E94704479018A01CA01B901EA9638 |
:107B70002CAD3DAD4EAD5FADEA970E941E442B018A |
:107B80003C01A401332722278EA99FA9A8ADB9AD36 |
:107B9000A070B07049015A01882A992AAA2ABB2AE2 |
:107BA00084149504A604B704E0F40894E108F108ED |
:107BB000010911092AA93BA94CA95DA9820E931EAE |
:107BC000A41EB51E82169306A406B50650F08414B2 |
:107BD0009504A604B70428F40894E108F108010903 |
:107BE00011096A966CAC7DAC8EAC9FAC6A97D301E0 |
:107BF000992788278E299F29A02BB12B22968CAFFD |
:107C00009DAFAEAFBFAF229726CE19A9109519AB85 |
:107C1000A984BA84CB84DC84ED84FE840F85188922 |
:107C20002A2D3B2D4C2D5D2D6E2D7F2D802F912FDC |
:107C30000E945B4229873A874B875C876D877E87E6 |
:107C40008F87988B38CC0FEF09ABA980BA80CB8097 |
:107C5000DC80ED80FE800F8118852A2D3B2D4C2D78 |
:107C60005D2D6E2D7F2D802F912F0E945B422983E9 |
:107C70003A834B835C836D837E838F83988715CC97 |
:107C800061E070E080E090E0A60195010E94704400 |
:107C90002AAB3BAB4CAB5DAB0AA91BA92CA93DA9F8 |
:107CA000003040E0140741E0240740E0340708F4C6 |
:107CB0007DCE8AA99BA9ACA9BDA980509040A040C7 |
:107CC000B14008F09BC320E130E040E050E077CEC7 |
:107CD0002FEFA216B104C104D10411F008F075C34E |
:107CE00020E030E040E050E008CE2F3F3105410574 |
:107CF000510511F008F07DC3A601950149CC722D04 |
:107D0000A6019501022C04C0220F331F441F551FEA |
:107D10000A94D2F76E2D62198AA99BA9ACA9BDA9B4 |
:107D2000062E04C0B695A795979587950A94D2F725 |
:107D300059016A01A82AB92ACA2ADB2AEAA8FBA89B |
:107D40000CA91DA904C0EE0CFF1C001F111F2A94D2 |
:107D5000D2F7EAAAFBAA0CAB1DAB2AAC3BAC4CACED |
:107D60005DAC062E04C056944794379427940A9429 |
:107D7000D2F72AAD3BAD4CAD5DAD072E04C0220F4E |
:107D8000331F441F551F0A94D2F78EA99FA9A8AD8F |
:107D9000B9AD04C0B695A795979587956A95D2F722 |
:107DA000282B392B4A2B5B2B2AAF3BAF4CAF5DAF57 |
:107DB0000EA91FA928AD39AD04C0000F111F221F45 |
:107DC000331F7A95D2F70EAB1FAB28AF39AF9601B0 |
:107DD000442755276E962CAF3DAF4EAF5FAF6E97E1 |
:107DE000D601C501A070B070A2968CAF9DAFAEAFAA |
:107DF000BFAFA297C201B1010E9470443B014C0188 |
:107E0000C201B1016E962CAD3DAD4EAD5FAD6E972A |
:107E10000E947044A6962CAF3DAF4EAF5FAFA697C1 |
:107E2000CA01B901A2962CAD3DAD4EAD5FADA29792 |
:107E30000E941E447B018C01A301332722276AACD8 |
:107E40007BAC8CAC9DACC401AA27BB2739014A018D |
:107E5000682A792A8A2A9B2A6E147F048006910652 |
:107E600060F5A6962CAD3DAD4EAD5FADA697215009 |
:107E7000304040405040A6962CAF3DAF4EAF5FAF74 |
:107E8000A6976A0C7B1C8C1C9D1C6A147B048C04BA |
:107E90009D0498F06E147F048006910670F42150C2 |
:107EA000304040405040A6962CAF3DAF4EAF5FAF44 |
:107EB000A6976A0C7B1C8C1C9D1C6E187F08800A80 |
:107EC000910AC401B3016E962CAD3DAD4EAD5FADD0 |
:107ED0006E970E947044AA966CAF7DAF8EAF9FAF35 |
:107EE000AA97C401B3016E962CAD3DAD4EAD5FAD0A |
:107EF0006E970E94704419012A01CA01B901A29625 |
:107F00002CAD3DAD4EAD5FADA2970E941E447B01EE |
:107F10008C01AA968CAD9DADAEADBFADAA97AC015C |
:107F2000332722278AAD9BADACADBDADA070B0703C |
:107F3000282B392B4A2B5B2BAA962CAF3DAF4EAF8B |
:107F40005FAFAA972E153F0540075107A8F4089484 |
:107F500021083108410851082A0D3B1D4C1D5D1DAB |
:107F6000AA962CAF3DAF4EAF5FAFAA972A153B053F |
:107F70004C055D0508F047C2AA966CAC7DAC8EAC92 |
:107F80009FACAA976E187F08800A910AAA966CAED9 |
:107F90007DAE8EAE9FAEAA97A6968CAC9DACAEACD5 |
:107FA000BFACA697D4019927882782299329A429B1 |
:107FB000B52922968CAF9DAFAEAFBFAF22977C01A3 |
:107FC0008D01FFEFAF2EFFEFBF2EC12CD12CEA2089 |
:107FD000FB200C211D211D0144245524AAA8BBA867 |
:107FE000CCA8DDA82FEF3FEF40E050E0A222B32263 |
:107FF000C422D5228AA99BA9ACA9BDA93D01882488 |
:108000009924C801B701A60195010E941E44AE96AD |
:108010006CAF7DAF8EAF9FAFAE97C801B701A40123 |
:1080200093010E941E44E2966CAF7DAF8EAF9FAF6E |
:10803000E297C201B101A60195010E941E447B0195 |
:108040008C01C201B101A40193010E941E449B0155 |
:10805000AC01AE966CAC7DAC8EAC9FACAE97C4015F |
:10806000AA27BB27E2968CAC9DACAEACBFACE29726 |
:10807000880E991EAA1EBB1E8E0C9F1CA01EB11E30 |
:10808000E2968CAE9DAEAEAEBFAEE2978E149F046C |
:10809000A006B10620F4205030404F4F5F4FE296CB |
:1080A000ACACBDACCEACDFACE297C601AA27BB2717 |
:1080B0007C018D01E20EF31E041F151FA50133275D |
:1080C0002227AE968CAD9DADAEADBFADAE97A07084 |
:1080D000B070280F391F4A1F5B1FAA968CAD9DAD4B |
:1080E000AEADBFADAA978E159F05A007B10780F072 |
:1080F000E816F9060A071B0709F08CCB6EA87FA8C3 |
:1081000088AC99AC621673068406950608F082CB9B |
:1081100022960CAD1DAD2EAD3FAD22970150104003 |
:108120002040304022960CAF1DAF2EAF3FAF2297BC |
:1081300071CB622D6AA87BA88CA89DA8022C04C0D4 |
:10814000660C771C881C991C0A94D2F76AAA7BAA31 |
:108150008CAA9DAA822F82192AAC3BAC4CAC5DAC98 |
:10816000082E04C056944794379427940A94D2F763 |
:108170002AAD3BAD4CAD5DAD062E04C0220F331FC2 |
:10818000441F551F0A94D2F78EA89FA8A8ACB9AC7B |
:1081900004C0B694A794979487948A95D2F7282917 |
:1081A00039294A295B292AAF3BAF4CAF5DAFAEA856 |
:1081B000BFA8C8ACD9AC04C0AA0CBB1CCC1CDD1C2D |
:1081C0006A95D2F7AEAABFAAC8AED9AEEAA8FBA8F4 |
:1081D0000CA91DA96801EE24FF24E696CCAEDDAE05 |
:1081E000EEAEFFAEE6970AA91BA92CA93DA9207007 |
:1081F0003070EA960CAF1DAF2EAF3FAFEA97C201C9 |
:10820000B101A70196010E9470446B017C01C2017B |
:10821000B101E6962CAD3DAD4EAD5FADE6970E9447 |
:10822000704466962CAF3DAF4EAF5FAF6697CA0104 |
:10823000B901EA962CAD3DAD4EAD5FADEA970E9417 |
:108240001E442B013C01A601332722278AAC9BAC9C |
:10825000ACACBDACC501AA27BB2769017A01C82A0D |
:10826000D92AEA2AFB2AC414D504E604F704A8F59F |
:1082700066960CAD1DAD2EAD3FAD6697015010401A |
:108280002040304066960CAF1DAF2EAF3FAF6697D3 |
:108290002AA93BA94CA95DA9C20ED31EE41EF51E56 |
:1082A000C216D306E406F506C0F0C414D504E604ED |
:1082B000F70498F466968CAD9DADAEADBFAD6697F4 |
:1082C0000197A109B10966968CAF9DAFAEAFBFAF64 |
:1082D0006697C20ED31EE41EF51EC418D508E60824 |
:1082E000F708C701B601E6962CAD3DAD4EAD5FADCA |
:1082F000E6970E9470444B015C01C701B601E69607 |
:108300002CAD3DAD4EAD5FADE6970E947044790156 |
:108310008A01CA01B901EA962CAD3DAD4EAD5FAD03 |
:10832000EA970E941E442B013C01A4013327222717 |
:108330008AAD9BADACADBDADA070B07049015A0126 |
:10834000882A992AAA2ABB2A84149504A604B70469 |
:1083500000F50894E108F108010911092AA93BA9CF |
:108360004CA95DA9820E931EA41EB51E821693060B |
:10837000A406B50670F084149504A604B70448F466 |
:108380000894E108F10801091109820E931EA41E48 |
:10839000B51E66962CAD3DAD4EAD5FAD6697D9016D |
:1083A000992788278E299F29A02BB12B26968CAF41 |
:1083B0009DAFAEAFBFAF269784189508A608B70843 |
:1083C0008AAE9BAEACAEBDAE50CB28E030E040E014 |
:1083D00050E093CA28E130E040E050E0D9C828E1FD |
:1083E00030E040E050E089CA28E030E040E050E072 |
:1083F000E6CA28E030E040E050E0CAC828E130E0BA |
:1084000040E050E0DCCA2E153F054007510708F058 |
:10841000B3CD089421083108410851082A0D3B1DAD |
:108420004C1D5D1DAA962CAF3DAF4EAF5FAFAA9716 |
:10843000A3CD0894E108F10801091109D8C9629691 |
:108440008CAD9DADAEADBFAD62970197A109B109ED |
:1084500062968CAF9DAFAEAFBFAF6297C20ED31E18 |
:10846000E41EF51E70C922962CAE3DAE4EAE5FAE38 |
:108470002297D0C96A968CAD9DADAEADBFAD6A975F |
:108480000197A109B1096A968CAF9DAFAEAFBFAF9E |
:108490006A97C20ED31EE41EF51E4BCB222D332D40 |
:1084A000442D552D662D772D882D992DE2E1C75845 |
:1084B000DF4F0C94C944A0E1B0E0E1E6F2E40C9493 |
:1084C000B544082F192F88E0FE013196982F11929C |
:1084D0009A95E9F729833A834B835C836D837E8386 |
:1084E0000F831887FE01399611928A95E9F7298141 |
:1084F0003A814B815C8188279927DC01821B930B91 |
:10850000A40BB50B89879A87AB87BC878D819E8129 |
:10851000AF81B885B095A095909581959F4FAF4F4D |
:10852000BF4F211531054105510519F00197A109EA |
:10853000B1098D879E87AF87B88B29853A854B8592 |
:108540005C856D857E858F859889EAE060960C94C0 |
:10855000D144FC014150504030F001900616D1F753 |
:108560003197CF0108958827992708955058192EDB |
:10857000EFD001D0D2C0BA176207730784079507FE |
:10858000B1F188F40EF410940B2EBA2FA02D062E04 |
:10859000622F202D072E732F302D082E842F402D73 |
:1085A000092E952F502DFF275523B9F0591B49F05F |
:1085B000573E98F0469537952795A795F0405395E7 |
:1085C000C9F776F0BA0F621F731F841F30F48795C6 |
:1085D00077956795B795F040939517FA0F2E089504 |
:1085E000BF1BBB27BA0B620B730B840BF6CFDEF6F7 |
:1085F000DBC0AED001D091C0552359F0992369F06A |
:108600009F575F57951B33F442F4903811F49158FB |
:1086100005C09BC091589F3F09F4C6C0BB271124D9 |
:1086200062177307840730F4660F771F881FBB1F1C |
:10863000915098F311D00F920FD00F920DD0A0E867 |
:108640002617370748071B0609F0A048BA2F602DE8 |
:108650007F918F9100240895A0E80024621773078A |
:108660008407B10528F0621B730B840BB1090A2A39 |
:10867000660F771F881FBB1FA69581F7089597FB8C |
:1086800073D09F3738F0FEE9F91B982F872F762F8C |
:108690006B2F05C086C09695879577956795F150A5 |
:1086A000D0F73EF490958095709561957F4F8F4FF0 |
:1086B0009F4F0895E89403C097FB0EF4F3DFB62FA5 |
:1086C000672F782F892F9EE9002427C00ED05EF0F7 |
:1086D00004C00BD026F001C008D019F020F48FEFB1 |
:1086E000089580E0089581E0089597FB092E0526FE |
:1086F00000F8689430D0E89407FC07C0621773074D |
:108700008407950721F008F400940794989408953D |
:108710009A95BB0F661F771F881F11249923A1F01C |
:108720008823B2F79F3F59F0BB0F48F421F4002093 |
:1087300011F460FF04C06F5F7F4F8F4F9F4F881F02 |
:108740009795879597F908952CC09FEF80EC089531 |
:10875000052E092607FA440F551F5F3F79F0AA2717 |
:10876000A51708F051E04795880F991F9F3F31F0FA |
:10877000BB27B91708F091E0879508959F919F91C5 |
:108780001124E3CF97FB880F991F9F3F31F0BB2740 |
:10879000B91708F091E0879508959F919F91112452 |
:1087A000D4CF66277727882799270895D1DF01D06E |
:1087B000B4CF992339F0552329F09F575F57950F70 |
:1087C00013F49AF1F1CF91589F3FE1F3629FA12DED |
:1087D0000F92BB27639FA00DB11DEE27729FA00DC6 |
:1087E000B11DEE1FAF93AA27649FB00DE11D739FCB |
:1087F000B00DE11DAA1F6627829FB00DE11DA61FC7 |
:108800005527749FE00DA11D551F839FE00DA11DED |
:10881000561F849FA00D511D852F7A2F6E2F1F90FC |
:108820000F9088231AF4939539F48FCF000C111C04 |
:10883000BB1F661F771F881F01280895629FD00104 |
:10884000739FF001829FE00DF11D649FE00DF11D0B |
:10885000929FF00D839FF00D749FF00D659FF00DBA |
:108860009927729FB00DE11DF91F639FB00DE11DA7 |
:10887000F91FBD01CF0111240895991B79E004C0AF |
:10888000991F961708F0961B881F7A95C9F780954F |
:108890000895AA1BBB1B51E107C0AA1FBB1FA61747 |
:1088A000B70710F0A61BB70B881F991F5A95A9F799 |
:1088B00080959095BC01CD01089597FB092E072660 |
:1088C0000AD077FD04D0E5DF06D000201AF47095B9 |
:1088D00061957F4F0895F6F7909581959F4F089584 |
:1088E000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FB4 |
:1088F000EE1FFF1FA217B307E407F50720F0A21B26 |
:10890000B30BE40BF50B661F771F881F991F1A9492 |
:1089100069F760957095809590959B01AC01BD01BC |
:10892000CF01089597FB092E05260ED057FD04D0E0 |
:10893000D7DF0AD0001C38F450954095309521952A |
:108940003F4F4F4F5F4F0895F6F790958095709584 |
:1089500061957F4F8F4F9F4F08952F923F924F9277 |
:108960005F926F927F928F929F92AF92BF92CF92BF |
:10897000DF92EF92FF920F931F93CF93DF93CDB7C8 |
:10898000DEB7CA1BDB0B0FB6F894DEBF0FBECDBF40 |
:1089900009942A88398848885F846E847D848C8411 |
:1089A0009B84AA84B984C884DF80EE80FD800C811A |
:1089B0001B81AA81B981CE0FD11D0FB6F894DEBFFD |
:1089C0000FBECDBFED010895F999FECFB2BDA1BD97 |
:1089D000F89A119600B40895F999FECFB2BDA1BDE1 |
:1089E00000BC11960FB6F894FA9AF99A0FBE089542 |
:1089F0000A6401FFFF010AFF03007D0000640048D4 |
:108A0000616C6C6F2057656C740000000000000002 |
:108A10000000000000000000000000000000000056 |
:108A20000000000000000000000000000000000046 |
:108A30000000000000000000000000000000000036 |
:108A40000000000000000000000000000000000125 |
:108A500002030405060708090A0A0146640A029689 |
:108A600096403A10FB3017B7D1380000803F6400C1 |
:108A700053706F727400004B616D6572610000E8A5 |
:108A800003E703E703E603E503E403E203E003DEB1 |
:108A900003DB03D803D503D203CE03CA03C503C146 |
:108AA00003BC03B703B103AB03A5039F0398039172 |
:108AB000038A0382037B0372036A03620359035030 |
:108AC0000346033D03330329031E0314030903FE76 |
:108AD00002F202E702DB02CF02C302B602AA029D43 |
:108AE00002900282027502670259024B023D022F78 |
:108AF00002200211020302F401E401D501C501B60E |
:108B000001A60196018601760166015601450135EF |
:108B100001240113010201F100E000CF00BE00AD0D |
:108B2000009C008B0079006800570045003400224B |
:108B30000011000000EFFFDEFFCCFFBBFFA9FF9894 |
:108B4000FF87FF75FF64FF53FF42FF31FF20FF0FD8 |
:108B5000FFFEFEEDFEDCFECBFEBBFEAAFE9AFE8A09 |
:108B6000FE7AFE6AFE5AFE4AFE3BFE2BFE1CFE0CFF |
:108B7000FEFDFDEFFDE0FDD1FDC3FDB5FDA7FD99B7 |
:108B8000FD8BFD7EFD70FD63FD56FD4AFD3DFD3113 |
:108B9000FD25FD19FD0EFD02FDF7FCECFCE2FCD706 |
:108BA000FCCDFCC3FCBAFCB0FCA7FC9EFC96FC8E82 |
:108BB000FC85FC7EFC76FC6FFC68FC61FC5BFC5574 |
:108BC000FC4FFC49FC44FC3FFC3BFC36FC32FC2ED9 |
:108BD000FC2BFC28FC25FC22FC20FC1EFC1CFC1BA6 |
:108BE000FC1AFC19FC19FC18FC19FC19FC1AFC1BDA |
:108BF000FC1CFC1EFC20FC22FC25FC28FC2BFC2E73 |
:108C0000FC32FC36FC3BFC3FFC44FC49FC4FFC5571 |
:108C1000FC5BFC61FC68FC6FFC76FC7EFC85FC8EDA |
:108C2000FC96FC9EFCA7FCB0FCBAFCC3FCCDFCD7B8 |
:108C3000FCE2FCECFCF7FC02FD0EFD19FD25FD310C |
:108C4000FD3DFD4AFD56FD63FD70FD7EFD8BFD99EA |
:108C5000FDA7FDB5FDC3FDD1FDE0FDEFFDFDFD0C64 |
:108C6000FE1CFE2BFE3BFE4AFE5AFE6AFE7AFE8A80 |
:108C7000FE9AFEAAFEBBFECBFEDCFEEDFEFEFE0F64 |
:108C8000FF20FF31FF42FF53FF64FF75FF87FF980E |
:108C9000FFA9FFBBFFCCFFDEFFEFFF0000110022AA |
:108CA00000340045005700680079008B009C00AD3F |
:108CB00000BE00CF00E000F10002011301240135E5 |
:108CC00001450156016601760186019601A601B6AD |
:108CD00001C501D501E401F4010302110220022FB4 |
:108CE000023D024B02590267027502820290029D08 |
:108CF00002AA02B602C302CF02DB02E702F202FEC0 |
:108D000002090314031E03290333033D03460350E2 |
:108D100003590362036A0372037B0382038A03918C |
:108D20000398039F03A503AB03B103B703BC03C1BF |
:108D300003C503CA03CE03D203D503D803DB03DE86 |
:108D400003E003E203E403E503E603E703E70300CC |
:108D50000011002200340045005700680079008BA4 |
:108D6000009C00AD00BE00CF00E000F10002011346 |
:108D700001240135014501560166017601860196FF |
:108D800001A601B601C501D501E401F401030211F8 |
:108D90000220022F023D024B025902670275028235 |
:108DA0000290029D02AA02B602C302CF02DB02E7D2 |
:108DB00002F202FE02090314031E03290333033DDA |
:108DC0000346035003590362036A0372037B038261 |
:108DD000038A03910398039F03A503AB03B103B771 |
:108DE00003BC03C103C503CA03CE03D203D503D812 |
:108DF00003DB03DE03E003E203E403E503E603E74A |
:108E000003E703E803E703E703E603E503E403E21C |
:108E100003E003DE03DB03D803D503D203CE03CA8A |
:108E200003C503C103BC03B703B103AB03A5039F91 |
:108E300003980391038A0382037B0372036A03622C |
:108E4000035903500346033D03330329031E031450 |
:108E5000030903FE02F202E702DB02CF02C302B6FD |
:108E600002AA029D02900282027502670259024B19 |
:108E7000023D022F02200211020302F401E401D597 |
:108E800001C501B601A6019601860176016601566B |
:108E90000145013501240113010201F100E000CF79 |
:108EA00000BE00AD009C008B0079006800570045B3 |
:108EB000003400220011000000EFFFDEFFCCFFBBFA |
:108EC000FFA9FF98FF87FF75FF64FF53FF42FF3143 |
:108ED000FF20FF0FFFFEFEEDFEDCFECBFEBBFEAA79 |
:108EE000FE9AFE8AFE7AFE6AFE5AFE4AFE3BFE2B80 |
:108EF000FE1CFE0CFEFDFDEFFDE0FDD1FDC3FDB54A |
:108F0000FDA7FD99FD8BFD7EFD70FD63FD56FD4ABD |
:108F1000FD3DFD31FD25FD19FD0EFD02FDF7FCECCB |
:108F2000FCE2FCD7FCCDFCC3FCBAFCB0FCA7FC9E69 |
:108F3000FC96FC8EFC85FC7EFC76FC6FFC68FC617C |
:108F4000FC5BFC55FC4FFC49FC44FC3FFC3BFC3605 |
:108F5000FC32FC2EFC2BFC28FC25FC22FC20FC1EF9 |
:108F6000FC1CFC1BFC1AFC19FC19FC18FC19FC1954 |
:108F7000FC1AFC1BFC1CFC1EFC20FC22FC25FC2813 |
:108F8000FC2BFC2EFC32FC36FC3BFC3FFC44FC4939 |
:108F9000FC4FFC55FC5BFC61FC68FC6FFC76FC7EC6 |
:108FA000FC85FC8EFC96FC9EFCA7FCB0FCBAFCC3C6 |
:108FB000FCCDFCD7FCE2FCECFCF7FC02FD0EFD193D |
:108FC000FD25FD31FD3DFD4AFD56FD63FD70FD7E35 |
:108FD000FD8BFD99FDA7FDB5FDC3FDD1FDE0FDEFC6 |
:108FE000FDFDFD0CFE1CFE2BFE3BFE4AFE5AFE6AFA |
:108FF000FE7AFE8AFE9AFEAAFEBBFECBFEDCFEEDEA |
:10900000FEFEFE0FFF20FF31FF42FF53FF64FF759E |
:10901000FF87FF98FFA9FFBBFFCCFFDEFFEFFF003C |
:10902000010202030303030404040404040404050A |
:1090300005050505050505050505050505050506DF |
:1090400006060606060606060606060606060606C0 |
:1090500006060606060606060606060606060607AF |
:109060000707070707070707070707070707070790 |
:109070000707070707070707070707070707070780 |
:109080000707070707070707070707070707070770 |
:10909000070707070707070707070707070707085F |
:1090A0000808080808080808080808080808080840 |
:1090B0000808080808080808080808080808080830 |
:1090C0000808080808080808080808080808080820 |
:1090D0000808080808080808080808080808080810 |
:1090E0000808080808080808080808080808080800 |
:1090F00008080808080808080808080808080808F0 |
:1091000008080808080808080808080808080808DF |
:1091100008080808080808080808080808080800D7 |
:00000001FF |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/GPS.c |
---|
0,0 → 1,300 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 10.2007 by Jochen Kromayer |
// + es handelt sich um eine Beta-Software, die zu nichtkommerziellen Zwecken frei veröffentlich und weitergegeben werden darf. Für evtl. |
// + Personen- und/der Sachschäden ist jegliche Haftung ausgeschlossen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "math.h" |
//Sinusfunktion von 0° bis 359°. Ergebnis wurde mit 1000 multipliziert, damit als Definition platzsparend int |
//verwendet werden kann. d.h., es muss also in der späteren Berechnung noch mit 0,001 multipliziert werden //(090907Kr) |
const int c_sin[] = {0,17,34,52,69,87,104,121,139,156,173,190, |
207,224,241,258,275,292,309,325,342,358,374,390,406,422,438,453,469,484,500,515,529,544,559,573,587,601,615,629, |
642,656,669,682,694,707,719,731,743,754,766,777,788,798,809,819,829,838,848,857,866,874,882,891,898,906,913,920, |
927,933,939,945,951,956,961,965,970,974,978,981,984,987,990,992,994,996,997,998,999,999,1000,999,999,998,997,996, |
994,992,990,987,984,981,978,974,970,965,961,956,951,945,939,933,927,920,913,906,898,891,882,874,866,857,848,838, |
829,819,809,798,788,777,766,754,743,731,719,707,694,682,669,656,642,629,615,601,587,573,559,544,529,515,500,484, |
469,453,438,422,406,390,374,358,342,325,309,292,275,258,241,224,207,190,173,156,139,121,104,87,69,52,34,17,0,-17, |
-34,-52,-69,-87,-104,-121,-139,-156,-173,-190,-207,-224,-241,-258,-275,-292,-309,-325,-342,-358,-374,-390,-406, |
-422,-438,-453,-469,-484,-500,-515,-529,-544,-559,-573,-587,-601,-615,-629,-642,-656,-669,-682,-694,-707,-719, |
-731,-743,-754,-766,-777,-788,-798,-809,-819,-829,-838,-848,-857,-866,-874,-882,-891,-898,-906,-913,-920,-927, |
-933,-939,-945,-951,-956,-961,-965,-970,-974,-978,-981,-984,-987,-990,-992,-994,-996,-997,-998,-999,-999,-1000, |
-999,-999,-998,-997,-996,-994,-992,-990,-987,-984,-981,-978,-974,-970,-965,-961,-956,-951,-945,-939,-933,-927, |
-920,-913,-906,-898,-891,-882,-874,-866,-857,-848,-838,-829,-819,-809,-798,-788,-777,-766,-754,-743,-731,-719, |
-707,-694,-682,-669,-656,-642,-629,-615,-601,-587,-573,-559,-544,-529,-515,-500,-484,-469,-453,-438,-422,-406, |
-390,-374,-358,-342,-325,-309,-292,-275,-258,-241,-224,-207,-190,-173,-156,-139,-121,-104,-87,-69,-52,-34,-17}; |
//Cosinusfunktion von 0° bis 359°. Ergebnis wurde mit 1000 multipliziert, damit als Definition platzsparend int |
//verwendet werden kann. D.h., es muss also in der späteren Berechnung noch mit 0,001 multipliziert werden //(090907Kr) |
const int c_cos[] = {1000,999,999,998,997,996,994,992,990,987,984,981, |
978,974,970,965,961,956,951,945,939,933,927,920,913,906,898,891,882,874,866,857,848,838,829,819,809,798,788,777, |
766,754,743,731,719,707,694,682,669,656,642,629,615,601,587,573,559,544,529,515,500,484,469,453,438,422,406,390, |
374,358,342,325,309,292,275,258,241,224,207,190,173,156,139,121,104,87,69,52,34,17,0,-17,-34,-52,-69,-87,-104, |
-121,-139,-156,-173,-190,-207,-224,-241,-258,-275,-292,-309,-325,-342,-358,-374,-390,-406,-422,-438,-453,-469, |
-484,-500,-515,-529,-544,-559,-573,-587,-601,-615,-629,-642,-656,-669,-682,-694,-707,-719,-731,-743,-754,-766, |
-777,-788,-798,-809,-819,-829,-838,-848,-857,-866,-874,-882,-891,-898,-906,-913,-920,-927,-933,-939,-945,-951, |
-956,-961,-965,-970,-974,-978,-981,-984,-987,-990,-992,-994,-996,-997,-998,-999,-999,-1000,-999,-999,-998,-997, |
-996,-994,-992,-990,-987,-984,-981,-978,-974,-970,-965,-961,-956,-951,-945,-939,-933,-927,-920,-913,-906,-898, |
-891,-882,-874,-866,-857,-848,-838,-829,-819,-809,-798,-788,-777,-766,-754,-743,-731,-719,-707,-694,-682,-669, |
-656,-642,-629,-615,-601,-587,-573,-559,-544,-529,-515,-500,-484,-469,-453,-438,-422,-406,-390,-374,-358,-342, |
-325,-309,-292,-275,-258,-241,-224,-207,-190,-173,-156,-139,-121,-104,-87,-69,-52,-34,-17,0,17,34,52,69,87, |
104,121,139,156,173,190,207,224,241,258,275,292,309,325,342,358,374,390,406,422,438,453,469,484,500,515,529,544, |
559,573,587,601,615,629,642,656,669,682,694,707,719,731,743,754,766,777,788,798,809,819,829,838,848,857,866,874, |
882,891,898,906,913,920,927,933,939,945,951,956,961,965,970,974,978,981,984,987,990,992,994,996,997,998,999,999}; |
long Soll_Position_North = 0; |
long Soll_Position_East = 0; |
long GPS_Positionsabweichung_North = 0; |
long GPS_Positionsabweichung_East = 0; |
long GPS_Geschwindigkeit_North = 0; |
long GPS_Geschwindigkeit_East = 0; |
long P_Einfluss_North = 0; |
long D_Einfluss_North = 0; |
long P_Einfluss_East = 0; |
long D_Einfluss_East = 0; |
signed int GPS_North = 0; |
signed int GPS_East = 0; |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
volatile char gethome = 0; //Flag ob GPS_Home_Position gelernt ist //(280807Kr) |
long GPS_Home_North = 0; |
long GPS_Home_East = 0; |
unsigned char blinkcount_LED2 = 0; //Hilfszähler für die blinkende LED (010907Kr) |
//**************************** MIRCOS DEFINITIONSANFANG FÜR DIE FILTERUNG |
// Filterung der GPS Messwerte vom Ublox-Empfänger. Es wird der gleitende Durchschnitt aus n Messwerten gebildet |
#define MITTELWERTZAHL 8 // Anzahl der Messwerte fuer gleitenden Mittelwert |
volatile char NeuerMittelwert = 0; //Flag ob ein neuer Mittelwert vorliegt, der mit 4 Hz berechnet wird, da nur dann neue Messwerte vom GPS vorliegen |
volatile unsigned char FilterPos = 0; |
volatile long NORTH_MITTEL = 0; |
volatile long EAST_MITTEL = 0; |
volatile long long NORTH_LONG_LONG = 0; |
volatile long long EAST_LONG_LONG = 0; |
volatile int filterfilled = 0; |
typedef struct { |
long NORTH[MITTELWERTZAHL]; |
} FILTER_NORTH; // Filterdefinition für die Positions-Nordwerte aus dem GPS-Empfänger |
typedef struct { |
long EAST[MITTELWERTZAHL]; |
} FILTER_EAST; // Filterdefinition für die Positions-Ostwerte aus dem GPS-Empfänger |
FILTER_NORTH filter_north; |
FILTER_EAST filter_east; |
//**************************** MIRCOS DEFINITIONSENDE FÜR DIE FILTERUNG |
void gps_main(void) |
{ |
//**************************** MIRCOS FILTERUNG ANFANG |
// if(actualPos.GPSFix == 3 && actualPos.newData == 1) //bilde neuen Positionsmittelwert, wenn 3D-Fix und neue GPS-Daten vorliegen |
if(actualPos.GPSFix == 3) // hier auskommentieren, wenn dauernd (also nicht nur alle 250ms) die GPS-Berechnung durchgeführt werden soll |
{ |
filter_north.NORTH[FilterPos] = actualPos.northing; |
filter_east.EAST[FilterPos] = actualPos.easting; |
FilterPos++; |
if (FilterPos==MITTELWERTZAHL) FilterPos=0; |
if (filterfilled<MITTELWERTZAHL) filterfilled++; |
NORTH_LONG_LONG = 0; |
EAST_LONG_LONG = 0; |
for (int i=0; i<filterfilled; i++) |
{ |
NORTH_LONG_LONG += filter_north.NORTH[i]; |
EAST_LONG_LONG += filter_east.EAST[i]; |
} |
NORTH_LONG_LONG /= filterfilled; |
EAST_LONG_LONG /= filterfilled; |
NORTH_MITTEL = NORTH_LONG_LONG; |
EAST_MITTEL = EAST_LONG_LONG; |
NeuerMittelwert = 1; |
//actualPos.newData = 0; // hier auskommentieren, wenn dauernd (also nicht nur alle 250ms) die GPS-Berechnung durchgeführt werden soll |
} |
//******************************* MIRCOS FILTERUNG ENDE |
//wenn kein 3D-Fix vorhanden, über das Poti jedoch irgendeine GPS Funktion aktiv ist, werden die GPS-Steuerbefehle |
//auf Null gesetzt, um unkontrolliertes Wegfliegen durch das GPS zu verhindern. Dadurch wird abgesichert |
//(auch im laufenden Flug), dass bei einem Verlust der GPS-Verbindung GPS deaktivert wird |
if (actualPos.GPSFix < 3 && Poti3 > 70) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
LED2_OFF; |
beeptime = 50; |
} |
// speichert die GPS_Home_Position beim 3D-Fix, MotorEINschalten und wenn noch nicht zu weit weggeflogen wurde |
// (modell_fliegt_gps < 2000) einmalig ab. Die Flugzeitabfrage sichert ab, dass bei einem Losfliegen ohne 3D-Fix die Home_Positinen |
// irgendwann später dort gelernt werden, wo dann zu ersten mal ein 3D-Fix vorhanden ist |
if (actualPos.GPSFix == 3 && MotorenEin == 1 && gethome == 0 && modell_fliegt_gps < 2000) |
{ |
GPS_Home_North = NORTH_MITTEL; |
GPS_Home_East = EAST_MITTEL; |
// Muss hier auch eingelernt werden, damit falls das Poti3 beim Motorenstarten in |
// Mittelstellung sein sollte, trotzdem schon eine Sollposition vorliegt. Andernfalls würde |
// GPS_Nick und _Roll maximal werden bis zum ersten Mal Stick_Nick und _Roll gesteuert würde |
Soll_Position_North = NORTH_MITTEL; |
Soll_Position_East = EAST_MITTEL; |
beeptime = 50; |
gethome = 1; |
} |
//löscht die GPS_Home_Position beim MotorAUSschalten wieder und resetet das Flag gethome //(280807Kr) |
if (MotorenEin == 0) |
{ |
GPS_Home_North = 0; |
GPS_Home_East = 0; |
gethome = 0; |
modell_fliegt_gps = 0; |
} |
// wenn Schalter ausgeschaltet, dann wird die LED2 ausgeschaltet und das GPS Steuerkommando gelöscht |
if(Poti3 < 70) |
{ |
// Sollpositionen müssen auch hier beschrieben werden, damit ausgeschlossen ist, dass falls gelandet wird und die GPS-Funktion |
// über Poti3 deaktivert und anschließend wieder aktiviert wird keine Soll-Positionen vorliegen. |
Soll_Position_North = NORTH_MITTEL; |
Soll_Position_East = EAST_MITTEL; |
GPS_Nick = 0; |
GPS_Roll = 0; |
LED2_OFF; |
} |
// wenn 3D-Fix, Schalter im mittleren Bereich und vom Pilot gesteuert wird, wird ständig neue GPS-Sollposition eingelernt |
if(actualPos.GPSFix == 3 && Poti3 > 70 && Poti3 < 150 && (StickNick > 12 || StickNick < -12 || StickRoll > 12 || StickRoll < -12)) |
{ |
GPS_Nick = 0; //wird genullt, damit das letzte GPS Kommando nicht ständig gegen den Piloten ansteuert |
GPS_Roll = 0; //wird genullt, damit das letzte GPS Kommando nicht ständig gegen den Piloten ansteuert |
Soll_Position_North = NORTH_MITTEL; // Soll-Position wird geschrieben |
Soll_Position_East = EAST_MITTEL; // Soll-Position wird geschrieben |
//++++++++++++++++++++++++++++++++++++ |
//Sorgt lediglich dafür, dass die LED2 langsam blinkt. Dauer ist durch die "> x" Abfrage festgelegt |
//++++++++++++++++++++++++++++++++++++ |
if(blinkcount_LED2 >= 200) // maximal erlaubt 255 wegen unsigned char |
{ |
LED2_FLASH; |
blinkcount_LED2 = 0; |
} |
blinkcount_LED2++; |
//++++++++++++++++++++++++++++++++++++ |
} |
// wenn 3D-Fix, Schalter im mittleren Bereich (oder höher), neuer Mittelwert vorhanden, wenigstens einmal Sollposition gelernt und der Pilot nicht selbst steuert wird eine GPS-Funktion aktiviert |
if (actualPos.GPSFix == 3 && Poti3 > 70 && NeuerMittelwert == 1 && Soll_Position_North != 0 && Soll_Position_East != 0 && StickNick <= 12 && StickNick >= -12 && StickRoll <= 12 && StickRoll >= -12) |
{ |
//Berechnung der GPS-Positionsabweichung je nach aktivierter GPS-Funktion (GPS_HOLD oder HOMING) |
//DYNAMISCHES GPS-HOLD, wenn Schalter noch in Mittelstellung ist wird die zuletzt gelernte Soll_Position angeflogen |
if(Poti3 < 150) |
{ |
GPS_Positionsabweichung_North = (Soll_Position_North - NORTH_MITTEL); |
GPS_Positionsabweichung_East = (Soll_Position_East - EAST_MITTEL); |
LED2_ON; |
} |
//andernfalls, wenn Schalter in max. Stellung und zusätzlich die GPS_Home_Positionen beim Motorenstarten gelernt |
//werden konnten, wird zur GPS_Home_Position geflogen |
if (Poti3 >= 150 && GPS_Home_North != 0 && GPS_Home_East != 0) |
{ |
GPS_Positionsabweichung_North = (GPS_Home_North - NORTH_MITTEL); |
GPS_Positionsabweichung_East = (GPS_Home_East - EAST_MITTEL); |
// durch das ständige Neulernen der Soll_Positionen während HOMING wird erreicht, dass der MK nach dem Umschalten |
// von HOMING zurück zu GPS-HOLD nicht wieder an die alte Soll_Position zurück fliegt |
Soll_Position_North = NORTH_MITTEL; |
Soll_Position_East = EAST_MITTEL; |
LED2_ON; |
} |
//verhindert, dass beim Umschalten von Mittelstellung (GPS_HOLD) auf Maximalstellung (HOMING) OHNE gelernte Homeposition |
//die GPS Funktion unkontrolliert steuert. Daher wird GPS_HOLD aktiv gehalten, die Sollpositon wird bei Stickbefehlen |
//jedoch nicht wie beim dynamischen GPS_HOLD überschrieben. Zusätzlich wird der Summer eingeschaltet. |
if (Poti3 >= 150 && GPS_Home_North == 0 && GPS_Home_East == 0) |
{ |
GPS_Positionsabweichung_North = (Soll_Position_North - NORTH_MITTEL); |
GPS_Positionsabweichung_East = (Soll_Position_East - EAST_MITTEL); |
LED2_ON; |
beeptime = 50; |
} |
//GPS-Geschwindigkeiten |
GPS_Geschwindigkeit_North = actualPos.velNorth; //actualPos.velNorth ist die Geschwindigkeiten aus dem GPS Empfänger entlang der Nord-Süd Richtung |
GPS_Geschwindigkeit_East = actualPos.velEast; //actualPos.velEast ist die Geschwindigkeiten aus dem GPS Empfänger entlang der Ost-West Richtung |
//Berechnung der Einzelkomponenten des PD-Reglers |
P_Einfluss_North = (P_GPS_Verstaerkung * GPS_Positionsabweichung_North)*0.0005; //entspricht einer Skalierung von 1/2000 |
D_Einfluss_North = (D_GPS_Verstaerkung * GPS_Geschwindigkeit_North)*0.00333; //entspricht einer Skalierung von 1/300 |
P_Einfluss_East = (P_GPS_Verstaerkung * GPS_Positionsabweichung_East)*0.0005; //entspricht einer Skalierung von 1/2000 |
D_Einfluss_East = (D_GPS_Verstaerkung * GPS_Geschwindigkeit_East)*0.00333; //entspricht einer Skalierung von 1/300 |
// Begrenzung des maximalen D-Anteils für pos. und neg. Werte. Grenze muss so geählt werden, |
// dass das Limit im normalen Position-Hold nicht erreicht wird und somit keinen Einfluss hat. |
// Grund: Beim Zufliegen auf weiter entfernte Ziele bremst der D-Anteil kurz vor dem Ziel den Mikrokopter sehr stark ab. |
// Dieses Limit wirkt nur, wenn sich der MK im HOMING Modus befindet und sich noch weit (>7m) von der Home-Position weg befindet. |
if (Poti3 >= 150 && GPS_Home_North != 0 && GPS_Home_East != 0 && (abs(GPS_Positionsabweichung_North) > 700 || abs(GPS_Positionsabweichung_East) > 700)) |
{ |
if (D_Einfluss_North > Limit_D_Anteil) D_Einfluss_North = Limit_D_Anteil; |
if (D_Einfluss_East > Limit_D_Anteil) D_Einfluss_East = Limit_D_Anteil; |
if (D_Einfluss_North < -1 * Limit_D_Anteil) D_Einfluss_North = -1 * Limit_D_Anteil; |
if (D_Einfluss_East < -1 * Limit_D_Anteil) D_Einfluss_East = -1 * Limit_D_Anteil; |
} |
// PD-Regler |
GPS_North = (-P_Einfluss_North + D_Einfluss_North); |
GPS_East = (P_Einfluss_East - D_Einfluss_East); |
//Umrechnen vom globalen North- bzw. East- in das körperfeste X- bzw. Y- Koordinatensystem |
GPS_Nick = (-c_sin[KompassValue]*0.001*GPS_East + c_cos[KompassValue]*0.001*GPS_North); // die "0" kann später durch den Messwert des Kompasssensors (KompassValue/0.01745329251) ersetzt werden |
GPS_Roll = (c_cos[KompassValue]*0.001*GPS_East + c_sin[KompassValue]*0.001*GPS_North); // die "0" kann später durch den Messwert des Kompasssensors (KompassValue/180*3.1415926535) ersetzt werden |
// Begrenzung des maximalen GPS Einflusses für positive und negative Werte |
if (GPS_Nick > 35) GPS_Nick = 35; |
if (GPS_Roll > 35) GPS_Roll = 35; |
if (GPS_Nick < -35) GPS_Nick = -35; |
if (GPS_Roll < -35) GPS_Roll = -35; |
//Funktion wird dadurch nur alle 250 ms aufgerufen, wenn neue Mittelwerte aus den GPS-Daten vorliegen. |
//FUNKTIONIERT MOMENTAN NOCH NICHT, DA STÄNDIG OHNE UNTERBRECHUNG NEUE MITTELWERTE BERECHNET WERDEN. |
//GRUND: DIE ABFRAGE NACH NEUE GPS-DATEN ERFOLGT NOCH NICHT |
NeuerMittelwert = 0; |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/MIKROKOPTER_TO_DO.txt |
---|
0,0 → 1,11 |
. Patricks neigungskompensierten Kompass |
. Aufruf der GPS.c innerhalb der fc.c nur wenn neue Daten vorliegen |
. innerhalb der GPS.c den PD-Regler nicht mit "NeuerMittelwert", sondern mit "actualpos.newdata" alle 250ms aufrufen |
. GPS-Empfänger auf 5Hz einstellen |
. Begrenzung von 35 auf 50 anheben, damit auch bei stärkerem Wind geflogen werden kann |
. Waypoints |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Parameter.txt |
---|
0,0 → 1,15 |
bei leichtem, konstantem Wind |
P-Faktor(Userparam_1): 120 |
D-Faktor(Userparam_2): 90 |
D-Anteil_Limit(Userparam_3): 45 |
bei stärkerem, böhigem Wind: |
P-Faktor(Userparam_1): 150 |
D-Faktor(Userparam_2): 95 |
D-Anteil_Limit(Userparam_3): 45 |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Settings.h |
---|
--- _Settings.h (nonexistent) |
+++ _Settings.h (revision 202) |
@@ -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 500 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/analog.c |
---|
0,0 → 1,172 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
signed int wert; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
wert = (signed int) AdNeutralGier - ADC; |
if(PlatinenVersion != 10) wert *= 2; |
AccumulateGier += wert; // |
MessanzahlGier++; |
Mess_Integral_Gier += wert;// / 16; |
Mess_Integral_Gier2 += wert; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
wert = (signed int) ADC - AdNeutralRoll; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralRoll += wert; |
Mess_IntegralRoll2 += wert; |
if(Mess_IntegralRoll > 310000L) Mess_IntegralRoll = -290000L; |
if(Mess_IntegralRoll <-310000L) Mess_IntegralRoll = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
AccumulateRoll += wert; |
MessanzahlRoll++; |
kanal = 2; |
break; |
case 2: |
wert = (signed int) ADC - AdNeutralNick; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralNick += wert; |
Mess_IntegralNick2 += wert; |
if(Mess_IntegralNick > 310000L) Mess_IntegralNick = -290000L; |
if(Mess_IntegralNick <-310000L) Mess_IntegralNick = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
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_ax = ADC - NeutralAccX; |
accumulate_AccNick += Aktuell_ax; |
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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/eeprom.c |
---|
--- fc.c (nonexistent) |
+++ fc.c (revision 202) |
@@ -0,0 +1,981 @@ |
+/*####################################################################################### |
+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 int I2CTimeout = 100; |
+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; |
+ |
+unsigned char blinkcount_LED1 = 0;//Hilfszähler für die blinkende LED (310807Kr) |
+unsigned int modell_fliegt_gps = 0;//(030907Kr) |
+unsigned char Limit_D_Anteil = 0;//(210907Kr) |
+ |
+float GyroFaktor; |
+float IntegralFaktor; |
+ |
+volatile int DiffNick,DiffRoll; |
+int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0, Poti5 = 0, Poti6 = 0, Poti7 = 0, Poti8 = 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; |
+unsigned char Looping_Nick = 0,Looping_Roll = 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 = 150; // Wert : 10-250 |
+unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
+unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
+unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
+unsigned char Parameter_UserParam1 = 0; |
+unsigned char Parameter_UserParam2 = 0; |
+unsigned char Parameter_UserParam3 = 0; |
+unsigned char Parameter_UserParam4 = 0; |
+unsigned char Parameter_ServoNickControl = 100; |
+unsigned char Parameter_LoopGasLimit = 70; |
+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(); |
+ } |
+ |
+ if(PlatinenVersion == 10) |
+ { |
+ AdNeutralNick= abs(MesswertNick); |
+ AdNeutralRoll= abs(MesswertRoll); |
+ AdNeutralGier= abs(MesswertGier); |
+ } |
+ else |
+ { |
+ AdNeutralNick= abs(MesswertNick) / 2; |
+ AdNeutralRoll= abs(MesswertRoll) / 2; |
+ AdNeutralGier= abs(MesswertGier) / 2; |
+ } |
+ 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; |
+ 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(Poti5 < PPM_in[9] + 110) Poti5++; else if(Poti5 > PPM_in[9] + 110 && Poti5) Poti5--; |
+ if(Poti6 < PPM_in[10] + 110) Poti6++; else if(Poti6 > PPM_in[10] + 110 && Poti6) Poti6--; |
+ if(Poti7 < PPM_in[11] + 110) Poti7++; else if(Poti7 > PPM_in[11] + 110 && Poti7) Poti7--; |
+ if(Poti8 < PPM_in[12] + 110) Poti8++; else if(Poti8 > PPM_in[12] + 110 && Poti8) Poti8--; |
+ |
+ |
+ 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; |
+ if(Poti5 < 0) Poti5 = 0; else if(Poti5 > 255) Poti5 = 255; |
+ if(Poti6 < 0) Poti6 = 0; else if(Poti6 > 255) Poti6 = 255; |
+ if(Poti7 < 0) Poti7 = 0; else if(Poti7 > 255) Poti7 = 255; |
+ if(Poti8 < 0) Poti8 = 0; else if(Poti8 > 255) Poti8 = 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(Poti5 < PPM_in[9] + 110) Poti5++; else if(Poti5 > PPM_in[9] + 110 && Poti5) Poti5--; |
+ if(Poti6 < PPM_in[10] + 110) Poti6++; else if(Poti6 > PPM_in[10] + 110 && Poti6) Poti6--; |
+ if(Poti7 < PPM_in[11] + 110) Poti7++; else if(Poti7 > PPM_in[11] + 110 && Poti7) Poti7--; |
+ if(Poti8 < PPM_in[12] + 110) Poti8++; else if(Poti8 > PPM_in[12] + 110 && Poti8) Poti8--; |
+ |
+ |
+ |
+ |
+ 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; |
+ if(Poti5 < 0) Poti5 = 0; else if(Poti5 > 255) Poti5 = 255; |
+ if(Poti6 < 0) Poti6 = 0; else if(Poti6 > 255) Poti6 = 255; |
+ if(Poti7 < 0) Poti7 = 0; else if(Poti7 > 255) Poti7 = 255; |
+ if(Poti8 < 0) Poti8 = 0; else if(Poti8 > 255) Poti8 = 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; |
+ |
+ // DebugOut.Analog[12] = motor_rx[0]; //Motorstrom vorne |
+ // DebugOut.Analog[13] = motor_rx[1]; //Motorstrom hinten |
+ // DebugOut.Analog[14] = motor_rx[2]; //Motorstrom links |
+ // DebugOut.Analog[15] = motor_rx[3]; //Motorstrom 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] = 7; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 6; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_GAS] = 5; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_GIER] = 8; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 1; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 2; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 3; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 4; // (300807Kr) |
+ 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 = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 5; // Wert : 0-32 // (160607Kr) |
+ 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 = 95; // Wert : 0-250 // (160607Kr) |
+ 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 = 0; |
+ 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; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
+ memcpy(EE_Parameter.Name, "Sport\0", 12); |
+} |
+ |
+void DefaultKonstanten2(void) |
+{ |
+ EE_Parameter.Kanalbelegung[K_NICK] = 7; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 6; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_GAS] = 5; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_GIER] = 8; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 1; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 2; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 3; // (300807Kr) |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 4; // (300807Kr) |
+ 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 = 5; // Wert : 0-32 // (160607Kr) |
+ 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 = 95; // Wert : 0-250 // (160607Kr) |
+ 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 = 0; |
+ 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; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
+ 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); |
+ 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); |
+ CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,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; |
+ long IntegralFehlerNick = 0; |
+ long IntegralFehlerRoll = 0; |
+ static unsigned int RcLostTimer; |
+ static unsigned char delay_neutral = 0; |
+ static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
+ static unsigned int modell_fliegt = 0; |
+ static int hoehenregler = 0; |
+ static char TimerWerteausgabe = 0; |
+ static char NeueKompassRichtungMerken = 0; |
+ 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) |
+ { |
+ if(BeepMuster == 0xffff) |
+ { |
+ beeptime = 15000; |
+ BeepMuster = 0x0c00; |
+ } |
+ } |
+ if(RcLostTimer) RcLostTimer--; |
+ else |
+ { |
+ MotorenEin = 0; |
+ Notlandung = 0; |
+ } |
+ ROT_ON; |
+ if(modell_fliegt > 2000) // wahrscheinlich in der Luft --> langsam absenken |
+ { |
+ GasMischanteil = EE_Parameter.NotGas; |
+ Notlandung = 1; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
+ } |
+ else MotorenEin = 0; |
+ } |
+ else |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang gut |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay > 140) |
+ { |
+ Notlandung = 0; |
+ RcLostTimer = EE_Parameter.NotGasZeit * 50; |
+ if(GasMischanteil > 40) |
+ { |
+ if(modell_fliegt < 0xffff) modell_fliegt++; |
+ modell_fliegt_gps = modell_fliegt;// (030907Kr) |
+ } |
+ 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; |
+ 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 |
+ } |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
+ SetNeutral(); |
+ Piep(GetActiveParamSetNumber()); |
+ } |
+ } |
+ else 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; |
+ // greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
+ if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ if(IntegralNick > 60000) |
+ { |
+ StickNick -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralNick < -60000) |
+ { |
+ StickNick += 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ if(IntegralRoll > 60000) |
+ { |
+ StickRoll -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralRoll < -60000) |
+ { |
+ StickRoll += 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// LED Stuff |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+LED1_OFF; |
+ |
+ if(blinkcount_LED1 >= Parameter_UserParam4 && Parameter_UserParam4 > 0) |
+ { |
+ LED1_FLASH; |
+ blinkcount_LED1 = 0; |
+ } |
+ |
+ blinkcount_LED1++; |
+ |
+ //if(PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] > 75) LED1_ON; else LED1_OFF; //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
+ //if(PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] > 75) LED2_ON; else LED2_OFF; //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Looping? |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ Looping_Roll = 1; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Roll = 0; |
+ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN)) |
+ { |
+ Looping_Nick = 1; |
+ Looping_Roll = 0; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Nick = 0; |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Bei Empfangsausfall im Flug |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Notlandung) |
+ { |
+ StickGier = 0; |
+ StickNick = 0; |
+ StickRoll = 0; |
+ GyroFaktor = 0.1; |
+ IntegralFaktor = 0.005; |
+ Looping_Roll = 0; |
+ Looping_Nick = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// 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--; // macht nur mit Referenz (Kompass Sinn) |
+// if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; // macht nur mit Referenz (Kompass Sinn) |
+ 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 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(IntegralFaktor && !Looping_Nick && !Looping_Roll) |
+ { |
+ tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
+ if(labs(Mittelwert_AccNick) < 200) tmp_long /= 8; |
+ else tmp_long /= 16; |
+ tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
+ if(labs(Mittelwert_AccRoll) < 200) tmp_long2 /= 8; |
+ else tmp_long2 /= 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; |
+ } |
+ else |
+ { |
+ tmp_long = 0; |
+ tmp_long2 = 0; |
+ } |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick -= tmp_long; |
+ Mess_IntegralRoll -= tmp_long2; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(abs(StickGier) > 20) // war 35 |
+ { |
+ if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
+ } |
+ tmp_int = EE_Parameter.Gier_P * (StickGier * abs(StickGier)) / 512; // expo y = ax + bx² |
+ tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
+ sollGier = tmp_int; |
+ Mess_Integral_Gier -= tmp_int; |
+ if(Mess_Integral_Gier > 25000) Mess_Integral_Gier = 25000; // begrenzen |
+ if(Mess_Integral_Gier <-25000) Mess_Integral_Gier =-25000; |
+ |
+ ANALOG_ON; // ADC einschalten |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Kompass |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
+ { |
+ int w,v; |
+ static int SignalSchlecht = 0; |
+ w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
+ v = abs(IntegralRoll /512); |
+ if(v > w) w = v; // grösste Neigung ermitteln |
+ if(w < 25 && NeueKompassRichtungMerken && !SignalSchlecht) |
+ { |
+ KompassStartwert = KompassValue; |
+ NeueKompassRichtungMerken = 0; |
+ } |
+ w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
+ w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
+ if(w > 0) |
+ { |
+ 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 |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// GPS |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+if(EE_Parameter.GlobalConfig & CFG_GPS_AKTIV) |
+{ |
+ P_GPS_Verstaerkung = Parameter_UserParam1; |
+ D_GPS_Verstaerkung = Parameter_UserParam2; |
+ Limit_D_Anteil = Parameter_UserParam3; |
+ gps_main(); |
+} |
+else |
+{ |
+ GPS_Nick = 0; |
+ GPS_Roll = 0; |
+} |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debugwerte zuordnen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!TimerWerteausgabe--) |
+ { |
+ TimerWerteausgabe = 49; |
+ |
+ DebugOut.Analog[0] = actualPos.GPSFix; |
+ DebugOut.Analog[1] = GPS_Roll; |
+ DebugOut.Analog[2] = GPS_Nick; |
+ DebugOut.Analog[3] = GPS_Positionsabweichung_North; |
+ DebugOut.Analog[4] = GPS_Positionsabweichung_East; |
+ DebugOut.Analog[5] = P_Einfluss_East; |
+ DebugOut.Analog[6] = D_Einfluss_East; |
+ DebugOut.Analog[7] = P_Einfluss_North; |
+ DebugOut.Analog[8] = D_Einfluss_North; |
+ DebugOut.Analog[9] = Soll_Position_North; |
+ DebugOut.Analog[10] = Soll_Position_East; |
+ DebugOut.Analog[11] = Parameter_UserParam1; |
+ DebugOut.Analog[12] = Parameter_UserParam2; |
+ DebugOut.Analog[13] = Poti6; |
+ DebugOut.Analog[14] = KompassValue; |
+ DebugOut.Analog[15] = GPS_Home_North; |
+ DebugOut.Analog[16] = GPS_Home_East; |
+ DebugOut.Analog[17] = NORTH_MITTEL; |
+ DebugOut.Analog[18] = EAST_MITTEL; |
+ DebugOut.Analog[19] = actualPos.northing; |
+ DebugOut.Analog[20] = actualPos.easting; |
+ DebugOut.Analog[21] = actualPos.velNorth; |
+ DebugOut.Analog[22] = actualPos.velEast; |
+ DebugOut.Analog[23] = UBat; |
+ DebugOut.Analog[24] = (motor_rx[0]+motor_rx[1]+motor_rx[2]+motor_rx[3])/4; //Mittelwert aller Motorenströme |
+ DebugOut.Analog[25] = motor_rx[0]+motor_rx[1]+motor_rx[2]+motor_rx[3]; //Gesamtstrom aller Motoren |
+ DebugOut.Analog[26] = HoehenWert; |
+ DebugOut.Analog[27] = IntegralNick / EE_Parameter.GyroAccFaktor; |
+ DebugOut.Analog[28] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
+ DebugOut.Analog[29] = Mittelwert_AccNick; |
+ DebugOut.Analog[30] = Mittelwert_AccRoll; |
+ DebugOut.Analog[31] = 0; |
+ } |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
+ else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
+ if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
+ else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
+// MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
+ MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
+ |
+ // 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 - 40; // Parameter_MaxHoehe ist der PPM-Wert des Schalters // (160607Kr) |
+ HoehenReglerAktiv = 0; |
+ } |
+ else |
+ HoehenReglerAktiv = 1; |
+ } |
+ else |
+ { |
+ SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 40; // (160607Kr) |
+ HoehenReglerAktiv = 1; |
+ } |
+ |
+ if(Notlandung) SollHoehe = 0; |
+ h = HoehenWert; |
+ if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
+ { h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
+ h = GasMischanteil - h; // vom Gas abziehen |
+ h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
+ tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
+ if(tmp_int > 50) tmp_int = 50; |
+ else if(tmp_int < -50) tmp_int = -50; |
+ h -= tmp_int; |
+ hoehenregler = (hoehenregler*15 + h) / 16; |
+ if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
+ { |
+ if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
+ if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
+ } |
+ if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
+ GasMischanteil = hoehenregler; |
+ } |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Mischer und PI-Regler |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ // DebugOut.Analog[7] = GasMischanteil; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gier-Anteil |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MUL_G 1.0 |
+ GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
+//GierMischanteil = 0; |
+ if(GierMischanteil > (MUL_G * GasMischanteil)) GierMischanteil = MUL_G * GasMischanteil; |
+ if(GierMischanteil < -(MUL_G * GasMischanteil)) GierMischanteil = -(MUL_G * GasMischanteil); |
+ if(GierMischanteil > 100) GierMischanteil = 100; |
+ if(GierMischanteil < -100) GierMischanteil = -100; |
+ |
+ if(GasMischanteil < 20) GierMischanteil = 0; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// 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 |
+#define MUL 2 |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ |
+ motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Vorne = motorwert; |
+ // Motor Heck |
+ motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Hinten = motorwert; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Roll-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DiffRoll = 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 |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ // Motor Links |
+ motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Links = motorwert; |
+ // Motor Rechts |
+ motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Rechts = motorwert; |
+ // +++++++++++++++++++++++++++++++++++++++++++++++ |
+} |
+ |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/fc.h |
---|
0,0 → 1,121 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern unsigned int modell_fliegt_gps;//(030907Kr) |
extern unsigned char Limit_D_Anteil;//(210907Kr) |
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, Poti5, Poti6, Poti7, Poti8; |
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; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
#endif //_FC_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="fc.c"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File></Project> |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/gps.h |
---|
0,0 → 1,26 |
extern long P_Einfluss_North; |
extern long D_Einfluss_North; |
extern long P_Einfluss_East; |
extern long D_Einfluss_East; |
extern long GPS_Positionsabweichung_North; |
extern long GPS_Positionsabweichung_East; |
extern long GPS_Geschwindigkeit_North; |
extern long GPS_Geschwindigkeit_East; |
extern long GPS_Home_North; |
extern long GPS_Home_East; |
extern long Soll_Position_North; |
extern long Soll_Position_East; |
extern volatile long EAST_MITTEL; |
extern volatile long NORTH_MITTEL; |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern void GPS_Neutral(void); |
extern void GPS_BerechneZielrichtung(void); |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/main.c |
---|
0,0 → 1,227 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 62 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 2); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/main.h |
---|
0,0 → 1,109 |
#ifndef _MAIN_H |
#define _MAIN_H |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if(PlatinenVersion == 10) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if(PlatinenVersion == 10) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTB ^= 0x02 |
#define LED1_OFF PORTC &=~0x04 //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
#define LED1_ON PORTC |= 0x04 //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
#define LED1_FLASH PORTC ^= 0x04 //Erweiterung by 4ndreas aus mikrosvn branches // (280807Kr) |
#define LED2_OFF PORTC &=~0x08 //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
#define LED2_ON PORTC |= 0x08 //Erweiterung von Smartie aus dem MK-Forum vom 14.06.07. Dadurch können die Transistorausgänge J16 und J17 geschaltet werden. // (160607Kr) |
#define LED2_FLASH PORTC ^= 0x08 //Erweiterung by 4ndreas aus mikrosvn branches // (280807Kr) |
//#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_LAST_OFFSET 3 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
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[]; |
long durchschnitt_northing; |
long durchschnitt_easting; |
volatile int P_GPS_Verstaerkung; //P-Anteil (80-120) |
volatile int D_GPS_Verstaerkung; //D-Anteil (90) |
#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" |
#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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/makefile |
---|
0,0 → 1,391 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 643 |
VERSION_KOMPATIBEL = 5 # 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 |
########################################################################################################## |
# 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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/menu.c |
---|
0,0 → 1,118 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); } |
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,"HW:V%d.%d SW:%d.%d",PlatinenVersion/10,PlatinenVersion%10,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 K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
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,"Po1: %3i Po5: %3i" ,Poti1,Poti5); |
LCD_printfxy(0,1,"Po2: %3i Po6: %3i" ,Poti2,Poti6); |
LCD_printfxy(0,2,"Po3: %3i Po7: %3i" ,Poti3,Poti7); |
LCD_printfxy(0,3,"Po4: %3i Po8: %3i" ,Poti4,Poti8); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/menu.h |
---|
0,0 → 1,5 |
extern void Menu(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
unsigned char RemoteTasten; |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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[15]; |
volatile int PPM_diff[15]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if ((signal > 1500) && (signal < 8000)) |
{ |
index = 1; |
NewPpmData = 0; // Null bedeutet: Neue Daten |
// OCR2A = Poti2/2 + 80; |
} |
else |
{ |
if(index < 14) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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[15]; |
extern volatile int PPM_diff[15]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/timer0.c |
---|
0,0 → 1,158 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV || EE_Parameter.GlobalConfig & CFG_GPS_AKTIV) //Abfrage um GPS_AKTIV erweitert, damit auch bei nur eingeschaltetem GPS OHNE Kompass der benötigte Kompassvalue berechnet wird (200907Kr) |
{ |
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; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/timer0.h |
---|
0,0 → 1,15 |
#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; |
extern unsigned int BeepMuster; |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/uart.c |
---|
0,0 → 1,642 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// + |
// + GPS read out: |
// + modified Version of the Pitschu Brushless Ufo - (c) Peter Schulten, Mülheim, Germany |
// + only for non-profit use |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#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; |
static uint8_t gpsState; |
#define GPS_EMPTY 0 |
#define GPS_SYNC1 1 |
#define GPS_SYNC2 2 |
#define GPS_CLASS 3 |
#define GPS_LEN1 4 |
#define GPS_LEN2 5 |
#define GPS_FILLING 6 |
#define GPS_CKA 7 |
#define GPS_CKB 8 |
gpsInfo_t actualPos; // measured position (last gps record) |
#define SYNC_CHAR1 0xb5 |
#define SYNC_CHAR2 0x62 |
#define CLASS_NAV 0x01 |
#define MSGID_POSECEF 0x01 |
#define MSGID_STATUS 0x03 |
#define MSGID_VELECEF 0x11 |
#define MSGID_POSUTM 0x08 |
#define MSGID_VELNED 0x12 |
typedef struct { |
unsigned long ITOW; // time of week |
uint8_t GPSfix; // GPSfix Type, range 0..6 |
uint8_t Flags; // Navigation Status Flags |
uint8_t DiffS; // Differential Status |
uint8_t res; // reserved |
unsigned long TTFF; // Time to first fix (millisecond time tag) |
unsigned long MSSS; // Milliseconds since Startup / Reset |
uint8_t packetStatus; |
} NAV_STATUS_t; |
typedef struct { |
unsigned long ITOW; // time of week |
long LON; // longitude in 1e-07 deg |
long LAT; // lattitude |
long HEIGHT; // height in mm |
long HMSL; // height above mean sea level im mm |
unsigned long Hacc; // horizontal accuracy in mm |
unsigned long Vacc; // vertical accuracy in mm |
uint8_t packetStatus; |
} NAV_POSLLH_t; |
typedef struct { |
unsigned long ITOW; // time of week |
long EAST; // cm UTM Easting |
long NORTH; // cm UTM Nording |
long ALT; // cm altitude |
uint8_t ZONE; // UTM zone number |
uint8_t HEM; // Hemisphere Indicator (0=North, 1=South) |
uint8_t packetStatus; |
} NAV_POSUTM_t; |
typedef struct { |
unsigned long ITOW; // ms GPS Millisecond Time of Week |
long VEL_N; // cm/s NED north velocity |
long VEL_E; // cm/s NED east velocity |
long VEL_D; // cm/s NED down velocity |
unsigned long Speed; // cm/s Speed (3-D) |
unsigned long GSpeed; // cm/s Ground Speed (2-D) |
long Heading; // deg (1e-05) Heading 2-D |
unsigned long SAcc; // cm/s Speed Accuracy Estimate |
unsigned long CAcc; // deg Course / Heading Accuracy Estimate |
uint8_t packetStatus; |
} NAV_VELNED_t; |
typedef struct { |
unsigned long ITOW; // ms GPS Millisecond Time of Week |
long ECEF_X; // ecef x / cm |
long ECEF_Y; // ecef y / cm |
long ECEF_Z; // ecef z / cm |
unsigned long Pacc; // Abweichung |
uint8_t packetStatus; |
} NAV_POSECEF_t ; |
typedef struct { |
unsigned long ITOW; // ms GPS Millisecond Time of Week |
long ECEFVX; // ecef x velocity cm/s |
long ECEFVY; // ecef y velocity cm/s |
long ECEFVZ; // ecef z velocity cm/s |
unsigned long SAcc; // Abweichung |
uint8_t packetStatus; |
} NAV_VELECEF_t; |
NAV_STATUS_t navStatus; |
NAV_POSECEF_t navPosECEF; |
NAV_VELECEF_t navVelECEF; |
NAV_POSUTM_t navPosUtm; |
NAV_VELNED_t navVelNed; |
volatile char *ubxP, *ubxEp, *ubxSp; // pointers to packet currently transfered |
volatile uint8_t CK_A, CK_B; // UBX checksum bytes |
volatile unsigned short msgLen; |
volatile uint8_t msgID; |
volatile uint8_t ignorePacket; // true when previous packet was not processed |
// distance to target position |
long rollOffset; // in 10cm |
long nickOffset; |
#define GPS_INTCYCLES 100 |
#define GPS_I_LIMIT (long)(40 * MAINLOOPS_PER_SEC) |
#ifdef GPS_DEBUG // if set then the GPS data is transfered to display |
extern volatile uint8_t v24state; |
char buf[200]; |
char *bp; |
char *ep; |
#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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; |
} |
void GPSscanData (void) |
{ |
if (navPosECEF.packetStatus == 1) // valid packet |
{ |
actualPos.x = navPosECEF.ECEF_X; //ECEF X in cm |
actualPos.y = navPosECEF.ECEF_Y; //ECEF Y in cm |
actualPos.z = navPosECEF.ECEF_Z; //ECEF Z in cm |
navPosECEF.packetStatus = 0; |
} |
if (navStatus.packetStatus == 1) // valid packet |
{ |
actualPos.GPSFix = navStatus.GPSfix; |
actualPos.newData = navStatus.packetStatus; |
navStatus.packetStatus = 0; |
} |
if (navVelECEF.packetStatus == 1) // valid packet |
{ |
actualPos.vx = navVelECEF.ECEFVX; //ECEF VEL X in cm/s |
actualPos.vy = navVelECEF.ECEFVY; //ECEF VEL Y in cm/s |
actualPos.vz = navVelECEF.ECEFVZ; //ECEF VEL Z in cm/s |
navVelECEF.packetStatus = 0; |
} |
if (navPosUtm.packetStatus == 1) // valid packet |
{ |
actualPos.northing = navPosUtm.NORTH; |
actualPos.easting = navPosUtm.EAST; |
actualPos.altitude = navPosUtm.ALT; |
navPosUtm.packetStatus = 0; |
} |
if (navVelNed.packetStatus == 1) |
{ |
actualPos.velNorth = navVelNed.VEL_N; |
actualPos.velEast = navVelNed.VEL_E; |
navVelNed.packetStatus = 0; |
} |
if (actualPos.newData != 0){ROT_ON;} //-> Rot blinkt mit 4Hz wenn Daten vom GPS Empfänger ankommen und brauchbar sind |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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; |
uint8_t c; |
uint8_t re; |
re = (UCSR0A & (_B1(FE0) | _B1(DOR0))); // any error occured ? |
c = SioTmp; |
#ifdef GPS_DEBUG |
*bp++ = c; |
if (bp >= (buf+200)) bp = buf; |
if (v24state == 0) |
{ |
v24state = 1; |
UDR0 = *ep++; |
if (ep >= buf+200) |
ep = buf; |
UCSR0B |= _B1(UDRIE0); //enable further irqs |
} |
#endif |
if (re == 0) |
{ |
switch (gpsState) |
{ |
case GPS_EMPTY: |
if (c == SYNC_CHAR1) |
gpsState = GPS_SYNC1; |
break; |
case GPS_SYNC1: |
if (c == SYNC_CHAR2) |
gpsState = GPS_SYNC2; |
else if (c != SYNC_CHAR1) |
gpsState = GPS_EMPTY; |
break; |
case GPS_SYNC2: |
if (c == CLASS_NAV) |
gpsState = GPS_CLASS; |
else |
gpsState = GPS_EMPTY; |
break; |
case GPS_CLASS: // msg ID seen: init packed receive |
msgID = c; |
CK_A = CLASS_NAV + c; |
CK_B = CLASS_NAV + CK_A; |
gpsState = GPS_LEN1; |
switch (msgID) |
{ |
case MSGID_STATUS: |
ubxP = (char*)&navStatus; |
ubxEp = (char*)(&navStatus + sizeof(NAV_STATUS_t)); |
ubxSp = (char*)&navStatus.packetStatus; |
ignorePacket = navStatus.packetStatus; |
break; |
case MSGID_POSECEF: |
ubxP = (char*)&navPosECEF; |
ubxEp = (char*)(&navPosECEF + sizeof(NAV_POSECEF_t)); |
ubxSp = (char*)&navPosECEF.packetStatus; |
ignorePacket = navPosECEF.packetStatus; |
break; |
case MSGID_VELECEF: |
ubxP = (char*)&navVelECEF; |
ubxEp = (char*)(&navVelECEF + sizeof(NAV_VELECEF_t)); |
ubxSp = (char*)&navVelECEF.packetStatus; |
ignorePacket = navVelECEF.packetStatus; |
break; |
case MSGID_POSUTM: |
ubxP = (char*)&navPosUtm; |
ubxEp = (char*)(&navPosUtm + sizeof(NAV_POSUTM_t)); |
ubxSp = (char*)&navPosUtm.packetStatus; |
ignorePacket = navPosUtm.packetStatus; |
break; |
case MSGID_VELNED: |
ubxP = (char*)&navVelNed; |
ubxEp = (char*)(&navVelNed + sizeof(NAV_VELNED_t)); |
ubxSp = (char*)&navVelNed.packetStatus; |
ignorePacket = navVelNed.packetStatus; |
break; |
default: |
ignorePacket = 1; |
ubxSp = (char*)0; |
} |
break; |
case GPS_LEN1: // first len byte |
msgLen = c; |
CK_A += c; |
CK_B += CK_A; |
gpsState = GPS_LEN2; |
break; |
case GPS_LEN2: // second len byte |
msgLen = msgLen + (c * 256); |
CK_A += c; |
CK_B += CK_A; |
gpsState = GPS_FILLING; // next data will be stored in packet struct |
break; |
case GPS_FILLING: |
CK_A += c; |
CK_B += CK_A; |
if ( !ignorePacket && ubxP < ubxEp) |
*ubxP++ = c; |
if (--msgLen == 0) |
gpsState = GPS_CKA; |
break; |
case GPS_CKA: |
if (c == CK_A) |
gpsState = GPS_CKB; |
else |
gpsState = GPS_EMPTY; |
break; |
case GPS_CKB: |
if (c == CK_B && ubxSp) // No error -> packet received successfully |
*ubxSp = 1; // set packetStatus in struct |
gpsState = GPS_EMPTY; // ready for next packet |
break; |
default: |
gpsState = GPS_EMPTY; // ready for next packet |
} |
} |
else // discard any data if error occured |
{ |
gpsState = GPS_EMPTY; |
GPSscanData (); //Test kann ggf. wieder gelöscht werden! |
} |
GPSscanData (); |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned int tmp_int_arr1[1]; |
unsigned int tmp_int_arr2[2]; |
unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
unsigned char tmp_char_arr3[3]; |
unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case '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); |
gpsState = GPS_EMPTY; |
} |
//--------------------------------------------------------------------------------------------- |
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) |
{ |
SendOutData('4',0,&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
dis_zeile = -1; |
} |
else 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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/uart.h |
---|
0,0 → 1,119 |
#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[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
#define _B1(bit) (1 << (bit)) |
#define _B0(bit) (0 << (bit)) |
typedef struct |
{ |
long x; // in cm (+ = north) |
long y; // in cm (+ = east) |
long z; // in cm |
long vx; |
long vy; |
long vz; |
long northing; |
long easting; |
long altitude; |
long velNorth; |
long velEast; |
uint8_t newData; // status of data: 0 = invlid; 1 = valid |
uint8_t GPSFix; |
uint8_t noSV; // number of sats |
} gpsInfo_t; |
extern gpsInfo_t lockedPos; // stored position to fly to |
extern gpsInfo_t actualPos; // measured position (last gps record) |
extern void GPSscanData (void); |
extern void GPSupdate(void); |
extern void GPSsaveTarget (uint8_t mode); |
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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/version.txt |
---|
0,0 → 1,101 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
- Höhenreglerabsenkung von -20 auf -40 (fc.c) |
- LED1 und LED2 Ansteuerung (fc.c) und (main.h) |
- geänderte Kanalbelegung K1-K8, Unterspannungsschwelle (9,5V) und StickD (fc.c) |
- P,D Anteil seperat in Variable geschrieben und auf das Analog Display Ausgegeben (Kopter Tool) |
- GPS_Nick und GPS_Roll werden nach Deaktivierung von Position-Hold auf Null gesetzt, um ein Einfrieren der GPS Steuerwerte auf den letzten Wert zu verhindern |
- Funktionsaufruf der GPS-Funktion von Chris/Hallo2 |
- UART.C für die GPS Signale im UTM Format auf Pitschu basierend |
- meine GPS.c-Routine |
- Mircos variable Filterung (funktioniert nur wenn 250ms Aufruf aktiv ist) |
- GPS wird deaktiviert und Summer eingeschaltet, wenn kein 3D-Fix (mehr) vorhanden |
- Statusanzeige auf eine LED reduziert (aus, blinkend, an) |
- blinkender LED_1 Ausgang für Positionsleuchten (einstellbar über Userparam.4) |
- Homing-Fkt. eingebaut |
- Diverse Absicherungen gegen Fehlbedienungen (z.B. nicht gelernte Home-Position, ...) |
- Rotationsmatrix mit Kompass, damit die GPS-Fkt. nicht nur nach Norden ausgerichtet funktioniert |
- dyn. Position Hold -> normaler Rundflug möglich |
- Limit_D_Anteil = Userparam3 um im Homing- bzw. Waypointmodus die Sollposition gleichmäßiger anzufliegen |
- Die Berechnung von Kompassvalue wird jetzt auch über den GPS Haken im Koptertool aktiviert |
- 12 Kanal Erweiterung |
- D-Anteil_Limit wegen HOMING |
- ... |
(- Regelung wird nur noch alle 250 ms aufgerufen) |