/branches/MicroMag3_Nick666/V0.68d/Flight-Ctrl_MEGA644_V0_68d.hex |
---|
0,0 → 1,2006 |
:100000000C94A8030C94C5030C94C5030C94C5036D |
:100010000C94C5030C94C5030C94C5030C94C50340 |
:100020000C94C5030C94C50C0C94C5030C94C50327 |
:100030000C9493160C94C5030C94C5030C94C5033F |
:100040000C94C5030C94C5030C94680D0C94B33741 |
:100050000C947F060C94C5030C9449060C94C503BC |
:100060000C94100E0C94C5030C94D2150C94C5037B |
:10007000E708F3080509BB09BB09BB0951091C09BD |
:10008000BB09BB0940097D097D097D097D097D0901 |
:100090005509BB09BB093709BB094D093A0E4F0E7B |
:1000A000580E620E7F0E970EB00ECD0EEA0E070FA1 |
:1000B000EB0F44118C11ED11431297121B13C21355 |
:1000C000101434146A14A614E41436156F150A0AB1 |
:1000D0000D004E65757472616C0048656164696EEF |
:1000E00067486F6C64000A0D537465756572756EB0 |
:1000F000673A20004F4B0A0D000A0D4162676C659C |
:10010000696368204C756674647275636B73656EA1 |
:10011000736F722E2E000A0D4B616C6962726965F5 |
:100120007265204E65757472616C6C616765000A5A |
:100130000D4B616C69627269657265204B6F6D7001 |
:10014000617373000A0D42656E75747A65205061A3 |
:1001500072616D657465727361747A202564000A3A |
:100160000D496E69742E20454550524F4D3A204737 |
:10017000656E6572696572652044656661756C744B |
:100180002D506172616D657465722E2E2E000A0D00 |
:100190003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8F |
:1001A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D000AEF |
:1001B0000D466C69676874436F6E74726F6C0A0DDC |
:1001C00048617264776172653A25642E25640A0D70 |
:1001D000536F6674776172653A5625642E256425DF |
:1001E0006320002E005A5F52616E67653A20202519 |
:1001F000346900595F52616E67653A202025346981 |
:1002000000585F52616E67653A2020253469004DC1 |
:100210004D332052616E6765005A5F4F66667365A5 |
:10022000743A202025336900595F4F666673657400 |
:100230003A202025336900585F4F66667365743A2B |
:100240002020253369004D4D33204F6666004869F4 |
:100250003A253469202043663A25346920004773E3 |
:100260003A253469202047693A25346920004E69CF |
:100270003A2534692020526F3A25346920004578A8 |
:100280007465726E436F6E74726F6C2020005261E1 |
:100290006E67653A2533692D253369005374656CA3 |
:1002A0006C756E673A2025336900536574706F6909 |
:1002B0006E74202025336900536572766F2020000C |
:1002C000506F7469343A202025336900506F746987 |
:1002D000333A202025336900506F7469323A202068 |
:1002E00025336900506F7469313A20202533690045 |
:1002F00053746172743A2020202020253569004D06 |
:10030000657373776572743A2020253569005269E8 |
:10031000636874756E673A2020253569004B6F6DF0 |
:10032000706173732020202020202000456D7066AE |
:100330002E506567656C3A253569005370616E6EA5 |
:10034000756E673A202025356900486F636820255F |
:10035000346920282533692900526F6C6C202534BC |
:1003600069202825336929004E69636B202534698B |
:1003700020282533692900414343202D2053656EF1 |
:10038000736F720047696572202534692028253310 |
:10039000692900526F6C6C20253469202825336947 |
:1003A00029004E69636B202534692028253369298B |
:1003B00000476965722025346920282533692900A2 |
:1003C000526F6C6C20253469202825336929004E32 |
:1003D00069636B2025346920282533692900477912 |
:1003E000726F202D2053656E736F720050333A2563 |
:1003F0003469202050343A253469200050313A25A0 |
:100400003469202050323A253469200047733A2558 |
:100410003469202047693A25346920004E693A251D |
:1004200034692020526F3A25346920004B373A2531 |
:10043000346920204B383A25346920004B353A2561 |
:10044000346920204B363A25346920004B333A2555 |
:10045000346920204B343A25346920004B313A2549 |
:10046000346920204B323A25346920004B6F6D707F |
:100470006173733A20202025356900526F6C6C3A05 |
:10048000202020202020253569004E69636B3A200A |
:10049000202020202025356900616B742E204C61BE |
:1004A00067650048F668656E726567656C756E67AE |
:1004B000004B65696E6520004F6666202020202075 |
:1004C000203A20253569004C756674647275636B3B |
:1004D0003A2025356900536F6C6C486F6568653A42 |
:1004E0002025356900486F6568653A202020202066 |
:1004F0002535690028632920486F6C6765722042A2 |
:100500007573730053657474696E673A20256420AF |
:100510000048573A5625642E25642053573A2564DF |
:100520002E25642563002B204D696B726F4B6F7015 |
:10053000746572202B005B25695D005B25695D0099 |
:1005400000010203040405060708090A0B0B0C0D41 |
:100550000E0F101111121314151516171818191A59 |
:100560001B1B1C1D1D1E1F1F202121222323242491 |
:100570002525262727282829292A2A2B2B2C2C2DEC |
:100580002D2D2E2E2F2F3030303131323232333369 |
:1005900033343434353535363636373737373838FF |
:1005A00038393939393A3A3A3A3B3B3B3B3C3C3CA7 |
:1005B0003C3C3D3D3D3D3E3E3E3E3E3F3F3F3F3F5E |
:1005C0003F40404040404041414141414142424220 |
:1005D00042424242434343434343434444444444EA |
:1005E00044444445454545454545454546464646BA |
:1005F0004646464646474747474747474747474790 |
:100600004848484848484848484848494949494965 |
:100610004949494949494949494A4A4A4A4A4A4A43 |
:100620004A4A4A4A4A4A4A4B4B4B4B4B4B4B4B4B21 |
:100630004B4B4B4B4B4B4B4B4C4C4C4C4C4C4C4C02 |
:100640004C4C4C4C4C4C4C4C4C4C4C4D4D4D4D4DE5 |
:100650004D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4DCA |
:100660004D4E4E4E4E4E4E4E4E4E4E4E4E4E4E4EAB |
:100670004E4E4E4E4E4E4E4E4E4E4E4F4F4F4F4F95 |
:100680004F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F7A |
:100690004F4F4F4F4F4F4F4F4F4F0000120024000E |
:1006A0003600470059006B007D008F00A000B200AB |
:1006B000C300D500E600F80009011A012B013C0136 |
:1006C0004D015E016F0180019001A001B101C101E6 |
:1006D000D101E101F00100020F021F022E023D02D2 |
:1006E0004B025A026802760284029202A002AD0214 |
:1006F000BA02C702D402E102ED02F90205031003B7 |
:100700001C03270332033C03470351035B036403C9 |
:100710006E0377038003880390039803A003A70365 |
:10072000AF03B503BC03C203C803CE03D303D8038E |
:10073000DD03E203E603EA03ED03F003F303F6034C |
:10074000F803FA03FC03FE03FF03FF0300040004A5 |
:1007500011241FBECFEFD0E1DEBFCDBF13E0A0E07C |
:10076000B1E0E8E9FAE702C005900D92A23AB107BC |
:10077000D9F717E0A2EAB3E001C01D92A73CB10788 |
:10078000E1F70E9405040C944B3D0C94000022E01C |
:1007900030E0D9010E942D3D802D863028F082E086 |
:1007A000D901082E0E943A3D99270895FB01863011 |
:1007B00008F085E0282F2150842F9927A6E42A9F4E |
:1007C000D0011124A65FBF4F019724F001900E9431 |
:1007D0003A3DFACFA2E0B0E0022E0E943A3D0895E1 |
:1007E000FB01282F863008F025E0842F992721501F |
:1007F000A6E42A9FD0011124A65FBF4F019724F0E1 |
:100800000E942D3D0192FACF08951F93CF93DF935D |
:1008100014B815B8189B02C08BE001C08AE0809321 |
:10082000000181E887B98FEF88B98BE184B981E055 |
:1008300085B98EE38AB9579A87EF8BB984B7877FDA |
:1008400084BF809160008861809360001092600096 |
:1008500080ED97E09093C1038093C00310924B0406 |
:1008600010924A0410920807109207071092490448 |
:10087000109248041092470410924604809100019F |
:100880008A3011F4289801C0289A0E94930C0E9483 |
:1008900008080E947E160E940A0E0E94B6150E9449 |
:1008A000F93978941092FA0584E48093FB0587E087 |
:1008B0008093FC052091000184E690E09F938F9344 |
:1008C00084E490E09F938F931F921F92822F6AE09F |
:1008D0000E94803C892F99279F938F93822F0E949B |
:1008E000803C99279F938F938FEA91E09F938F93FA |
:1008F0001F920E941A0A8EE891E09F938F931F9295 |
:100900000E941A0A299AA1E0B0E00E942D3D802D94 |
:100910002DB73EB7205F3F4F2DBF853409F43FC050 |
:100920008FE591E09F938F931F920E941A0A0E9475 |
:10093000F83610E00F900F900F90123049F40E949B |
:10094000673646E46FE277E082E00E94D60302C099 |
:10095000133051F40E94D63546E46FE277E083E02D |
:100960000E94D60314E002C0143010F00E946736D3 |
:1009700046E46FE277E0812F0E94D6031F5F1630B6 |
:10098000E0F283E022E030E0D901082E0E943A3DF7 |
:1009900085E421503040D901082E0E943A3DC2E042 |
:1009A000D0E0DE010E942D3D802D863028F082E0CF |
:1009B000DE01082E0E943A3D46E46FE277E00E9495 |
:1009C000F003DE010E942D3D802D863028F082E06C |
:1009D000DE01082E0E943A3D99279F938F9384E46D |
:1009E00091E09F938F931F920E941A0A84EF91E0E7 |
:1009F0000E94B00CEC010F900F900F900F900F9091 |
:100A0000CE010E94B90C8823D9F3E0913107FF276A |
:100A1000EE0FFF1FED5FF84F8081918185369105C4 |
:100A2000C4F0E0913207FF27EE0FFF1FED5FF84F94 |
:100A3000808191818536910564F08FE291E09F93EA |
:100A40008F931F920E941A0A0E942D390F900F90C7 |
:100A50000F90E0913107FF27EE0FFF1FED5FF84F7A |
:100A60008081918185369105C4F0E0913207FF279E |
:100A7000EE0FFF1FED5FF84F808191818C599F4FE2 |
:100A800064F486E191E09F938F931F920E941A0A6B |
:100A90000E943F220F900F900F908091370780FFA8 |
:100AA00020C089EF90E09F938F931F920E941A0AB3 |
:100AB00088EE93E00E94B00CEC010E948C100F9025 |
:100AC0000F900F90CE010E94B90C8823D9F384EFC8 |
:100AD00090E09F938F931F920E941A0A0F900F909D |
:100AE0000F900E945421809100018A3011F42898BF |
:100AF00001C0289A80ED97E09093C1038093C003D2 |
:100B000085E58093040686EE90E09F938F931F9275 |
:100B10000E941A0A809137070F900F900F9082FF62 |
:100B200003C08AED90E002C082ED90E09F938F9326 |
:100B30001F920E941A0A0F900F900F908EEC90E077 |
:100B40009F938F931F920E941A0A0E94D01088E8E8 |
:100B500093E190938603809385030F900F900F90FD |
:100B60008091BF038823E1F31092BF030E94B22259 |
:100B70000E940D21209100012A3011F4289801C013 |
:100B8000289A80910301882321F0815080930301EA |
:100B900012C01092B1031092B20310920E0610927E |
:100BA00068041092670410926A041092690410920B |
:100BB0006C0410926B0480914504882329F0809185 |
:100BC000450481508093450480918503909186036C |
:100BD000892B01F585E090E090938603809385034F |
:100BE0000E94561680910403909105038F5F9F4FDA |
:100BF000F9F480914E048823D9F080E197E2909334 |
:100C0000C1038093C00380E890E090930503809334 |
:100C100004030EC080918503909186030197909301 |
:100C20008603809385032A3011F4289801C0289AFE |
:100C30008091BF03882311F40E9423080E94C908F1 |
:100C4000CE010E94B90C882309F48ACF20910803B1 |
:100C500030910903809147079927281739079CF499 |
:100C600080910403909105038F5F9F4F61F480E7AB |
:100C700097E19093C1038093C00380E093E0909349 |
:100C800005038093040384E690E00E94B00CEC011D |
:100C900067CF1F920F920FB60F9211248F939F93DD |
:100CA000EF93FF93809101018823E1F48091BB03CE |
:100CB0009091BC0301969093BC038093BB03FC010D |
:100CC000E453FB4FE081ED3019F08639910539F49A |
:100CD0001092BC031092BB0381E080930101E0936A |
:100CE000C60004C01092BC031092BB03FF91EF91A9 |
:100CF0009F918F910F900FBE0F901F9018951F928C |
:100D00000F920FB60F9211242F933F934F935F933F |
:100D10006F937F938F939F93EF93FF939091C60070 |
:100D20006091B603663918F01092B50369C0662366 |
:100D300091F4933239F48091A603882319F481E069 |
:100D40008093B60390930F06892F99279093BA0347 |
:100D50008093B90357C0E62FFF272091B903309144 |
:100D6000BA039D3069F0E15FF94F90836F5F609344 |
:100D7000B603290F311D3093BA032093B90342C043 |
:100D8000E15FF94F32978081329672913196281B3C |
:100D90003109271B31093F703093BA032093B903FF |
:100DA000A90136E0569547953A95E1F7435C4093A3 |
:100DB000B8032F73235C2093B7034817E1F4271778 |
:100DC000D1F48091A6038823D9F481E08093A6030F |
:100DD0006093A903908380911106823589F488E19C |
:100DE00090E02CE00FB6F894A895809360000FBEB9 |
:100DF0002093600005C08091A8038F5F8093A803B3 |
:100E00001092B603FF91EF919F918F917F916F9117 |
:100E10005F914F913F912F910F900FBE0F901F90B8 |
:100E20001895AC0120E030E060E070E0ECECF4E01C |
:100E300005C08191280F311D6F5F7F4F64177507C3 |
:100E4000C1F73F70FA01E453FB4FC90166E0969584 |
:100E500087956A95E1F7835C8083FA01E353FB4F42 |
:100E60002F73235C20838DE0818310920101809198 |
:100E7000CC048093C60008950F931F93CF93DF9304 |
:100E80008A01722F93E29093CC046093CD048093F7 |
:100E9000CE0460E0AFECB4E044C0F801E60FF11D11 |
:100EA00090816F5F715019F4E0E040E00FC0F801ED |
:100EB000E60FF11D40816F5F715011F4E0E006C054 |
:100EC000F801E60FF11DE0816F5F7150892F869563 |
:100ED0008695835C8C935527892F99278370907012 |
:100EE00024E0880F991F2A95E1F79A0194E036953E |
:100EF00027959A95E1F7822B835CED0189834F70EA |
:100F00005070440F551F440F551F8E2F82958695A4 |
:100F100086958370842B835C8A83EF73E35CEB8319 |
:100F20001496772309F0B9CFCD018C5C94400E94D0 |
:100F30001107DF91CF911F910F9108951F93CF93C8 |
:100F4000DF93EC0170E0A22FBB27129748C0E42F7B |
:100F5000FF27E15FF94F30814F5FE42FFF27E15F0B |
:100F6000F94F50814F5FE42FFF27E15FF94F108168 |
:100F70004F5FE42FFF27E15FF94F20814F5F842F00 |
:100F80009927A817B90774F15D53FE01E70FF11D0A |
:100F90003D53330F330F852F82958F70382B30835D |
:100FA000613001F1912F9D537F5FFE01E70FF11D2D |
:100FB00071505295507F892F86958695582B508376 |
:100FC00063506F3F79F07E5FFE01E70FF11D929550 |
:100FD000990F990F907C2D53922B90837F5F6623FE |
:100FE00009F0B5CFDF91CF911F9108951F93182F6E |
:100FF0008A3019F48DE00E94F6078091C00085FFC9 |
:10100000FCCF1093C60080E090E01F9108950895F2 |
:10101000E1ECF0E088E18083A0ECB0E08C918260AC |
:101020008C938081806880838081806480838AE261 |
:101030008093C40088EC90E00E94B00C9093F90576 |
:101040008093F805089580910101882309F4A0C0D8 |
:101050008091A203882371F080910101882351F0CF |
:101060002BE044E056E06091CB0487E40E943C070B |
:101070001092A2038091F8059091F9050E94B90C95 |
:10108000882321F48091A4038823B1F08091010189 |
:10109000882391F022E445EA56E06091CB0484E491 |
:1010A0000E943C071092A40384EF91E00E94B00CD0 |
:1010B0009093F9058093F805609102016F3F89F0E4 |
:1010C000462F552734E0440F551F3A95E1F74C5F02 |
:1010D0005E4F605D20E181E40E943C078FEF8093CA |
:1010E00002012091E706222391F0809101018823DB |
:1010F00071F093E29093CC042093CD048DE0809323 |
:10110000CE04109201011092E7069093C6008091E0 |
:10111000A303882359F180910101882339F10E94AA |
:10112000D9101092A3033091AB03932F9F5F90933C |
:10113000AB03943021F08091AC03882359F026E171 |
:1011400043E057E060E084E30E943C078FEF809328 |
:10115000AB030CC044E1949FA0011124465E5C4F98 |
:1011600024E160E0832F8F5C0E943C078091A503FF |
:10117000882371F080910101882351F02AE04AEF21 |
:1011800055E06091CB0486E50E943C071092A503D0 |
:101190000895A2E0B0E0EFECF8E00C94FF3C809101 |
:1011A000A603882309F4E9C08FEF8093030180919F |
:1011B00011069927AA27BB27FC01E156F040E6312A |
:1011C000F10508F0D8C0E85CFF4F0C94273D209152 |
:1011D000A90343E062E0CE0101960E949E07898147 |
:1011E00080930201C8C02091A90343E06BE084E032 |
:1011F00096E00E949E078091E60390910606892B57 |
:101200008093E60380910D0645C02091A90343E039 |
:101210006BE084E096E00E949E078091E603909147 |
:101220000606892B8093E60380910D068093E706DE |
:1012300081E08093A4039FC02091A90343E062E072 |
:10124000CE0101960E949E078091E6039981892B29 |
:101250008093E6038A818F3F21F481E08093AC0381 |
:1012600002C01092AC0381E08093A30384C020915C |
:10127000A90343E064E08DEA93E00E949E077BC0EF |
:101280002091A90343E064E081EB93E00E949E0774 |
:101290008091B4038093E7066EC081E08093A5033C |
:1012A0006AC081E08093A20366C02091A90343E055 |
:1012B00062E0CE0101960E949E0789818F3F89F0EE |
:1012C000863010F085E0898346E46FE277E089811B |
:1012D0000E94F003898126E44FE257E06091CB043D |
:1012E00008C01091CB040E94C70326E44FE257E0E8 |
:1012F000612F855B0E943C073EC02091A90343E01B |
:1013000066E48FE297E00E949E078091110646E412 |
:101310006FE277E08B560E94D603809111068B56C0 |
:10132000A2E0B0E0082E0E943A3D60915A0777276C |
:101330008827992724EC39E040E050E00E94613C86 |
:1013400060938703709388038093890390938A0343 |
:1013500060915B077727882799270E94613C6093FB |
:101360008B0370938C0380938D0390938E030E9464 |
:10137000C7030E949D221092A603E3E0CE5F0C9467 |
:101380001B3D982F8091E806813069F48091E50338 |
:10139000E82FFF27E65EFC4F90838F5F8093E50385 |
:1013A00021E030E005C0892F0E94F607282F33275F |
:1013B000C90108951F93182F04C080E30E94C1093A |
:1013C00011501116D4F31F9108951F93182F04C0C4 |
:1013D00080E20E94C10911501116D4F31F910895A3 |
:1013E0000F931F93CF93DF938C01EB0108C0F8019B |
:1013F0000F5F1F4FE4918E2F0E94C1092197209704 |
:10140000B1F7DF91CF911F910F9108950F931F9323 |
:10141000CF93DF938C01EB0106C0F80181918F011E |
:101420000E94C10921972097C1F7DF91CF911F91A9 |
:101430000F910895A3E3B0E0E0E2FAE00C94F03CF1 |
:1014400029968FAD29978093E806CE01855B9F4F43 |
:101450009D838C832B968EAD9FAD2B979FA78EA7D8 |
:1014600022243324210102C0130124010EA51FA54B |
:1014700002C00F5F1F4FF801F490FF2019F0F5E252 |
:10148000FF16B9F7B8018EA59FA5681B790B11F05F |
:101490000E94F009FF2009F442C20F5F1F4F1FA7EF |
:1014A0000EA71982AC81BD811BAA1AAA9FEF99AB26 |
:1014B000EEA5FFA5CF0101969FA78EA7B49095E753 |
:1014C000B91621F08B2D8062883789F4EBA9E0FFF3 |
:1014D00007C02D903D904D905C901397149607C0D7 |
:1014E0008D919C9111971C01442455241296F0E291 |
:1014F000BF1621F489818823D9F685C083E2B81606 |
:1015000009F483C09AE2B91621F0EDE2BE1669F43F |
:1015100008C0FD011296E081EAABE7FFC9CFE19573 |
:10152000EAABFBA9F061FF7D72C08BE2B81609F44B |
:101530006AC09EE2B916B1F52EA53FA52F5F3F4FB9 |
:10154000EEA5FFA584918A3221F0B82E20E030E08C |
:101550001BC0FD0112964081518157FF02C04FEF21 |
:101560005FEF49AB3FA72EA7A3CFC90103E0880FC8 |
:10157000991F0A95E1F7220F331F280F391F2B0DF2 |
:10158000311D20533040B49031968B2D80538A30DA |
:1015900060F3FFA7EEA7A90137FF02C04FEF5FEF8F |
:1015A00049AB8DCFF0E3BF1631F48BA984FD80CF1A |
:1015B00080628BAB7DCF8B2D81538930E8F420E0A6 |
:1015C00030E0C901F3E0880F991FFA95E1F7220F87 |
:1015D000331F280F391F2B0D311D20533040EEA52E |
:1015E000FFA5CF0101969FA78EA7B4908B2D8053A6 |
:1015F0008A3038F32AAB63CF98E6B91651F4EBA9D9 |
:10160000E460EBAB55CFB98253CFFBA9F860FBABDD |
:101610004FCF8CE6B81621F49BA991609BAB48CFC5 |
:10162000BD83AC83E3E6BE1639F41296BD83AC836A |
:1016300012978C918E8318C1F4E4BF1639F084E6BA |
:10164000B81639F099E6B91659F503C0EBA9E1606F |
:10165000EBABFBA9F0FF08C01496BD83AC835E9092 |
:101660004E903E902E900AC01296BD83AC839E9100 |
:101670008E911C01442437FC4094542C57FC03C029 |
:101680008AE088AB92C05094409430942094211CFE |
:10169000311C411C511C8DE289839AE098AB85C0B6 |
:1016A000EFE4BE1629F0FFE6BF1639F488E061C00A |
:1016B0009BA991609BABE8E056C0F0E7BF1671F4C0 |
:1016C0001296BD83AC839E918E911C0144245524B7 |
:1016D0008BA980648BAB78E7B72E5EC0E3E7BE16BC |
:1016E000D9F51296BD83AC83DE90CE90C114D1049F |
:1016F00089F488E28E838EE68F8385E788878CE67F |
:1017000089878A8789E28B871C8666E0C62ED12C62 |
:10171000CC0EDD1EF9A9F7FD13C04F2F552747FD4D |
:10172000509560E070E0C6010E94EC3A009711F419 |
:1017300019A90DC08C1919A981174CF4182F07C0CD |
:10174000F60101900020E9F731971E2F1C1919822C |
:101750004201310140E094C085E5B81631F095E7CB |
:10176000B91649F4EAE0E8AB1FC0FBA9F160FBAB96 |
:101770008AE088AB19C098E5B91621F0E8E7BE16F3 |
:1017800009F06EC0FBA9F3FD02C080E1F2CF211485 |
:1017900031044104510419F490E198AB05C0EBA960 |
:1017A000E064EBABF0E1F8AB198289A987FD03C0D7 |
:1017B0009BA99F7D9BAB211431044104510461F42A |
:1017C000E9A9EE2349F46624772443015EE2C52E9D |
:1017D000D12CCC0EDD1E3EC04EE2C42ED12CCC0E40 |
:1017E000DD1EF8A9EF2EFF2400271127C201B10149 |
:1017F000A80197010E94B33C6A3020F430E3A32E85 |
:10180000A60E08C027E5A22EA60E88E5B81611F48C |
:101810009FEDA922F601A2926F01C201B101A801B8 |
:1018200097010E94B33C39014A012E143F0440063F |
:10183000510618F019012A01D9CFF8A9F83051F44E |
:101840008BA983FF07C090E3A91621F080E3F6017E |
:1018500082936F01CE018C19182F125D49A910C017 |
:10186000BB2009F45CC0BE8219824201310100E054 |
:1018700096E0C92ED12CCC0EDD1E11E021E005C072 |
:10188000212F042F011B07FD00E08981882319F017 |
:10189000812F8F5F07C09BA996FD02C0812F02C0D8 |
:1018A000822F8E5FA82EA00EEBA9EE2EFF2480E3E0 |
:1018B000482E512C4E205F204114510421F48AA956 |
:1018C0008A190E94E5098981882329F061E070E086 |
:1018D000CE01019609C0E6FE09C080E38A83BB827F |
:1018E00062E070E0CE0102960E94060AF0E24F1616 |
:1018F000510421F48AA98A190E94DA09802F0E94D2 |
:10190000DA09612F772767FD7095C6010E94060AE4 |
:10191000E4FEAACD8AA98A190E94E509A5CDE2E1D3 |
:10192000CD5C0C940C3D82E085BD83EA84BD17BC80 |
:1019300088E788BD83EC8093B00086E08093B10097 |
:10194000E0E7F0E0808182608083EEE6F0E0808175 |
:10195000816080838AE08093B3001092B200089582 |
:101960002091BD033091BE032F5F3F4F820F931F25 |
:1019700008952091BD033091BE03821B930B892FE4 |
:10198000992786958074992708951F920F920FB614 |
:101990000F921124EF92FF920F931F932F933F9377 |
:1019A0004F935F936F937F938F939F93AF93BF9367 |
:1019B000CF93DF93EF93FF93809106038150809341 |
:1019C00006038F3F09F069C083E88093B0008091DF |
:1019D0009C03C82FDD27D093C303C093C20380911B |
:1019E0006407E09051072091F9033091FA03409188 |
:1019F000FB035091FC0380FF18C0FF240027112730 |
:101A0000CA01B90120E830E040E050E00E94D53C36 |
:101A1000C801B7010E94613C20E032E040E050E0A4 |
:101A20000E94D53CC20FD31F17C0FF2400271127E7 |
:101A3000CA01B90120E830E040E050E00E94D53C06 |
:101A4000C801B7010E94613C20E032E040E050E074 |
:101A50000E94D53CC21BD30BD093C303C093C203D7 |
:101A60002091C2033091C303809152079927281710 |
:101A7000390734F08091530799278217930724F48C |
:101A80009093C3038093C2038091C2038093B300F9 |
:101A9000809154078093060304C083E08093B000D4 |
:101AA0005F98FF91EF91DF91CF91BF91AF919F919F |
:101AB0008F917F916F915F914F913F912F911F91E6 |
:101AC0000F91FF90EF900F900FBE0F901F90189501 |
:101AD0001F920F920FB60F9211242F933F934F93A3 |
:101AE0005F936F937F938F939F93AF93BF93EF9386 |
:101AF000FF938091C40381508093C4038F3FB9F456 |
:101B00008AE08093C403809107038F5F8170809384 |
:101B10000703882319F481E08093BF038091BD03FC |
:101B20009091BE0301969093BE038093BD03809174 |
:101B3000C0039091C1030297B0F08091C0039091CF |
:101B4000C10301979093C1038093C0038091C003A8 |
:101B50009091C103209104033091050382239323C4 |
:101B6000892BD1F406C08FEF9FEF909305038093EC |
:101B70000403809100018A3039F404C05A9A05C0E8 |
:101B8000479A03C05A9801C047988091370783FF4E |
:101B900008C00E94FB3805C0809100018A3081F79F |
:101BA000EDCFFF91EF91BF91AF919F918F917F9179 |
:101BB0006F915F914F913F912F910F900FBE0F90BA |
:101BC0001F9018952091BD033091BE032F5F3F4FAA |
:101BD000280F391F4FEE02C040937A008091BD0359 |
:101BE0009091BE03B901681B790B77FFF5CF08957B |
:101BF0002091BD033091BE032F5F3F4F280F391F47 |
:101C00008091BD039091BE03A901481B590B57FF5A |
:101C1000F7CF089510927C008FEE80937A0008959C |
:101C20001F920F920FB60F921124DF92EF92FF9244 |
:101C30000F931F932F933F934F935F936F937F93D4 |
:101C40008F939F93AF93BF93CF93DF93EF93FF93C4 |
:101C500010927A008091E103D82ED394D092E103C0 |
:101C6000E82FFF27EB30F10508F038C2E25BFF4FA9 |
:101C70000C94273D80917800909179009093E00337 |
:101C80008093DF0381E08093E2038091D9039091F8 |
:101C9000DA0301969093DA038093D90315C28091F9 |
:101CA0007800909179009093DE038093DD0390C0DB |
:101CB00080917800909179009093DC038093DB030E |
:101CC00084E086C140910803509109038091780017 |
:101CD000909179009A01220F331F240F351F63E082 |
:101CE00070E00E948C3C260F371F3695279536955D |
:101CF0002795309309032093080386E069C18091FA |
:101D00009A0790919B072091780030917900821B6F |
:101D1000930B9093EA068093E9068091E9069091EF |
:101D2000EA069093CC038093CB0387E051C1809166 |
:101D30007800909179002091980730919907821B43 |
:101D4000930B9093F5068093F4068091F40690919E |
:101D5000F5069093CE038093CD031092E203B4C1B5 |
:101D6000809100012091DF033091E0038A3049F433 |
:101D70008091780090917900820F931F96958795B6 |
:101D800006C08091780090917900820F931F909304 |
:101D9000CA038093C90381E01BC180910001209197 |
:101DA000DD033091DE038A3049F480917800909110 |
:101DB0007900820F931F9695879506C080917800D1 |
:101DC00090917900820F931F9093C8038093C7036B |
:101DD00082E0FEC0809100012091DB033091DC03A2 |
:101DE0008A3049F48091780090917900820F931F96 |
:101DF0009695879506C08091780090917900820F22 |
:101E0000931F9093C6038093C50385E0E1C0609162 |
:101E1000780070917900E0909C07F0909D07009108 |
:101E20009E0710919F07882777FD8095982F0E9425 |
:101E30009F3BA80197010E94F93A0E94823B709350 |
:101E4000D0036093CF032091CF033091D003E09172 |
:101E5000E906F091EA068091F4069091F50697FF65 |
:101E600003C0909581959F4F64E070E00E94A03C74 |
:101E7000EB01CF01F7FF03C0909581959F4F64E080 |
:101E800070E00E94A03C260F371F2C0F3D1F30939F |
:101E9000D0032093CF038091CF039091D00302977A |
:101EA00004F160919C0770919D0780919E0790912D |
:101EB0009F0720E030E048E454E40E94A93B8823D7 |
:101EC0000CF03CC060919C0770919D0780919E072B |
:101ED00090919F072AE037ED43EA5CE30E94FA3ACB |
:101EE00025C08091CF039091D0038F5F9F4F34F531 |
:101EF00060919C0770919D0780919E0790919F072C |
:101F000020E030E046E154E40E94AC3B1816B4F403 |
:101F100060919C0770919D0780919E0790919F070B |
:101F20002AE037ED43EA5CE30E94F93A60939C07AC |
:101F300070939D0780939E0790939F0781E0809305 |
:101F4000D60380917800909179009093EC0680936D |
:101F5000EB062091310430913204409133045091CA |
:101F600034048091CF039091D003AA2797FDA095C8 |
:101F7000BA2F280F391F4A1F5B1F2093310430935B |
:101F800032044093330450933404E0903104F090D1 |
:101F90003204009133041091340460913104709143 |
:101FA0003204809133049091340420E034E040E026 |
:101FB00050E00E94D53CE21AF30A040B150BE092A4 |
:101FC0003104F0923204009333041093340483E01C |
:101FD0008093E20379C08091F9069091FA062091EE |
:101FE000780030917900820F931F9093FA068093C6 |
:101FF000F9068091F1068F5F8093F1068091F106DA |
:10200000853008F46BC080917800909179009093AE |
:102010000F0380930E031092F1068091ED069091CC |
:10202000EE062091F9063091FA06821B930B20915F |
:102030004F0430915004821B930B9093D8038093EC |
:10204000D7036091F9067091FA06E0900A03F090C8 |
:102050000B0300910C0310910D03882777FD8095E9 |
:10206000982FA8019701220F331F441F551F2E0DD3 |
:102070003F1D401F511F620F731F841F951F24E0D7 |
:1020800030E040E050E00E94D53C20930A033093BA |
:102090000B0340930C0350930D032091ED063091F8 |
:1020A000EE0680910A0390910B03A0910C03B0916E |
:1020B0000D03281B390B3093500420934F041092CA |
:1020C000FA061092F9060AC08091E20380937C0020 |
:1020D000DD2051F08FEE80937A0006C01092E2036B |
:1020E0001092E10310927C00FF91EF91DF91CF916C |
:1020F000BF91AF919F918F917F916F915F914F9120 |
:102100003F912F911F910F91FF90EF90DF900F90D3 |
:102110000FBE0F901F901895CF93DF93A3E0B0E010 |
:102120000E942D3D802DC82FDD27C531D10508F037 |
:102130002A97C7BD84E690E00E94E20D80910E03CD |
:1021400090910F0382559340D0F4C0E0D0E017C0C7 |
:10215000C7BD82E390E00E94E20D83EE91E09F9381 |
:102160008F931F920E941A0A80910E0390910F0381 |
:102170000F900F900F908458934020F02196CA3F03 |
:10218000D10530F3A3E0B0E00C2E0E943A3DC0939D |
:10219000F6068CE291E00E94E20DDF91CF91089566 |
:1021A000EAE1F3E080E2819393E0EA36F907D9F7B8 |
:1021B00008951F938091E603282F3327C90181706A |
:1021C0009070682F8823A9F08091E703882311F08D |
:1021D000815002C080916A038093E703EAE1F3E053 |
:1021E00080E2819393E0EA36F907D9F78FEF809385 |
:1021F000AB03A9014270507021FF10C08091E7032A |
:102200008F5F8093E703EAE1F3E080E2819393E05C |
:10221000EA36F907D9F78FEF8093AB03662331F0E5 |
:10222000452B21F01092E70390E004C09091E70362 |
:102230009A3050F481E18093E503892F99279F9389 |
:102240008F938BE395E009C080E18093E503892FAC |
:1022500099279F938F9386E395E09F938F9381E0D7 |
:102260008F930E941A0A0F900F900F900F900F906B |
:102270008091E703E82FFF27EE30F10508F06DC4E9 |
:10228000E75AFF4F0C94273D1092E50386E295E054 |
:102290009F938F9311E01F930E941A0A84E1809309 |
:1022A000E5032091000184E690E09F938F9384E4FE |
:1022B00090E09F938F931F921F92822F6AE00E945B |
:1022C000803C892F99279F938F93822F0E94803C77 |
:1022D00099279F938F9381E195E09F938F931F930D |
:1022E0000E941A0A88E28093E5030E94C703992797 |
:1022F0009F938F9384E095E09F938F931F930E9409 |
:102300001A0A8CE38093E50384EF94E09F938F9304 |
:102310001F930E941A0AA6C38091370780FF44C00A |
:102320001092E50380914F04909150049F938F93F6 |
:1023300085EE94E09F938F9311E01F930E941A0AF9 |
:1023400084E18093E50380915104909152049F931E |
:102350008F9386ED94E09F938F931F930E941A0AA8 |
:1023600088E28093E50380910E0390910F039F9381 |
:102370008F9387EC94E09F938F931F930E941A0A88 |
:102380008CE38093E5038091F60699279F938F93C2 |
:1023900088EB94E09F938F931F930E941A0A8DB746 |
:1023A0009EB744968DBFDEC384E18093E50381EB45 |
:1023B00094E09F938F9311E01F930E941A0A88E282 |
:1023C0008093E50383EA94E09F938F931F930E9489 |
:1023D0001A0A8DB79EB70696E5CF1092E50389E9F4 |
:1023E00094E09F938F9311E01F930E941A0A84E157 |
:1023F0008093E5036091F9037091FA038091FB03E8 |
:102400009091FC0320E034E040E050E00E94D53C95 |
:102410005F934F933F932F938AE894E09F938F931A |
:102420001F930E941A0A88E28093E50360910104D9 |
:1024300070910204809103049091040420E034E040 |
:1024400040E050E00E94D53C5F934F933F932F9321 |
:102450008BE794E09F938F931F930E941A0A8CE35B |
:102460008093E50380913504909136049F938F9378 |
:102470008CE694E09F938F931F930E941A0A8DB766 |
:102480009EB746968FCF1092E503809107079091F3 |
:10249000080720910507309106079F938F933F937C |
:1024A0002F938CE594E09F938F9311E01F930E94EC |
:1024B0001A0A84E18093E50380910B0790910C0741 |
:1024C0002091090730910A079F938F933F932F9391 |
:1024D0008CE494E09F938F931F930E941A0A88E2E2 |
:1024E0008093E50380910F079091100720910D07CD |
:1024F00030910E079F938F933F932F938CE394E03B |
:102500009F938F931F930E941A0A8CE38093E50395 |
:1025100080911307909114072091110730911207B1 |
:102520009F938F933F932F938CE294E07BC0109204 |
:10253000E503E0913007FF27EE0FFF1FED5FF84F37 |
:1025400020813181E0912F07FF27EE0FFF1FED5F04 |
:10255000F84F808191813F932F939F938F938CE1CC |
:1025600094E09F938F9311E01F930E941A0A84E1D5 |
:102570008093E503E0913207FF27EE0FFF1FED5F29 |
:10258000F84F20813181E0913107FF27EE0FFF1FC7 |
:10259000ED5FF84F808191813F932F939F938F93AD |
:1025A0008CE094E09F938F931F930E941A0A88E215 |
:1025B0008093E503E0913407FF27EE0FFF1FED5FE7 |
:1025C000F84F20813181E0913307FF27EE0FFF1F85 |
:1025D000ED5FF84F808191813F932F939F938F936D |
:1025E0008CEF93E09F938F931F930E941A0A8CE3C2 |
:1025F0008093E503E0913607FF27EE0FFF1FED5FA5 |
:10260000F84F20813181E0913507FF27EE0FFF1F42 |
:10261000ED5FF84F808191813F932F939F938F932C |
:102620008CEE93E09F938F931F930E941A0A8DB7AD |
:102630009EB74C96B7CE1092E5038EED93E09F9334 |
:102640008F9311E01F930E941A0A0F900F900F9022 |
:1026500080910001E091EF03F091F0038A30F1F5F1 |
:1026600084E18093E5038091C5039091C603FF93B5 |
:10267000EF938E1B9F0B9F938F938FEC93E09F9311 |
:102680008F931F930E941A0A88E28093E50320919A |
:10269000F1033091F2038091C7039091C8033F93F7 |
:1026A0002F93821B930B9F938F9380EC93E09F93C8 |
:1026B0008F931F930E941A0A8CE38093E503809105 |
:1026C000F3039091F4039F938F938091A6079091C9 |
:1026D000A7079F938F9381EB93E04BC084E1809396 |
:1026E000E5032091C5033091C603CF0162E070E09D |
:1026F0000E94A03C7F936F932E1B3F0B3F932F9321 |
:1027000082EA93E09F938F931F930E941A0A88E2B4 |
:102710008093E503E091F103F091F2032091C70368 |
:102720003091C803CF0162E070E00E94A03C7F932B |
:102730006F932E1B3F0B3F932F9383E993E09F935F |
:102740008F931F930E941A0A8CE38093E503809174 |
:10275000F3039091F40362E070E00E94A03C7F9349 |
:102760006F938091A6079091A7079F938F9384E81A |
:1027700093E09F938F931F930E941A0A8DB79EB781 |
:10278000459610CE1092E50387E793E09F938F93D1 |
:1027900011E01F930E941A0A84E18093E50380915F |
:1027A0009807909199072091CD033091CE039F9384 |
:1027B0008F933F932F9388E693E09F938F931F937C |
:1027C0000E941A0A88E28093E50380919A0790910B |
:1027D0009B072091CB033091CC039F938F933F9322 |
:1027E0002F9389E593E09F938F931F930E941A0A7A |
:1027F0008CE38093E50360919C0770919D07809125 |
:102800009E0790919F070E94823B7F936F938091D8 |
:102810008607909187079F938F938AE493E01DC169 |
:1028200084E18093E50380910803909109039F93CD |
:102830008F938BE393E09F938F9311E01F930E94FC |
:102840001A0A88E28093E5038091450499279F93B3 |
:102850008F938CE293E09F938F931F930E941A0AA9 |
:102860008DB79EB70A969ECD1092E5038DE193E059 |
:102870009F938F9311E01F930E941A0A84E1809323 |
:10288000E5038091390490913A049F938F938EE0F1 |
:1028900093E09F938F931F930E941A0A88E280937C |
:1028A000E50380913504909136049F938F938FEFC9 |
:1028B00092E09F938F931F930E941A0A8CE3809358 |
:1028C000E50380913704909138049F938F9380EFB4 |
:1028D00092E03AC11092E50380913D0490913E044C |
:1028E0009F938F9384EE92E09F938F9311E01F93B9 |
:1028F0000E941A0A84E18093E50380913F0490913D |
:1029000040049F938F9388ED92E09F938F931F9342 |
:102910000E941A0A88E28093E50380914104909115 |
:1029200042049F938F938CEC92E09F938F931F931D |
:102930000E941A0A8CE38093E503809143049091EE |
:1029400044049F938F9380EC92E024CD1092E50392 |
:1029500088EB92E09F938F9311E01F930E941A0AD5 |
:1029600084E18093E50380919C0399279F938F9343 |
:102970008AEA92E09F938F931F930E941A0A88E23B |
:102980008093E5038091C2039091C3039F938F933B |
:102990008CE992E09F938F931F930E941A0A8CE315 |
:1029A0008093E5038091530799279F938F9380919C |
:1029B000520799279F938F938EE892E09F938F936E |
:1029C0001F930E941A0AEBCC1092E5038EE792E067 |
:1029D0009F938F9311E01F930E941A0A84E18093C2 |
:1029E000E50380910806992787FD90959F938F9323 |
:1029F00080910706992787FD90959F938F938EE688 |
:102A000092E09F938F931F930E941A0A88E280930B |
:102A1000E50380910906992787FD90959F938F93F1 |
:102A200080910A0699279F938F938EE592E09F935A |
:102A30008F931F930E941A0A8CE38093E503809181 |
:102A40000E0699279F938F9380910B06992787FDF8 |
:102A500090959F938F938EE492E09F938F931F9313 |
:102A60000E941A0A8DB79EB748969CCC1092E50337 |
:102A700086E492E09F938F9311E01F930E941A0ABD |
:102A800084E18093E5038091B407992787FD9095B1 |
:102A90009F938F9387E392E09F938F931F930E945E |
:102AA0001A0A88E28093E5038091B507992787FD8C |
:102AB00090959F938F9388E292E09F938F931F93BB |
:102AC0000E941A0A8CE38093E5038091B607992748 |
:102AD00087FD90959F938F9389E192E035C0109286 |
:102AE000E5038FE092E09F938F9311E01F930E9484 |
:102AF0001A0A84E18093E5038091B7079091B807A3 |
:102B00009F938F9381E092E09F938F931F930E94F6 |
:102B10001A0A88E28093E5038091B9079091BA0779 |
:102B20009F938F9383EF91E09F938F931F930E94C6 |
:102B30001A0A8CE38093E5038091BB079091BC0750 |
:102B40009F938F9385EE91E09F938F931F930E94A5 |
:102B50001A0A8DB79EB7429625CC815080936A039E |
:102B60001092E7031092E6031F9108951092B900A6 |
:102B70008AE28093B800089585EA8093BC000895A6 |
:102B800084E98093BC0008958093BB0085E880931E |
:102B9000BC00089585EC8093BC00089585E880937F |
:102BA000BC0008951F920F920FB60F9211248F93BD |
:102BB0009F93EF93FF938091E8038F5F8093E803E7 |
:102BC00081508330E9F1843028F4813081F0823003 |
:102BD00078F508C08530D9F18530B8F1863009F034 |
:102BE0004FC03EC08091E903880F8E5A12C0809179 |
:102BF000E9038F5F8093E9038150813081F0813058 |
:102C000030F0823079F0833009F047C00EC08091F7 |
:102C100079078093BB0085E88093BC003EC080911B |
:102C20007E07F7CF80919607F4CF8091A007F1CF70 |
:102C30008091E903843010F41092E80385EAECCF28 |
:102C40008091EA03880F8D5AE4CF85ECE5CF80911F |
:102C5000BB00E091EA03FF27E550F94F8083DBCF0B |
:102C60008091EA039091BB00E82FFF27E550F94FD0 |
:102C700094838F5F8093EA03843010F01092EA030C |
:102C800084E98093BC001092E8038AE090E090937E |
:102C90008603809385031092E903FF91EF919F9142 |
:102CA0008F910F900FBE0F901F9018954CEB50E036 |
:102CB00084E9FA0180831092E8032BEB30E0F901FC |
:102CC00080811092E90380E8FA0180831092BD00B0 |
:102CD0001092BA00F9011082E9EBF0E01082A8EB43 |
:102CE000B0E01C9210828AE28C9385EAFA0180831C |
:102CF000F901108285E8FA018083089583EC8093BE |
:102D00008100EFE6F0E08081806280831092F4031E |
:102D10001092F3031092F2031092F1031092F00359 |
:102D20001092EF0308951F920F920FB60F92112485 |
:102D30000F931F932F933F934F935F936F937F93C3 |
:102D40008F939F93AF93BF93CF93DF93EF93FF93B3 |
:102D500020918600309187008091ED039091EE03E1 |
:102D6000281B390B80918600909187009093EE0389 |
:102D70008093ED03C9018D5494400091EB031091B1 |
:102D8000EC03835F9A4160F40430110514F0109253 |
:102D90006B0381E090E09093EC038093EB038BC096 |
:102DA0000A3011050CF087C0C9018B5F9040845B2D |
:102DB000914008F068C0E901C25DD140F801EE0F12 |
:102DC000FF1FED5FF84F808191819E01281B390B19 |
:102DD000C90137FF03C0909581959F4F06974CF42A |
:102DE00080914504883C28F480914504865F809357 |
:102DF0004504F801EE0FFF1FED5FF84F2081318190 |
:102E0000C901880F991F820F931F8C0F9D1F64E0CB |
:102E100070E00E94A03C9B01CE01019686179707A7 |
:102E20001CF42150304006C021976C177D0714F424 |
:102E30002F5F3F4F80914504E801CC0FDD1F833C9D |
:102E4000B8F0FE01ED5FF84F80819181A901481B28 |
:102E5000590BCA0163E070E00E94A03CCB01880FCF |
:102E6000991F860F971FC75ED84F9983888304C028 |
:102E7000C75ED84F19821882F801EE0FFF1FED5F71 |
:102E8000F84F31832083F8013196F093EC03E093FF |
:102E9000EB03E530F10519F45D9A5C980BC05D9881 |
:102EA000E630F10511F45C9A05C05C98379711F48F |
:102EB0005B9A01C05B98FF91EF91DF91CF91BF9139 |
:102EC000AF919F918F917F916F915F914F913F91C2 |
:102ED0002F911F910F910F900FBE0F901F9018957B |
:102EE000A0E1B0E0E6E7F7E10C94F03C8091C90383 |
:102EF0009091CA034090F3035090F403481A590A82 |
:102F00005092A7074092A6072091C7033091C803AB |
:102F10008091C5039091C6039E878D87A091EF0392 |
:102F2000B091F003BC87AB878091F1039091F203DD |
:102F3000281B390B388B2F873093E0062093DF0650 |
:102F40006091CD037091CE03E090A307F090A407A9 |
:102F50000027F7FC0095102F882777FD8095982F84 |
:102F60002CE030E040E050E00E94613CE60EF71EAD |
:102F7000081F191FC801B70122E030E040E050E00F |
:102F80000E94D53C3093A4072093A3076091CB0304 |
:102F90007091CC03E090AD07F090AE070027F7FCEE |
:102FA0000095102F882777FD8095982F2CE030E032 |
:102FB00040E050E00E94613CE60EF71E081F191F1A |
:102FC000C801B70122E030E040E050E00E94D53C6B |
:102FD0003093AE072093AD072091CF033091D003FB |
:102FE0006091860770918707882777FD8095982FD5 |
:102FF000442737FD4095542F620F731F841F951F80 |
:1030000022E030E040E050E00E94D53C309387075A |
:10301000209386072091CD033091CE03C901880FFC |
:10302000991F820F931F880F991F880F991FAA2736 |
:1030300097FDA095BA2F2091090430910A04409180 |
:103040000B0450910C04280F391F4A1F5B1F20935B |
:10305000090430930A0440930B0450930C0420910C |
:10306000CB033091CC03C901880F991F820F931FA6 |
:10307000880F991F880F991FAA2797FDA095BA2F2F |
:1030800020910D0430910E0440910F0450911004D2 |
:10309000280F391F4A1F5B1F20930D0430930E0425 |
:1030A00040930F0450931004E090EB06F090EC0670 |
:1030B000A0909C07B0909D07C0909E07D0909F075E |
:1030C0006091110470911204809113049091140482 |
:1030D0000E949F3B3B014C010027F7FC0095102FFD |
:1030E000C801B7010E949F3BA60195010E94F93AD1 |
:1030F0009B01AC01C401B3010E94FA3A0E94823BD9 |
:103100006093110470931204809313049093140439 |
:103110005201CC24B7FCC094DC2C60902904709040 |
:103120002A0480902B0490902C046A0C7B1C8C1C2D |
:103130009D1C6092290470922A0480922B04909224 |
:103140002C0480912D0490912E04A0912F04B09115 |
:1031500030048A0D9B1DAC1DBD1D80932D049093E2 |
:103160002E04A0932F04B0933004B0915704BA8773 |
:10317000BB2309F05FC080915804882309F05AC02E |
:103180008091370786FF56C0E0906504FF24002732 |
:1031900011276091190470911A0480911B04909179 |
:1031A0001C0420E030E140E050E00E94D53CCA0120 |
:1031B000B901A80197010E94613C9B01AC01C601C5 |
:1031C000B5010E94613C20E038E040E050E00E9400 |
:1031D000D53C2093B2043093B3044093B40450938D |
:1031E000B504609121047091220480912304909190 |
:1031F000240420E030E140E050E00E94D53CCA01C8 |
:10320000B901A80197010E94613C9B01AC01C60174 |
:10321000B5010E94613C20E038E040E050E00E94AF |
:10322000D53C2093AE043093AF044093B004509348 |
:10323000B10410C01092AE041092AF041092B0040A |
:103240001092B1041092B2041092B3041092B4041C |
:103250001092B5048091B2049091B304A091B4048B |
:10326000B091B5048E839F83A887B9878091AE04FF |
:103270009091AF04A091B004B091B1048A839B8374 |
:10328000AC83BD8380916604282E332444245524C6 |
:10329000EE80FF80AF85B889EA0EFB1E6A817B81D4 |
:1032A0008C819D81A20191010E94613C20E032E06D |
:1032B00040E050E00E94D53CE20EF31EF092780709 |
:1032C000E09277079701442737FD4095542F80916E |
:1032D000250490912604A0912704B0912804820F20 |
:1032E000931FA41FB51F8093250490932604A093D9 |
:1032F0002704B09328048091530490915404E81A51 |
:10330000F90A0027F7FC0095102F80912104909175 |
:103310002204A0912304B0912404E80EF91E0A1F90 |
:103320001B1FE0922104F0922204009323041093C7 |
:103330002404A0908B03B0908C03C0908D03D09098 |
:103340008E03AE14BF04C006D106C4F480E197E238 |
:10335000A0E0B0E08A199B09AC09BD098093210463 |
:1033600090932204A0932304B09324048093250413 |
:1033700090932604A0932704B09328042227332790 |
:10338000A9012A193B094C095D09809121049091FA |
:103390002204A0912304B091240482179307A40768 |
:1033A000B507B4F4D601C50180519742A040B040A2 |
:1033B0008093210490932204A0932304B0932404C7 |
:1033C0008093250490932604A0932704B0932804A7 |
:1033D0008091C7039091C8030F9734F488E19CEF64 |
:1033E00090937807809377078091C7039091C803E3 |
:1033F000079734F480E398EF9093780780937707EA |
:10340000B0910001B983BA30A9F48091C7039091BB |
:10341000C803835F934034F088EE93E0909378077D |
:10342000809377078091C7039091C8038A5F934088 |
:10343000DCF014C08091C7039091C803855E97406B |
:1034400034F088EE93E0909378078093770780912B |
:10345000C7039091C803835F974034F080ED97E0F5 |
:103460009093780780937707ED84FE848B859C8505 |
:10347000E81AF90AAA81BB81EA1AFB0A6E817F81E8 |
:1034800088859985A20191010E94613C20E032E08B |
:1034900040E050E00E94D53CE21AF30AF092800727 |
:1034A000E0927F079701442737FD4095542F809184 |
:1034B0001D0490911E04A0911F04B0912004820F5E |
:1034C000931FA41FB51F80931D0490931E04A09307 |
:1034D0001F04B09320048091550490915604E81A7B |
:1034E000F90A0027F7FC0095102F8091190490919C |
:1034F0001A04A0911B04B0911C04E80EF91E0A1FC7 |
:103500001B1FE0921904F0921A0400931B041093FD |
:103510001C04A0908703B0908803C0908903D090CA |
:103520008A03AE14BF04C006D106C4F480E197E25A |
:10353000A0E0B0E08A199B09AC09BD098093190489 |
:1035400090931A04A0931B04B0931C0480931D0451 |
:1035500090931E04A0931F04B093200422273327C6 |
:10356000A9012A193B094C095D0980911904909120 |
:103570001A04A0911B04B0911C0482179307A4079E |
:10358000B507B4F4D601C50180519742A040B040C0 |
:103590008093190490931A04A0931B04B0931C0405 |
:1035A00080931D0490931E04A0931F04B0932004E5 |
:1035B0008091C5039091C6030F9734F488E19CEF86 |
:1035C0009093800780937F078091C5039091C603F5 |
:1035D000079734F480E398EF9093800780937F07F8 |
:1035E000B981BA30A9F48091C5039091C603835F75 |
:1035F000934034F088EE93E09093800780937F07A8 |
:103600008091C5039091C6038A5F9340DCF014C09B |
:103610008091C5039091C603855E974034F088EE93 |
:1036200093E09093800780937F078091C5039091EA |
:10363000C603835F974034F080ED97E09093800756 |
:1036400080937F078FEE80937A00609215047092CA |
:103650001604809217049092180480911904909196 |
:103660001A04A0911B04B0911C048093F903909359 |
:10367000FA03A093FB03B093FC0380912104909183 |
:103680002204A0912304B091240480930104909318 |
:103690000204A0930304B093040480911D0490914C |
:1036A0001E04A0911F04B09120048093FD03909309 |
:1036B000FE03A093FF03B093000480912504909132 |
:1036C0002604A0912704B0912804809305049093C8 |
:1036D0000604A0930704B09308048091370787FF7E |
:1036E0003FC08A858823E1F5809158048823C1F57D |
:1036F00020917F0730918007293C310524F0C901D2 |
:103700008052934007C09FEF283339076CF4C901FA |
:10371000805E9C4F220F331F220F331F280F391F4B |
:103720003093800720937F072091770730917807A7 |
:10373000293C310524F0C9018052934007C0AFEF06 |
:1037400028333A076CF4C901805E9C4F220F331F67 |
:10375000220F331F280F391F3093780720937707E4 |
:1037600020913D0430913E0480913307E82FFF27DC |
:10377000EE0FFF1FED5FF84F8081918182599F4FBF |
:10378000281739071CF42F5F3F4F0CC080819181AF |
:1037900082599F4F821793074CF42115310531F060 |
:1037A0002150304030933E0420933D0420913F044B |
:1037B0003091400480913407E82FFF27EE0FFF1F60 |
:1037C000ED5FF84F8081918182599F4F281739070B |
:1037D0001CF42F5F3F4F0CC08081918182599F4F15 |
:1037E000821793074CF42115310531F021503040F8 |
:1037F0003093400420933F042091410430914204CF |
:1038000080913507E82FFF27EE0FFF1FED5FF84F80 |
:103810008081918182599F4F281739071CF42F5FAF |
:103820003F4F0CC08081918182599F4F821793072F |
:103830004CF42115310531F02150304030934204D1 |
:103840002093410420914304309144048091360731 |
:10385000E82FFF27EE0FFF1FED5FF84F808191816A |
:1038600082599F4F281739071CF42F5F3F4F0CC018 |
:103870008081918182599F4F821793074CF42115C3 |
:10388000310531F0215030403093440420934304FB |
:1038900080913D0490913E0497FF05C010923E0434 |
:1038A00010923D040AC08F3F910539F034F08FEF3C |
:1038B00090E090933E0480933D0480913F0490916A |
:1038C000400497FF05C01092400410923F040AC0C4 |
:1038D0008F3F910539F034F08FEF90E090934004E2 |
:1038E00080933F04809141049091420497FF05C06A |
:1038F00010924204109241040AC08F3F910539F0A2 |
:1039000034F08FEF90E090934204809341048091D3 |
:1039100043049091440497FF05C010924404109210 |
:1039200043040AC08F3F910539F034F08FEF90E0E7 |
:103930009093440480934304E2E1C05F0C940C3DF7 |
:1039400010927A008091C5039091C60390938007EE |
:1039500080937F078091C7039091C8039093780765 |
:10396000809377078091C9039091CA039093A7072A |
:103970008093A6076091CD037091CE03882777FDD1 |
:103980008095982F2CE030E040E050E00E94613CB0 |
:103990007093A4076093A3076091CB037091CC034D |
:1039A000882777FD8095982F0E94613C7093AE0721 |
:1039B0006093AD078091CF039091D00390938707D8 |
:1039C000809386078FEE80937A0020913D0430919A |
:1039D0003E0480913307E82FFF27EE0FFF1FED5FB6 |
:1039E000F84F8081918182599F4F281739071CF425 |
:1039F0002F5F3F4F0CC08081918182599F4F82176A |
:103A000093074CF42115310531F0215030403093AB |
:103A10003E0420933D0420913F0430914004809166 |
:103A20003407E82FFF27EE0FFF1FED5FF84F80816F |
:103A3000918182599F4F281739071CF42F5F3F4F00 |
:103A40000CC08081918182599F4F821793074CF45B |
:103A50002115310531F0215030403093400420933E |
:103A60003F04209141043091420480913507E82FB2 |
:103A7000FF27EE0FFF1FED5FF84F80819181825984 |
:103A80009F4F281739071CF42F5F3F4F0CC08081D0 |
:103A9000918182599F4F821793074CF4211531056C |
:103AA00031F0215030403093420420934104209162 |
:103AB00043043091440480913607E82FFF27EE0F2E |
:103AC000FF1FED5FF84F8081918182599F4F28172A |
:103AD00039071CF42F5F3F4F0CC0808191818259C0 |
:103AE0009F4F821793074CF42115310531F0215077 |
:103AF0003040309344042093430480913D049091DE |
:103B00003E0497FF05C010923E0410923D040AC087 |
:103B10008F3F910539F034F08FEF90E090933E04A1 |
:103B200080933D0480913F049091400497FF05C02D |
:103B30001092400410923F040AC08F3F910539F063 |
:103B400034F08FEF90E09093400480933F04809195 |
:103B500041049091420497FF05C0109242041092D4 |
:103B600041040AC08F3F910539F034F08FEF90E0A7 |
:103B700090934204809341048091430490914404C3 |
:103B800097FF05C010924404109243040AC08F3F6F |
:103B9000910539F034F08FEF90E0909344048093D6 |
:103BA000430460915A0777278827992724EC39E046 |
:103BB00040E050E00E94613C60938703709388036B |
:103BC0008093890390938A0360938B0370938C0393 |
:103BD00080938D0390938E0308951F9380913A07ED |
:103BE0008B3F98F08B3F19F480913D040EC08C3FC1 |
:103BF00019F480913F0409C08D3F19F4809141046C |
:103C000004C08E3F21F480914304809394038091FB |
:103C10009403882319F41092940304C08F3F11F485 |
:103C200080939403809139078B3F98F08B3F19F470 |
:103C300080913D040EC08C3F19F480913F0409C06F |
:103C40008D3F19F48091410404C08E3F21F480918E |
:103C500043048093930380919303882319F4109273 |
:103C6000930305C0843618F084E680939303809113 |
:103C70003B078B3F98F08B3F19F480913D040EC0B9 |
:103C80008C3F19F480913F0409C08D3F19F4809155 |
:103C9000410404C08E3F21F4809143048093950336 |
:103CA00080919503882319F41092950305C08436FA |
:103CB00018F084E68093950380913D078B3F98F040 |
:103CC0008B3F19F480913D040EC08C3F19F4809114 |
:103CD0003F0409C08D3F19F48091410404C08E3F18 |
:103CE00021F4809143048093960380919603882366 |
:103CF00019F41092960304C08F3F11F48093960339 |
:103D0000809144078B3F98F08B3F19F480913D04DC |
:103D10000EC08C3F19F480913F0409C08D3F19F407 |
:103D20008091410404C08E3F21F48091430480932C |
:103D3000970380919703882319F41092970304C086 |
:103D40008F3F11F480939703809145078B3F98F044 |
:103D50008B3F19F480913D040EC08C3F19F4809183 |
:103D60003F0409C08D3F19F48091410404C08E3F87 |
:103D700021F48091430480939803809198038B30C1 |
:103D800010F48AE002C08F3F11F480939803809171 |
:103D900046078B3F98F08B3F19F480913D040EC08D |
:103DA0008C3F19F480913F0409C08D3F19F4809134 |
:103DB000410404C08E3F21F4809143048093990311 |
:103DC00080919903882319F41092990304C08F3FBE |
:103DD00011F48093990380914B078B3F98F08B3FB0 |
:103DE00019F480913D040EC08C3F19F480913F047A |
:103DF00009C08D3F19F48091410404C08E3F21F425 |
:103E00008091430480939B0380919B03882319F442 |
:103E100010929B0304C08F3F11F480939B03809109 |
:103E20004C078B3F98F08B3F19F480913D040EC0F6 |
:103E30008C3F19F480913F0409C08D3F19F48091A3 |
:103E4000410404C08E3F21F48091430480935D04BB |
:103E500080915D04882319F410925D0404C08F3FA3 |
:103E600011F480935D0480914D078B3F98F08B3F58 |
:103E700019F480913D040EC08C3F19F480913F04E9 |
:103E800009C08D3F19F48091410404C08E3F21F494 |
:103E90008091430480935E0480915E04882319F42A |
:103EA00010925E0404C08F3F11F480935E048091F1 |
:103EB0004E078B3F98F08B3F19F480913D040EC064 |
:103EC0008C3F19F480913F0409C08D3F19F4809113 |
:103ED000410404C08E3F21F48091430480935F0429 |
:103EE00080915F04882319F410925F0404C08F3F0F |
:103EF00011F480935F0480914F078B3F98F08B3FC4 |
:103F000019F480913D040EC08C3F19F480913F0458 |
:103F100009C08D3F19F48091410404C08E3F21F403 |
:103F2000809143048093600480916004882319F495 |
:103F30001092600404C08F3F11F48093600480915C |
:103F40005F078B3F98F08B3F19F480913D040EC0C2 |
:103F50008C3F19F480913F0409C08D3F19F4809182 |
:103F6000410404C08E3F21F4809143048093610496 |
:103F700080916104882319F41092610404C08F3F7A |
:103F800011F480936104809160078B3F98F08B3F20 |
:103F900019F480913D040EC08C3F19F480913F04C8 |
:103FA00009C08D3F19F48091410404C08E3F21F473 |
:103FB000809143048093620480916204882319F401 |
:103FC0001092620404C08F3F11F4809362048091C8 |
:103FD00061078B3F98F08B3F19F480913D040EC030 |
:103FE0008C3F19F480913F0409C08D3F19F48091F2 |
:103FF000410404C08E3F21F4809143048093630404 |
:1040000080916304882319F41092630404C08F3FE5 |
:1040100011F480936304809162078B3F98F08B3F8B |
:1040200019F480913D040EC08C3F19F480913F0437 |
:1040300009C08D3F19F48091410404C08E3F21F4E2 |
:10404000809143048093640480916404882319F46C |
:104050001092640404C08F3F11F480936404809133 |
:1040600050078B3F98F08B3F19F480913D040EC0B0 |
:104070008C3F19F480913F0409C08D3F19F4809161 |
:10408000410404C08E3F21F48091430480939C033B |
:1040900080919C03882319F410929C0304C08F3FE5 |
:1040A00011F480939C03809155078B3F98F08B3FD0 |
:1040B00019F480913D040EC08C3F19F480913F04A7 |
:1040C00009C08D3F19F48091410404C08E3F21F452 |
:1040D0008091430480939D0380919D03882319F46C |
:1040E00010929D0304C08F3F11F480939D03809133 |
:1040F00058078B3F98F08B3F19F480913D040EC018 |
:104100008C3F19F480913F0409C08D3F19F48091D0 |
:10411000410404C08E3F21F48091430480936504E0 |
:1041200080916504882319F41092650404C08F3FC0 |
:1041300011F480936504809159078B3F98F08B3F71 |
:1041400019F480913D040EC08C3F19F480913F0416 |
:1041500009C08D3F19F48091410404C08E3F21F4C1 |
:10416000809143048093660480916604882319F447 |
:104170001092660404C08F3F11F48093660480910E |
:104180005E078B3F98F08B3F19F480913D040EC081 |
:104190008C3F19F480913F0409C08D3F19F4809140 |
:1041A000410404C08E3F21F48091430480939E0318 |
:1041B00080919E03882319F410929E0304C08F3FC0 |
:1041C00011F480939E0310919B03612F772767FD65 |
:1041D0007095872F972F0E949F3B17FF06C020E006 |
:1041E00030E040E853E40E94FA3A27E137EB41ED32 |
:1041F00058E30E94193C60938F037093900380935F |
:10420000910390939203809142078093A507809138 |
:104210004107809381071F91089580914E04882360 |
:1042200001F510927E07109279071092960710926E |
:10423000A0078091AD03882311F0809379078091C6 |
:10424000AE03882311F080937E078091AF0388230B |
:1042500011F08093A0078091B003882311F0809320 |
:1042600096078091790799279093C0068093BF069F |
:1042700080917E0799279093C2068093C106809112 |
:10428000A00799279093C4068093C3068091960750 |
:1042900099279093C6068093C5061092E803109262 |
:1042A000E9030E94BC15089510929907109298078F |
:1042B00010929B0710929A0780E090E0A0E0B0E097 |
:1042C00080939C0790939D07A0939E07B0939F07B0 |
:1042D0001092F0031092EF031092F2031092F10388 |
:1042E0001092F4031092F303109265041092660486 |
:1042F0000E94A01C84E690E00E94E20D0E94A01C97 |
:104300008091370780FF10C080910E0390910F03BA |
:10431000875B934038F480910E0390910F038E5E7B |
:10432000924010F40E948C104091C5035091C60336 |
:104330005093F0034093EF032091C7033091C803DB |
:104340003093F2032093F1038091C9039091CA0343 |
:104350009093F4038093F3033093F6032093F503D3 |
:104360005093F8034093F70388E0E8E9F7E0A8E604 |
:10437000B1E0182E0E94353D1092190410921A04D3 |
:1043800010921B0410921C0410921D0410921E0423 |
:1043900010921F0410922004109221041092220403 |
:1043A00010922304109224041092250410922604E3 |
:1043B00010922704109228041092290410922A04C3 |
:1043C00010922B0410922C041092800710927F07F9 |
:1043D00010927807109277071092A7071092A607FD |
:1043E00080910A0390910B03A0910C03B0910D03EF |
:1043F0009093EE068093ED061092D8031092D703A7 |
:10440000109231041092320410923304109234044A |
:10441000809135049091360490933804809337044A |
:104420000E94893782E390E09093C1038093C00398 |
:1044300060915A0777278827992724EC39E040E0D4 |
:1044400050E00E94613C60938703709388038093DF |
:10445000890390938A0360915B07772788279927C0 |
:104460000E94613C60938B0370938C0380938D0357 |
:1044700090938E031092A00310929F030895CF9300 |
:10448000DF93C8E9D7E0109299071092980710922D |
:104490009B0710929A0780E090E0A0E0B0E0809344 |
:1044A0009C0790939D07A0939E07B0939F070E943F |
:1044B000A01C84E690E00E94E20D0E94A01C809166 |
:1044C000A3079091A40797FF03C0909581959F4FF4 |
:1044D0006CE070E00E94A03C70939907609398078D |
:1044E0008091AD079091AE0797FF03C0909581959D |
:1044F0009F4F6CE070E00E94A03C70939B0760931C |
:104500009A076091EB067091EC06882777FD8095FD |
:10451000982F0E949F3B60939C0770939D07809308 |
:104520009E0790939F0788E0A8E6B1E0FE01182E51 |
:104530000E94463DDF91CF9108951F93182F0EC022 |
:1045400080914E04882361F484E690E09093C10347 |
:104550008093C0038AEF90E00E94F80D115080F71D |
:104560001F910895ADE3B0E0E8EBF2E20C94F03C6B |
:104570000E947017299A20914C0430914D043C837D |
:104580002B8337FF02C01C821B8280914504843636 |
:1045900008F05DC080910301882399F480910403A1 |
:1045A000909105038F5F9F4F61F488E99AE39093A0 |
:1045B000C1038093C00380E09CE090930503809347 |
:1045C00004038091900490919104009731F0019739 |
:1045D000909391048093900404C010924E04109222 |
:1045E0003B04809100018A3011F4289A01C0289878 |
:1045F00080918B0490918C04815D974028F180918B |
:104600004807682F77277C836B8381E080933B0486 |
:10461000E0912F07FF27EE0FFF1FED5FF84F11828C |
:104620001082E0913007FF27EE0FFF1FED5FF84F7C |
:1046300011821082E0913207FF27EE0FFF1FED5F1E |
:10464000F84F11821082D9C110924E04D6C18091C8 |
:1046500045048D3808F4D1C110923B04809149077C |
:1046600022E3829FC00111249093910480939004CF |
:104670008B819C8189976CF080918B0490918C0444 |
:10468000AFEF8F3F9A0781F1019690938C0480934E |
:104690008B0480918B0490918C04883C910520F0D0 |
:1046A000EB81FC81B89704F51092AA041092AB0438 |
:1046B0001092AC041092AD041092A6041092A704BC |
:1046C0001092A8041092A9041092290410922A04AE |
:1046D00010922B0410922C0410922D0410922E0490 |
:1046E00010922F0410923004E0913107FF27EE0F53 |
:1046F000FF1FED5FF84F80819181813591050CF4AA |
:10470000D4C080914E04882309F0CFC0E0913207D5 |
:10471000FF27EE0FFF1FED5FF84F808191818C34F2 |
:1047200091050CF4C0C080918F048F5F80938F043B |
:10473000893C08F4BAC0299810924E0410928F0454 |
:1047400010928C0410928B0480912F07282F33270E |
:10475000F901EE0FFF1FED5FF84F808191818734E3 |
:1047600091059CF4E0913007FF27EE0FFF1FED5FEE |
:10477000F84F0190F081E02DF7FF03C0F095E1952F |
:10478000FF4FE734F1050CF46CC080913007682FBF |
:104790007727DB01AA0FBB1FAD5FB84F8D919C91AE |
:1047A0001197873491053CF0F901EE0FFF1FED5F83 |
:1047B000F84F808191818D919C918734910564F0AF |
:1047C000F901EE0FFF1FED5FF84F80819181873473 |
:1047D000910514F042E001C041E0FB01EE0FFF1F24 |
:1047E000ED5FF84F80819181863491055CF4F90189 |
:1047F000EE0FFF1FED5FF84F8081918187349105A7 |
:104800000CF043E0FB01EE0FFF1FED5FF84F8081DE |
:1048100091818A5B9F4F5CF4F901EE0FFF1FED5F02 |
:10482000F84F80819181873491050CF044E0660F48 |
:10483000771F6D5F784FDB018D919C918A5B9F4F55 |
:104840005CF4220F331F2D5F384FF9018081918175 |
:10485000863491050CF445E0A2E0B0E0042E0E94FD |
:104860003A3D8091370780FF10C080910E039091F0 |
:104870000F03875B934038F480910E0390910F03F0 |
:104880008E5E924010F40E948C100E94C70346E492 |
:104890006FE277E00E94F0030E9454210E94C70358 |
:1048A0000E949D2202C010928F04E0913107FF27E1 |
:1048B000EE0FFF1FED5FF84F808191818B5A9F4F64 |
:1048C0000CF09BC080913207482F5527FA01EE0F5C |
:1048D000FF1FED5FF84F80819181855B9F4F0CF04A |
:1048E0006DC080918E048F5F80938E04893C08F4A4 |
:1048F00067C088EC80938E0481E090E090938C04F4 |
:1049000080938B0481E080934E041092A204109255 |
:10491000A3041092A4041092A504109229041092EA |
:104920002A0410922B0410922C0410922D04109241 |
:104930002E0410922F041092300410921904109239 |
:104940001A0410921B0410921C041092210410925D |
:10495000220410922304109224048091F903909170 |
:10496000FA03A091FB03B091FC0380931D04909384 |
:104970001E04A0931F04B093200480910104909121 |
:104980000204A0910304B091040480932504909341 |
:104990002604A0932704B09328041092AA0410922E |
:1049A000AB041092AC041092AD041092A6041092C5 |
:1049B000A7041092A8041092A90402C010928E04B9 |
:1049C000440F551F4D5F584FDA018D919C918C34E7 |
:1049D00091058CF080918D048F5F80938D04893CCC |
:1049E00060F010924E0488EC80938D0410928C0439 |
:1049F00010928B0402C010928D0480916B03815041 |
:104A000080936B0380916B038F3F29F080913B046F |
:104A1000882309F46CC30E94ED1D20904604309059 |
:104A2000470480912F07C82EDD24D601AA0FBB1F93 |
:104A3000AD014D5F584FFA010190F081E02DFBABC5 |
:104A4000EAAB80913E07882E9924A75EB84F0D905F |
:104A5000BC91A02DB9ABA8AB80913F07282F33277D |
:104A60003FA72EA760914804709149047A83698317 |
:104A700080913007E82EFF24C701880F991FDC01C1 |
:104A8000AD5FB84F0D90BC91A02DBBA7AAA7875EC4 |
:104A9000984FDC018D919C9199A788A7E0913207EE |
:104AA000AE2FBB27AA0FBB1FAD5FB84F0D90BC91B7 |
:104AB000A02DBFA3AEA3E0913107FF27EE0FFF1F8C |
:104AC000ED5FF84FA080B180E8E7F0E0AE0EBF1ECA |
:104AD000B0924D04A0924C04DA018D919C912091EA |
:104AE0006D0430916E0497FF03C0909581959F4FA0 |
:104AF000281739078CF4FA018081918190936E0414 |
:104B000080936D0497FF0EC0909581959F4F909371 |
:104B10006E0480936D0406C02150304030936E04C3 |
:104B200020936D04F701EE0FFF1FED5FF84F8081BA |
:104B3000918120916F043091700497FF03C090958C |
:104B400081959F4F2817390784F480819181909334 |
:104B5000700480936F0497FF0EC0909581959F4FCE |
:104B60009093700480936F0406C0215030403093BE |
:104B7000700420936F0480913B04882341F01092CD |
:104B80006E0410926D041092700410926F041091D4 |
:104B90009803612F772767FD7095872F972F0E94C5 |
:104BA0009F3B17FF06C020E030E040E853E40E943E |
:104BB000FA3A20E030E040E251E40E94FA3A20E084 |
:104BC00030E040E85BE30E94193C2B013C0160931C |
:104BD000A8077093A9078093AA079093AB07109139 |
:104BE0009903612F772767FD7095872F972F0E9474 |
:104BF0009F3B17FF06C020E030E040E853E40E94EE |
:104C0000FA3A20E030EE4BE257E40E943C3B6093DE |
:104C10009207709393078093940790939507209140 |
:104C2000B203222311F40C94FD348AE090E09093B7 |
:104C3000C1038093C003E22FFF27E2FF09C08091E8 |
:104C40005D04482F5527440F551F440F551F10C0B2 |
:104C5000E3FD03C040E050E00BC080915D04992764 |
:104C6000880F991F880F991F44275527481B590BF8 |
:104C70002091670430916804C901F3E0880F991FFF |
:104C8000FA95E1F7821B930B840F951F68E070E0A3 |
:104C90000E94A03C7DAF6CAF709368046093670482 |
:104CA000E4FF09C080915D04482F5527440F551F2C |
:104CB000440F551F0FC0E5FD02C00C9413358091C1 |
:104CC0005D049927880F991F880F991F442755273E |
:104CD000481B590B2091690430916A04C90163E0B3 |
:104CE000880F991F6A95E1F7821B930B840F951F1C |
:104CF00068E070E00E94A03C8B0170936A046093AE |
:104D000069048091B103282F332723FF03C082E376 |
:104D100090E004C022FF07C08EEC9FEF90936C04DC |
:104D200080936B0404C010926C0410926B0421FFFA |
:104D300009C080919F039091A00301969093A003D6 |
:104D400080939F0324FF09C080919F039091A0034B |
:104D500001979093A00380939F03C101880F991F2F |
:104D6000820D931D4AA95BA9489D9001499D300D74 |
:104D7000589D300D1124820F931F64E070E00E9453 |
:104D8000A03C1B0168A979A9AEA5BFA56A9FC00177 |
:104D90006B9F900D7A9F900D1124280E391E8CADBB |
:104DA0009DAD68E070E00E94A03C260E371E309258 |
:104DB00047042092460489819A81880F991FE981CE |
:104DC000FA818E0F9F1F4AA55BA5489D9001499DC2 |
:104DD000300D589D300D1124820F931F64E070E058 |
:104DE0000E94A03C9B0168A579A5AEA5BFA56A9FBE |
:104DF000C0016B9F900D7A9F900D1124280F391FD1 |
:104E0000C80168E070E00E94A03C260F371F309375 |
:104E100049042093480440916B0450916C04EEA126 |
:104E2000FFA14E1B5F0B50934B0440934A048091AB |
:104E30000E0680FF54C080915D04813808F44FC095 |
:104E400080910706992787FD9095BC01689DC00158 |
:104E5000699D900D789D900D1124280E391E309279 |
:104E600047042092460480910806992787FD909573 |
:104E7000DC01A89DC001A99D900DB89D900D112445 |
:104E8000280F391F30934904209348048091090664 |
:104E9000992787FD9095480F591F50934B044093D5 |
:104EA0004A0420910B06332727FD309580913C075B |
:104EB0009927FC012E9FC0012F9F900D3E9F900DC2 |
:104EC00011249093A00380939F0380910A06992751 |
:104ED0008A159B0524F490934D0480934C04809193 |
:104EE000370782FF0CC080E090E0A0E0B0E0809344 |
:104EF000920790939307A0939407B093950720E0AF |
:104F000030E040E050E0C301B2010E94A93B882399 |
:104F100064F480E090E0A0E0B0E08093A807909374 |
:104F2000A907A093AA07B093AB0720E030E040E0C8 |
:104F300050E060919207709193078091940790914F |
:104F400095070E94A93B882364F480E090E0A0E0EC |
:104F5000B0E08093920790939307A0939407B09347 |
:104F60009507F701EE0FFF1FED5FF84F20813181AC |
:104F700080915607482F55274217530744F48091D4 |
:104F8000630782FF04C081E08093590411C0F701D8 |
:104F9000EE0FFF1FED5FF84F2081318180915707A1 |
:104FA000BA01681B71092617370714F410925904C7 |
:104FB000F701EE0FFF1FED5FF84F808191816627AB |
:104FC0007727641B750B8617970744F48091630756 |
:104FD00083FF04C081E080935A0417C080915A0473 |
:104FE000882399F0EE0CFF1C83E097E0E80EF91E91 |
:104FF000D7012D913C91809157079927841B950BE0 |
:105000008217930714F410925A04F601EE0FFF1F53 |
:10501000ED5FF84F808191814817590744F48091E2 |
:10502000630780FF04C081E080935C0415C0809119 |
:105030005C04882389F0F601EE0FFF1FED5FF84F47 |
:105040002081318180915707FA01E81BF1092E1761 |
:105050003F0714F410925C04F601EE0FFF1FED5FA2 |
:10506000F84F808191818617970744F480916307F8 |
:1050700081FF04C081E080935B0417C080915B04D2 |
:10508000882399F0CC0CDD1C23E037E0C20ED31E40 |
:10509000D6012D913C91809157079927841B950B40 |
:1050A0008217930714F410925B04809159048823AB |
:1050B00021F480915A04882321F081E080935804E0 |
:1050C00002C01092580480915C04882321F48091DE |
:1050D0005B04882351F081E08093570410925804B8 |
:1050E0001092590410925A040EC0109257048091E5 |
:1050F0005804882311F40C94173584E690E09093BB |
:10510000C1038093C003809155079927EB81FC81EF |
:105110008E179F0714F49C838B8380913B04882314 |
:1051200041F110924B0410924A04109247041092DD |
:10513000460410924904109248048DEC9CECACECAF |
:10514000BDE38093A8079093A907A093AA07B09303 |
:10515000AB078AE097EDA3EABBE3809392079093B5 |
:105160009307A0939407B093950710925804109258 |
:1051700057042091F9033091FA034091FB035091B9 |
:10518000FC0328AF39AF4AAF5BAF80918A0790919B |
:105190008B07A0918C07B0918D07820F931FA41FDE |
:1051A000B51F80938A0790938B07A0938C07B093C9 |
:1051B0008D074091010450910204609103047091A5 |
:1051C00004044CAB5DAB6EAB7FAB80918E079091CE |
:1051D0008F07A0919007B0919107840F951FA61F8C |
:1051E000B71F80938E0790938F07A0939007B0937B |
:1051F00091076091FD037091FE038091FF039091F0 |
:1052000000046D8F7E8F8F8F98A38091820790917D |
:105210008307A0918407B09185072D8D3E8D4F8D1A |
:1052200058A1820F931FA41FB51F809382079093EC |
:105230008307A0938407B09385074091050450919C |
:1052400006046091070470910804498F5A8F6B8F90 |
:105250007C8F80917A0790917B07A0917C07B09119 |
:105260007D07840F951FA61FB71F80937A07909321 |
:105270007B07A0937C07B0937D075091570459A3F7 |
:10528000552311F00C94723580915804882311F045 |
:105290000C9472350C941F3580916F0490917004BA |
:1052A0004097A4F0C201B10123E030E040E050E0BB |
:1052B0000E94D53C59016A01C401B30123E030E0EA |
:1052C00040E050E00E94D53C79018A01E09132072C |
:1052D000FF27EE0FFF1FED5FF84F0190F081E02DEB |
:1052E000F7FF03C0F095E195FF4F7A97A4F0C60150 |
:1052F000B50123E030E040E050E00E94D53C590188 |
:105300006A01C801B70123E030E040E050E00E94AC |
:10531000D53C79018A0161E2A616B104C104D10429 |
:1053200034F090E2A92EB12CC12CD12C11C070EE1A |
:10533000A7167FEFB7067FEFC7067FEFD70644F4C7 |
:1053400080EEA82E8FEFB82E8FEFC82E8FEFD82EBD |
:1053500081E2E816F1040105110534F010E2E12EB6 |
:10536000F12C012D112D11C090EEE9169FEFF906D9 |
:105370009FEF09079FEF190744F4B0EEEB2EBFEF44 |
:10538000FB2EBFEF0B2FBFEF1B2F809119049091C5 |
:105390001A04A0911B04B0911C048A199B09AC0942 |
:1053A000BD098093190490931A04A0931B04B09331 |
:1053B0001C048091210490912204A0912304B091B7 |
:1053C00024048E199F09A00BB10B809321049093A4 |
:1053D0002204A0932304B09324048091D9039091D4 |
:1053E000DA038F3F910509F008F4D5C4A9A1AA23D7 |
:1053F00009F055C480915804882309F050C4609185 |
:105400008A0770918B0780918C0790918D0720E01F |
:1054100031E040E050E00E94D53C2D8B3E8B4F8B1D |
:10542000588F20938A0730938B0740938C075093B3 |
:105430008D0760918E0770918F07809190079091F2 |
:10544000910720E031E040E050E00E94D53C298BFC |
:105450003A8B4B8B5C8B20938E0730938F07409356 |
:10546000900750939107E0904307FF2400271127EE |
:105470002091090430910A0440910B0450910C04CE |
:10548000C801B7010E94613C20E031E040E050E0FB |
:105490000E94D53C19012A012093090430930A0483 |
:1054A00040930B0450930C0420910D0430910E0492 |
:1054B00040910F0450911004C801B7010E94613C53 |
:1054C00020E031E040E050E00E94D53C39014A0143 |
:1054D00020930D0430930E0440930F045093100456 |
:1054E000609111047091120480911304909114043E |
:1054F00020E031E040E050E00E94D53C20931104D0 |
:105500003093120440931304509314046D897E89E0 |
:105510008F89988D6219730984099509609396049F |
:10552000709397048093980490939904E0905C079B |
:10553000FF2400271127A80197010E94D53C59019B |
:105540006A01209384043093850440938604509329 |
:10555000870469897A898B899C8966197709880902 |
:1055600099096093920470939304809394049093A8 |
:105570009504A80197010E94D53C2D873E874F874F |
:10558000588BC601B50120E031E040E050E00E94B8 |
:10559000D53C890130935604209355046D857E8552 |
:1055A0008F85988920E031E040E050E00E94D53CB2 |
:1055B0003DAF2CAF309354042093530480916D047D |
:1055C00090916E044097BCF480916F0490917004A8 |
:1055D00040978CF4E0913207FF27EE0FFF1FED5F3D |
:1055E000F84F0190F081E02DF7FF03C0F095E195B1 |
:1055F000FF4F7A9774F0C80162E070E00E94A03C0F |
:10560000CB0162E070E00E94A03C7093560460936E |
:10561000550460918207709183078091840790916F |
:10562000850720E031E040E050E00E94D53C209327 |
:1056300082073093830740938407509385076091D6 |
:105640007A0770917B0780917C0790917D0720E01D |
:1056500031E040E050E00E94D53C20937A0730933F |
:105660007B0740937C0750937D07ED8CFE8C0F8D5C |
:1056700018A128AD39AD4AAD5BADE21AF30A040BAF |
:10568000150BE0929E04F0929F040093A0041093E7 |
:10569000A104A98CBA8CCB8CDC8C4CA95DA96EA919 |
:1056A0007FA9A41AB50AC60AD70AA0929A04B09292 |
:1056B0009B04C0929C04D0929D04E0929604F092C8 |
:1056C00097040093980410939904A0929204B092C6 |
:1056D0009304C0929404D092950480911D049091FB |
:1056E0001E04A0911F04B09120048E199F09A00BE5 |
:1056F000B10B80931D0490931E04A0931F04B093DC |
:1057000020048091250490912604A0912704B09153 |
:1057100028048A199B09AC09BD098093250490933C |
:105720002604A0932704B0932804C201B1012AE102 |
:1057300030E040E050E00E94D53C3093CA06209310 |
:10574000C906C401B3012AE130E040E050E00E9404 |
:10575000D53C3093CC062093CB06F092CE06E09257 |
:10576000CD06B092D006A092CF066D897E898F8932 |
:10577000988D2AE130E040E050E00E94D53C309323 |
:10578000D2062093D10669897A898B899C892AE17E |
:1057900030E040E050E00E94D53C3093D4062093A6 |
:1057A000D3066D857E857093E2066093E1068CAD2D |
:1057B0009DAD880F991F2CAD3DAD63E0220F331FC7 |
:1057C0006A95E1F7820F931F9093E4068093E306B6 |
:1057D00081E090E090937F0480937E048091760432 |
:1057E00090917704A0917804B09179042D893E8935 |
:1057F0004F89588D821B930BA40BB50B815E914B87 |
:10580000AF4FBF4F8F539C49A040B04008F0C1C07C |
:1058100041E0E41640E1F40640E0040740E01407EC |
:105820000CF452C080917D04882309F449C0D8014A |
:10583000C7015CE0B595A795979587955A95D1F7DF |
:10584000019690937F0480937E04D801C70143E0C2 |
:10585000B595A795979587954A95D1F78093840438 |
:1058600090938504A0938604B0938704895893414C |
:10587000A040B04064F088E893E1A0E0B0E08093FD |
:10588000840490938504A0938604B0938704609168 |
:10589000840470918504809186049091870420E0AF |
:1058A00031E040E050E00E94D53C80915504909159 |
:1058B0005604820F931F909356048093550466C03C |
:1058C00081E080937D0462C010927D0460E0E61662 |
:1058D00060EFF6066FEF06076FEF16070CF056C085 |
:1058E00080917C04882309F44DC088279927DC0126 |
:1058F0008E199F09A00BB10B3CE0B595A795979524 |
:1059000087953A95D1F7019690937F0480937E0412 |
:10591000C801B70128E030E040E050E00E94D53CEB |
:105920002093840430938504409386045093870425 |
:1059300028573C4E4F4F5F4F64F488E79CEEAFEF23 |
:10594000BFEF8093840490938504A0938604B09362 |
:1059500087046091840470918504809186049091FD |
:10596000870420E031E040E050E00E94D53C809187 |
:10597000550490915604820F931F90935604809380 |
:1059800055040BC081E080937C0407C010927C0416 |
:1059900004C010927F0410927E0480915D07882ECF |
:1059A000992480917E0490917F048816990624F4AE |
:1059B00090927F0480927E0481E0E81684E0F806ED |
:1059C00080E0080780E018075CF08091EF03909179 |
:1059D000F00320917E0430917F04820F931F13C047 |
:1059E00090E0E9169CEFF9069FEF09079FEF190772 |
:1059F00074F48091EF039091F00320917E04309134 |
:105A00007F04821B930B9093F0038093EF0381E05C |
:105A100090E090937F0480937E0410928004109213 |
:105A200081041092820410928304809172049091F8 |
:105A30007304A0917404B091750429893A894B8943 |
:105A40005C89821B930BA40BB50B815E914BAF4F0E |
:105A5000BF4F8F539C49A040B04008F0BDC041E00B |
:105A6000A41640E1B40640E0C40640E0D4060CF4BD |
:105A700050C080917B04882309F447C0D601C5013A |
:105A80002CE0B595A795979587952A95D1F701961E |
:105A900090937F0480937E04D601C50103E0B59501 |
:105AA000A795979587950A95D1F780938004909351 |
:105AB0008104A0938204B093830489589341A04049 |
:105AC000B04064F088E893E1A0E0B0E08093800407 |
:105AD00090938104A0938204B09383046091800426 |
:105AE00070918104809182049091830420E031E0E0 |
:105AF00040E050E00E94D53C6CAD7DAD620F731F5D |
:105B0000709354046093530464C081E080937B04D9 |
:105B100060C010927B0470E0A71670EFB7067FEFAD |
:105B2000C7067FEFD7060CF054C080917A04882313 |
:105B300009F44BC088279927DC018A199B09AC0915 |
:105B4000BD091CE0B595A795979587951A95D1F74E |
:105B5000019690937F0480937E04C601B50128E0EE |
:105B600030E040E050E00E94D53C20938004309328 |
:105B70008104409382045093830428573C4E4F4F36 |
:105B80005F4F64F488E79CEEAFEFBFEF8093800433 |
:105B900090938104A0938204B09383046091800465 |
:105BA00070918104809182049091830420E031E01F |
:105BB00040E050E00E94D53CACADBDADA20FB31F9C |
:105BC000B0935404A09353040BC081E080937A04F3 |
:105BD00007C010927A0404C010927F0410927E04D1 |
:105BE00080917E0490917F048816990624F4909207 |
:105BF0007F0480927E04B1E0AB16B4E0BB06B0E057 |
:105C0000CB06B0E0DB065CF08091F1039091F203EB |
:105C100020917E0430917F04820F931F13C0E0E037 |
:105C2000AE16ECEFBE06EFEFCE06EFEFDE0674F435 |
:105C30008091F1039091F20320917E0430917F04D2 |
:105C4000821B930B9093F2038093F1038091800465 |
:105C5000909181049093DE068093DD068091EF039E |
:105C60009091F0039093D6068093D5068091F1032E |
:105C70009091F2032091F5033091F603821B930B70 |
:105C80009C01A3E0220F331FAA95E1F7880F991F0B |
:105C9000820F931F9093D8068093D70608C0109266 |
:105CA000540410925304109256041092550420E0AC |
:105CB00030E040E050E0609192077091930780914E |
:105CC0009407909195070E94A93B882341F4109274 |
:105CD000540410925304109256041092550480916B |
:105CE0008A0790918B07A0918C07B0918D078093C4 |
:105CF000760490937704A0937804B093790480910C |
:105D00008E0790918F07A0919007B0919107809393 |
:105D1000720490937304A0937404B093750410926A |
:105D2000090410920A0410920B0410920C041092B1 |
:105D30000D0410920E0410920F0410921004109291 |
:105D40001104109212041092130410921404109271 |
:105D50008A0710928B0710928C0710928D07109271 |
:105D60008E0710928F071092900710929107109251 |
:105D70008207109283071092840710928507109271 |
:105D80007A0710927B0710927C0710927D07109281 |
:105D9000DA031092D90380904A0490904B04540186 |
:105DA00097FE04C0AA24BB24A818B908F5E1AF16D1 |
:105DB000B1043CF08091370784FD03C081E08093FB |
:105DC000A103E0904007CC24B7FCC094DC2CB401C4 |
:105DD000882777FD8095982F2E2D33274427552728 |
:105DE0000E94613C9B01AC01C601B5010E94613C6F |
:105DF00020E032E040E050E00E94D53C89019A0169 |
:105E0000FF24E89CC001E99C900DF89C900D1124A2 |
:105E100064E070E00E94A03C600F711F882777FD4E |
:105E20008095982F6093A2047093A3048093A40498 |
:105E30009093A5042091290430912A0440912B04C9 |
:105E400050912C04261B370B480B590B2093290427 |
:105E500030932A0440932B0450932C04213563EC97 |
:105E6000360760E0460760E056072CF080E593ECCB |
:105E7000A0E0B0E009C0205B3C434F4F5F4F64F4AB |
:105E800080EB9CE3AFEFBFEF8093290490932A044B |
:105E9000A0932B04B0932C048091370783FF9AC002 |
:105EA000809171048150809371048F3FD9F40E94D6 |
:105EB0000138909336048093350420913704309153 |
:105EC0003804821B930B845E9D4F68E671E00E944C |
:105ED000A03C845B904090933A048093390482E321 |
:105EE000809371046091F9037091FA038091FB0330 |
:105EF0009091FC0320E032E040E050E00E94D53C6D |
:105F0000890137FF03C0109501951F4F609101046F |
:105F100070910204809103049091040420E032E027 |
:105F200040E050E00E94D53CB90137FF03C07095B6 |
:105F300061957F4F601771070CF4B80163327105EA |
:105F400074F48091A103882351F0809135049091DD |
:105F5000360490933804809337041092A103209163 |
:105F600097033327629FC001639F900D729F900D2E |
:105F7000112460E470E00E94A03C261B370B12162F |
:105F8000130644F58091390490913A04DC012A9F6C |
:105F9000C0012B9F900D3A9F900D112460E270E09C |
:105FA0000E94A03C882777FD8095982F2091290496 |
:105FB00030912A0440912B0450912C04260F371F56 |
:105FC000481F591F2093290430932A0440932B041F |
:105FD00050932C04809188048150809388048F3FD3 |
:105FE00009F079C088E180938804E0904307FF249A |
:105FF000002711276091F9037091FA038091FB0348 |
:106000009091FC03A80197010E94D53C3093A8060B |
:106010002093A7066091010470910204809103040B |
:1060200090910404A80197010E94D53C3093AA06E0 |
:106030002093A9068091A3079091A4079093AC06A2 |
:106040008093AB068091AD079091AE079093AE061A |
:106050008093AD068091A6079091A7079093B00614 |
:106060008093AF0680914F04909150049093B206B4 |
:106070008093B106609131047091320480913304B1 |
:106080009091340420E032E040E050E00E94D53CA2 |
:106090003093B4062093B306809135049091360472 |
:1060A0009093B8068093B7068091080390910903F6 |
:1060B0009093BA068093B9068091450499279093EE |
:1060C000BC068093BB0680918607909187079093CA |
:1060D000C8068093C70680915704C0907F07D09070 |
:1060E0008007882391F0B601882777FD8095982F47 |
:1060F0000E949F3B2091A8073091A9074091AA07D1 |
:106100005091AB070E94193C2DC06091F90370912A |
:10611000FA038091FB039091FC030E949F3B209126 |
:1061200092073091930740919407509195070E94F0 |
:10613000193C7B018C01B601882777FD8095982F4B |
:106140000E949F3B2091A8073091A9074091AA0780 |
:106150005091AB070E94193C9B01AC01C801B701EB |
:106160000E94FA3A0E94823B7093800760937F07F7 |
:1061700080915804C0907707D0907807882391F0D9 |
:10618000B601882777FD8095982F0E949F3B20912C |
:10619000A8073091A9074091AA075091AB070E9428 |
:1061A000193C2DC060910104709102048091030498 |
:1061B000909104040E949F3B209192073091930795 |
:1061C00040919407509195070E94193C7B018C01E6 |
:1061D000B601882777FD8095982F0E949F3B2091DC |
:1061E000A8073091A9074091AA075091AB070E94D8 |
:1061F000193C9B01AC01C801B7010E94FA3A0E9408 |
:10620000823B7093780760937707209192073091D3 |
:10621000930740919407509195072AA33BA34CA361 |
:106220005DA36091A6077091A707882777FD8095E9 |
:10623000982F0E949F3B7B018C016091A807709171 |
:10624000A9078091AA079091AB079B01AC010E941E |
:10625000FA3A9B01AC01C801B7010E94193C7B01CD |
:106260008C0160911504709116048091170490912F |
:1062700018040E949F3B2AA13BA14CA15DA10E9452 |
:10628000193C20E030E040E05FE30E94193C9B01B4 |
:10629000AC01C801B7010E94FA3A0E94823B8B010F |
:1062A0007093A7076093A6076091010470910204A0 |
:1062B00080910304909104040E949F3B2AA13BA17A |
:1062C0004CA15DA10E94193C69877A878B879C87C6 |
:1062D0000E94823B7093DA066093D906409148048D |
:1062E000509149045DA74CA75093E6064093E506FC |
:1062F00020917707309178073093E0062093DF06EE |
:1063000080917F079091800758E0813095071CF0BD |
:1063100080E098E005C08050984F34F480E098EF1A |
:106320009093800780937F0778E0213037071CF037 |
:1063300080E098E005C02050384F34F480E098EFBA |
:10634000909378078093770798E0013019071CF045 |
:1063500080E098E005C00050184F34F480E098EFDA |
:106360009093A7078093A60780913707992780FF0E |
:10637000D9C04091940381FF0EC0423310F5809143 |
:106380004F04909150044497909352048093510489 |
:1063900010923C0419C020919F033091A003240F58 |
:1063A000311D80913C079927FC012E9FC0012F9F32 |
:1063B000900D3E9F900D112444979093520480932A |
:1063C000510481E080933C0480913B04882321F0B8 |
:1063D000109252041092510420914F0430915004B5 |
:1063E0004091510450915204421753070CF09AC047 |
:1063F00080913C04882309F495C0241B350B8091BF |
:1064000095039927AC01249FC001259F900D349FCF |
:10641000900D112460E170E00E94A03C0B811C8172 |
:10642000061B170B2091D7033091D803809193035B |
:106430009927BC01269FC001279F900D369F900D84 |
:10644000112468E070E00E94A03C061B170B6091CD |
:10645000310470913204809133049091340420E02F |
:1064600032E040E050E00E94D53CCA01B9012091E1 |
:1064700096033327442755270E94613C20E230E0F1 |
:1064800040E050E00E94D53C7FEF2E3C370714F4EB |
:106490002EEC3FEF8091890490918A04AC01E4E0F6 |
:1064A000440F551FEA95E1F7481B590B233331057B |
:1064B00014F022E330E0021B130BCA01800F911F7E |
:1064C00060E170E00E94A03C70938A0460938904AC |
:1064D000809138079927681779078CF4AB81BC81C4 |
:1064E000A817B9072CF090938A048093890407C0F9 |
:1064F000EB81FC81F0938A04E09389040DC08091C4 |
:10650000890490918A042B813C812817390724F44F |
:1065100030938A04209389044091890450918A041D |
:106520005C834B838091A507682E77247CEE872EB1 |
:106530007FEF972E860C971C6B817C8168157905FF |
:106540000CF44B019092B6068092B506E091A60736 |
:10655000F091A7070091A2041091A3042091A40434 |
:106560003091A50474E1871691041CF4222433248D |
:1065700022C0C40162E070E00E94A03C9F01201B89 |
:10658000310BCB01261737070CF4C90170956195C3 |
:106590007F4F681779070CF4BC01C301881999096A |
:1065A000681779070CF4CB01140126183708281650 |
:1065B00039060CF41C014090460450904704809129 |
:1065C000B6049091B704481A590A80917F079091B8 |
:1065D000800784199509909389078093880720E0A4 |
:1065E00030E040E050E06AA17BA18CA19DA10E9417 |
:1065F000A93B8823E1F16091AA047091AB048091DA |
:10660000AC049091AD040E949F3B5B016C016091D2 |
:10661000F9037091FA038091FB039091FC030E94AF |
:106620009F3B2AA13BA14CA15DA10E94193C7B018B |
:106630008C01B201882777FD8095982F0E949F3B9F |
:106640009B01AC01C801B7010E94F93A9B01AC0162 |
:10665000C601B5010E94FA3A0E94823B6093AA04E7 |
:106660007093AB048093AC049093AD041CC0209154 |
:10667000880730918907442737FD4095542F809132 |
:10668000AA049091AB04A091AC04B091AD04820F28 |
:10669000931FA41FB51F8093AA049093AB04A093EB |
:1066A000AC04B093AD048091AA049091AB04A09186 |
:1066B000AC04B091AD048138EEE39E07E0E0AE0794 |
:1066C000E0E0BE072CF080E89EE3A0E0B0E009C067 |
:1066D0008058914CAF4FBF4F64F480E891ECAFEF1E |
:1066E000BFEF8093AA049093AB04A093AC04B09343 |
:1066F000AD04609188077091890720918F033091D4 |
:10670000900340919103509192032D833E834F83D8 |
:106710005887882777FD8095982F0E949F3B7B01A3 |
:106720008C016091AA047091AB048091AC049091AB |
:10673000AD040E949F3B9B01AC016D817E818F81E6 |
:1067400098850E94193C9B01AC01C801B7010E94C9 |
:10675000FA3A0E94823B5B016C017DAF6CAF809185 |
:106760009E03E82EFF2400271127C10137FE04C035 |
:10677000882799278219930962E070E00E94A03C63 |
:106780009B01280D391D442737FD4095542FC80122 |
:10679000B7010E94613C20E430E040E050E00E94FC |
:1067A000D53C29014CAD5DAD441555050CF4950162 |
:1067B000AA24BB24A418B508A501A216B3060CF49C |
:1067C000A901C401820D931D840F951F97FF03C07B |
:1067D00020E030E005C09301861597050CF49C017C |
:1067E00080918107C82EDD24C601C216D3060CF4A1 |
:1067F000C90180937907C401841B950B820D931DF9 |
:1068000097FF03C020E030E005C09301861597058F |
:106810000CF49C01C601C216D3060CF4C901809386 |
:106820007E078091B8049091B9046CA57DA5681B82 |
:10683000790B7DAF6CAF8091770790917807861BBD |
:10684000970B909376078093750720E030E040E047 |
:1068500050E06AA17BA18CA19DA10E94A93B882345 |
:1068600071F16091A6047091A7048091A8049091A1 |
:10687000A9040E949F3B7B018C01ACADBDADBD0165 |
:10688000882777FD8095982F0E949F3B9B01AC0144 |
:1068900069857A858B859C850E94F93A9B01AC01BC |
:1068A000C801B7010E94FA3A0E94823B6093A60495 |
:1068B0007093A7048093A8049093A9041CC020910E |
:1068C000750730917607442737FD4095542F809106 |
:1068D000A6049091A704A091A804B091A904820FE6 |
:1068E000931FA41FB51F8093A6049093A704A093A1 |
:1068F000A804B093A9048091A6049091A704A09144 |
:10690000A804B091A9048138EEE39E07E0E0AE0749 |
:10691000E0E0BE072CF080E89EE3A0E0B0E009C014 |
:106920008058914CAF4FBF4F64F480E891ECAFEFCB |
:10693000BFEF8093A6049093A704A093A804B093FC |
:10694000A9046091750770917607882777FD809577 |
:10695000982F0E949F3B7B018C016091A60470914F |
:10696000A7048091A8049091A9040E949F3B9B01D9 |
:10697000AC016D817E818F8198850E94193C9B01BD |
:10698000AC01C801B7010E94FA3A0E94823B920111 |
:10699000641575050CF49B01C501A216B3060CF431 |
:1069A000C901A401480F591F4219530957FF03C0D9 |
:1069B00060E070E005C0B301461557050CF4BA015C |
:1069C000A601C616D7060CF4AB014093A0079401AC |
:1069D000281B390B2219330937FF03C040E050E070 |
:1069E00005C0A301261537050CF4A901C601C4167C |
:1069F000D5060CF0D5C0CA01D3C0209167043091F0 |
:106A00006804C90163E0880F991F6A95E1F7821B4A |
:106A1000930B68E070E00E94A03C7DAF6CAF709378 |
:106A200068046093670440E050E00C946A2680910B |
:106A30005704882311F40C948D280C948328E0903B |
:106A40004307FF240027112768AD79AD8AAD9BADC0 |
:106A5000A80197010E94D53C59016A018091A307C2 |
:106A60009091A407AA2797FDA095BA2FA81AB90A52 |
:106A7000CA0ADB0A6CA97DA98EA99FA9A801970162 |
:106A80000E94D53C79018A018091AD079091AE07B3 |
:106A9000AA2797FDA095BA2FE81AF90A0A0B1B0B33 |
:106AA000C601B50120E130E040E050E00E94D53C55 |
:106AB00019012A0159016A01C801B70120E130E03A |
:106AC00040E050E00E94D53C39014A0179018A0139 |
:106AD00080916D0490916E04409714F00C945229AB |
:106AE0000C944C291092090410920A0410920B0481 |
:106AF00010920C0410920D0410920E0410920F04C8 |
:106B00001092100410928A0710928B0710928C0733 |
:106B100010928D0710928E0710928F071092900797 |
:106B200010929107109282071092830710928407A7 |
:106B30001092850710927A0710927B0710927C07BB |
:106B400010927D078091190490911A04A0911B0462 |
:106B5000B0911C0480931D0490931E04A0931F0405 |
:106B6000B09320048091210490912204A0912304E9 |
:106B7000B09124048093250490932604A0932704C5 |
:106B8000B09328041092DA031092D903109256049D |
:106B90001092550410925404109253040C94ED2951 |
:106BA00080939607E2E1C35C0C940C3D81E08093F6 |
:106BB0002F0722E02093300783E08093310754E0D1 |
:106BC0005093320745E04093330736E03093340763 |
:106BD00087E08093350788E08093360780EC8093C8 |
:106BE00037079EE1909338078BEF80933A078AE04E |
:106BF00080933B079093390790933D0720933C0780 |
:106C000020933E0750933F07309340078FE08093D7 |
:106C100041078AEF809342079093430780E880936F |
:106C2000440724E6209345078CE8809346078EE5C9 |
:106C30008093470783E28093480784E18093490764 |
:106C400010924A0780E180934B0780E580934C07C0 |
:106C500010924D0710924E0710924F0710925F0747 |
:106C600010926007109261071092620720935007FC |
:106C700088E2809351071092640792E39093520741 |
:106C800086E98093530740935407909355078AE50C |
:106C90008093560790935707109263078093580785 |
:106CA0004093590720935A0720935B0780E2809313 |
:106CB0005C0750935D0790935E07A9E6B7E0ECE6AA |
:106CC000F3E08CE001900D928150E1F7089581E0AE |
:106CD00080932F0782E08093300723E020933107D1 |
:106CE00054E05093320745E04093330736E0309349 |
:106CF000340787E08093350788E08093360780E487 |
:106D0000809337079EE1909338078BEF80933A0783 |
:106D10008AE080933B079093390790933D07209337 |
:106D20003C0720933E0750933F07309340078FE086 |
:106D3000809341078AEF809342079093430780E84E |
:106D40008093440790E59093450788E78093460732 |
:106D50008EE58093470783E28093480784E1809320 |
:106D6000490710924A0730E230934B0790934C0743 |
:106D700010924D0710924E0710924F0710925F0726 |
:106D800010926007109261071092620724E6209328 |
:106D9000500788E2809351071092640792E3909322 |
:106DA000520786E980935307409354079093550701 |
:106DB0008AE5809356079093570710926307809354 |
:106DC00058074093590720935A0720935B07309345 |
:106DD0005C0750935D078BE480935E07A9E6B7E0FC |
:106DE000E6E7F3E08CE001900D928150E1F7089521 |
:106DF00081E080932F0782E08093300783E08093C7 |
:106E0000310734E03093320745E04093330786E0A2 |
:106E10008093340787E08093350728E02093360776 |
:106E200080E4809337079EE1909338078BEF80933F |
:106E30003A078AE080933B079093390790933D0788 |
:106E400030933C0730933E0720933F078CE08093BC |
:106E500040078FE0809341078AEF80934207909329 |
:106E6000430790E89093440780E58093450756E9EF |
:106E7000509346078EE58093470783E28093480747 |
:106E800084E18093490710924A0780E280934B0780 |
:106E900090934C0710924D0710924E0710924F0797 |
:106EA00010925F07109260071092610710926207BC |
:106EB00024E62093500788E28093510710926407DC |
:106EC00082E3809352075093530740935407809373 |
:106ED00055079AE5909356078093570710926307DA |
:106EE000909358074093590720935A0720935B07C4 |
:106EF00080E180935C0730935D0720935E07A9E6ED |
:106F0000B7E0EEE7F3E08CE001900D928150E1F7FD |
:106F100008958091BA049091BB04A091BC04B091F3 |
:106F2000BD048093C2049093C304A093C404B0939F |
:106F3000C5048091BE049091BF04A091C004B0919B |
:106F4000C1048093C6049093C704A093C804B0936F |
:106F5000C90408951092B7041092B6041092B904AF |
:106F60001092B80408951F920F920FB60F92112439 |
:106F70002F933F934F938F939F938091BD078330BF |
:106F800019F08430A1F508C08EB58093CA041EBCE8 |
:106F900084E08093BD072BC08091CA049927382FC5 |
:106FA00022278EB59927282B392BC9018D509E4F4A |
:106FB000875E9340D0F48091C007853019F0863009 |
:106FC00069F406C03093C2072093C10786E00BC066 |
:106FD0003093C4072093C30787E005C03093C607EA |
:106FE0002093C50785E08093C0071092BD079F914D |
:106FF0008F914F913F912F910F900FBE0F901F9047 |
:107000001895AAE0B0E0E7E0F8E30C94F03CA0901B |
:107010004E07BB2433E0AA0CBB1C3A95E1F7CC2405 |
:10702000DD246091F9037091FA038091FB03909144 |
:10703000FC03A60195010E94D53C79018A01FF2439 |
:10704000E7FCF094C7010E94A13A2C01C7010E94FD |
:10705000E43A3C01609101047091020480910304C0 |
:1070600090910404A60195010E94D53C79018A0102 |
:10707000FF24E7FCF094C7010E94A13A9A87898710 |
:10708000C7010E94E43A1C016091C1077091C207D8 |
:10709000E090C307F090C4072091B507332727FD80 |
:1070A0003095E21AF30A0027F7FC0095102FA09004 |
:1070B000C507B090C6072091B607332727FD309546 |
:1070C000A21AB30ACC24B7FCC094DC2C2091B407DC |
:1070D000332727FD3095621B730B882777FD80953A |
:1070E000982F882477FC8094982CA40193010E9407 |
:1070F000613C3B014C0189859A85AA2797FDA095A3 |
:10710000BA2F8D839E83AF83B887C201AA2797FDCC |
:10711000A095BA2F89839A83AB83BC83C801B7013A |
:107120002D813E814F8158850E94613C29813A81A1 |
:107130004B815C810E94613C20E034E040E050E003 |
:107140000E94D53C620E731E841E951E442437FC9B |
:107150004094542CC601B501A20191010E94613CEA |
:1071600029813A814B815C810E94613C20E034E0BE |
:1071700040E050E00E94D53C621A730A840A950AE6 |
:10718000C801B701A20191010E94613C7B018C0101 |
:10719000C601B5012D813E814F8158850E94613C19 |
:1071A000E60EF71E081F191FC801B70120E130E0E5 |
:1071B00040E050E00E94D53C79018A01C401B3014E |
:1071C00020E034E040E050E00E94D53CDA01C90103 |
:1071D000B7010E94153A9C0197FF05C0882799279F |
:1071E000821B930B04C088E691E0821B930BE2E1C3 |
:1071F000C65F0C940C3D8091BD07813041F0813019 |
:1072000018F0823049F51CC02A9A81E016C02A98ED |
:107210008091C007853011F481E305C0863011F4F8 |
:1072200082E301C083E38EBD88E090E00E94B00C51 |
:107230009093BF078093BE0782E08093BD070895B7 |
:107240008091BE079091BF070E94B90C882321F05E |
:107250001EBC83E08093BD070895A0E0B0E0E3E3A7 |
:10726000F9E30C94F23C299A809100018A3011F4E0 |
:10727000289801C0289AAA24BB2400E010E08824A2 |
:107280009924EE24FF2466247724CC24DD2462E3B1 |
:10729000462E55248091C1079091C20708171907FF |
:1072A0002CF40091C1071091C2070BC08091C10757 |
:1072B0009091C2078A159B0524F4A090C107B09055 |
:1072C000C2078091C3079091C407E816F9062CF411 |
:1072D000E090C307F090C4070BC08091C307909162 |
:1072E000C4078815990524F48090C3079090C407BB |
:1072F0008091C5079091C607C816D9062CF4C09096 |
:10730000C507D090C6070BC08091C5079091C607EE |
:107310008615970524F46090C5077090C607552020 |
:1073200081F485B191E0892785B985B192E08927FB |
:1073300085B982E390E09093C1038093C00352E348 |
:10734000552E8AE090E00E94B00CEC01CE010E9424 |
:10735000B90C8823D9F3E0913107FF27EE0FFF1F07 |
:10736000ED5FF84F80819181843691050CF44A9449 |
:10737000442011F05A948ECFC8018A199B0990932A |
:10738000B8078093B707C701881999099093BA077E |
:107390008093B907C601861997099093BC0780931B |
:1073A000BB07E4EBF7E0C8018A0D9B1D62E070E0CB |
:1073B0000E94A03C6093B407C701880D991D62E04C |
:1073C00070E00E94A03C6093B507C601860D971D32 |
:1073D00062E070E00E94A03C6093B60789E0A0E7FD |
:1073E000B1E0182E0E94463DE0E1CDB7DEB70C9427 |
:1073F0000E3D83ED8CBD84B1846A84B98091000117 |
:107400008A3019F4539A5B9802C03E9A469885E0F8 |
:107410008093C0071092BD0789E0E4EBF7E0A0E796 |
:10742000B1E0182E0E94353D08959C01892B31F45E |
:107430006115710519F480E090E0089577FD02C0B0 |
:1074400041E001C04FEF2115310529F48AE54802DA |
:10745000C00111240895CB01B9010E94A03CFB0199 |
:1074600077FF03C0F095E195FF4F81E0EA35F8071B |
:1074700030F4E05CFA4F8491682F772747C08CE1A5 |
:10748000E73AF80718F06AE570E040C089E0ED38A7 |
:10749000F80718F069E570E039C085E0EA3BF807C5 |
:1074A00018F068E570E032C084E0E731F80718F0C2 |
:1074B00067E570E02BC083E0EE32F80718F066E570 |
:1074C00070E024C082E0E939F80718F065E570E063 |
:1074D0001DC082E0E233F80718F064E570E016C0E2 |
:1074E00081E0E73EF80718F063E570E00FC081E047 |
:1074F000ED3AF80718F062E570E008C0EF57F14088 |
:1075000018F061E570E002C060E570E01216130645 |
:107510006CF4842F992787FD90959C01629FC00190 |
:10752000639F900D729F900D1124089514162CF4F2 |
:1075300084EB90E0861B970B0895CB01845B904011 |
:107540000895FC0197FD03C041E050E005C0F095AF |
:10755000E195FF4F4FEF5FEFEB35F1055CF0CF01A9 |
:107560008B5590408A35910540F484EB90E08E1B5A |
:107570009F0BFC0121E030E010C0CF01855B904003 |
:107580008A35910518F4E45BF04005C088E691E087 |
:107590008E1B9F0BFC012FEF3FEFEE0FFF1FE656F8 |
:1075A000F94F85919491BC01629FC001639F900D3A |
:1075B000729F900D11249C01429FC001439F900D2A |
:1075C000529F900D112408952AE530E0281B390BB5 |
:1075D000C9010E94A13A0895FC014150504030F089 |
:1075E00001900616D1F73197CF0108958827992782 |
:1075F00008955058192EEFD001D0D2C0BA176207A3 |
:10760000730784079507B1F188F40EF410940B2EDC |
:10761000BA2FA02D062E622F202D072E732F302D6E |
:10762000082E842F402D092E952F502DFF275523EE |
:10763000B9F0591B49F0573E98F046953795279574 |
:10764000A795F0405395C9F776F0BA0F621F731FE4 |
:10765000841F30F4879577956795B795F04093959B |
:1076600017FA0F2E0895BF1BBB27BA0B620B730BC3 |
:10767000840BF6CFDEF6DBC0AED001D091C055232F |
:1076800059F0992369F09F575F57951B33F442F4E3 |
:10769000903811F4915805C09BC091589F3F09F450 |
:1076A000C6C0BB27112462177307840730F4660F26 |
:1076B000771F881FBB1F915098F311D00F920FD0E6 |
:1076C0000F920DD0A0E82617370748071B0609F0D0 |
:1076D000A048BA2F602D7F918F9100240895A0E8D3 |
:1076E0000024621773078407B10528F0621B730B2F |
:1076F000840BB1090A2A660F771F881FBB1FA69546 |
:1077000081F7089597FB73D09F3738F0FEE9F91B96 |
:10771000982F872F762F6B2F05C086C0969587955B |
:1077200077956795F150D0F73EF4909580957095D8 |
:1077300061957F4F8F4F9F4F0895E89403C097FB4B |
:107740000EF4F3DFB62F672F782F892F9EE90024E0 |
:1077500027C00ED05EF004C00BD026F001C008D0C8 |
:1077600019F020F48FEF089580E0089581E00895E6 |
:1077700097FB092E052600F8689430D0E89407FCA2 |
:1077800007C0621773078407950721F008F4009477 |
:107790000794989408959A95BB0F661F771F881FCA |
:1077A00011249923A1F08823B2F79F3F59F0BB0F12 |
:1077B00048F421F4002011F460FF04C06F5F7F4F94 |
:1077C0008F4F9F4F881F9795879597F908952CC0E5 |
:1077D0009FEF80EC0895052E092607FA440F551FE8 |
:1077E0005F3F79F0AA27A51708F051E04795880F69 |
:1077F000991F9F3F31F0BB27B91708F091E087959B |
:1078000008959F919F911124E3CF97FB880F991FB3 |
:107810009F3F31F0BB27B91708F091E08795089595 |
:107820009F919F911124D4CF662777278827992786 |
:107830000895D1DF01D0B4CF992339F0552329F031 |
:107840009F575F57950F13F49AF1F1CF91589F3FCF |
:10785000E1F3629FA12D0F92BB27639FA00DB11D85 |
:10786000EE27729FA00DB11DEE1FAF93AA27649F54 |
:10787000B00DE11D739FB00DE11DAA1F6627829F09 |
:10788000B00DE11DA61F5527749FE00DA11D551FCA |
:10789000839FE00DA11D561F849FA00D511D852FB4 |
:1078A0007A2F6E2F1F900F9088231AF4939539F436 |
:1078B0008FCF000C111CBB1F661F771F881F01286C |
:1078C0000895629FD001739FF001829FE00DF11D2A |
:1078D000649FE00DF11D929FF00D839FF00D749F4A |
:1078E000F00D659FF00D9927729FB00DE11DF91FF6 |
:1078F000639FB00DE11DF91FBD01CF011124089553 |
:10790000991B79E004C0991F961708F0961B881FF1 |
:107910007A95C9F780950895AA1BBB1B51E107C052 |
:10792000AA1FBB1FA617B70710F0A61BB70B881F0F |
:10793000991F5A95A9F780959095BC01CD0108959E |
:1079400097FB092E07260AD077FD04D0E5DF06D085 |
:1079500000201AF4709561957F4F0895F6F7909581 |
:1079600081959F4F0895A1E21A2EAA1BBB1BFD0112 |
:107970000DC0AA1FBB1FEE1FFF1FA217B307E4070E |
:10798000F50720F0A21BB30BE40BF50B661F771F66 |
:10799000881F991F1A9469F7609570958095909546 |
:1079A0009B01AC01BD01CF01089597FB092E05266F |
:1079B0000ED057FD04D0D7DF0AD0001C38F4509504 |
:1079C0004095309521953F4F4F4F5F4F0895F6F703 |
:1079D00090958095709561957F4F8F4F9F4F08953B |
:1079E0002F923F924F925F926F927F928F929F92CF |
:1079F000AF92BF92CF92DF92EF92FF920F931F93BD |
:107A0000CF93DF93CDB7DEB7CA1BDB0B0FB6F8946D |
:107A1000DEBF0FBECDBF09942A88398848885F84AD |
:107A20006E847D848C849B84AA84B984C884DF801E |
:107A3000EE80FD800C811B81AA81B981CE0FD11D02 |
:107A40000FB6F894DEBF0FBECDBFED010895EE0F67 |
:107A5000FF1F0590F491E02D0994F999FECFB2BD76 |
:107A6000A1BDF89A119600B40895F7DF01921A9417 |
:107A7000E1F70895F999FECFB2BDA1BD00BC119602 |
:107A80000FB6F894FA9AF99A0FBE08950190F2DFB2 |
:087A90001A94E1F70895FFCFFD |
:107A98000A01FF64496E74656772616C4E69636BB5 |
:107AA80020202020496E74656772616C526F6C6C7F |
:107AB800202020204163634E69636B202020202012 |
:107AC80020202020416363526F6C6C2020202020EE |
:107AD800202020204779726F476965722020202076 |
:107AE80020202020486F6568656E576572742020D5 |
:107AF800202020204163635A20202020202020209D |
:107B080020202020476173202020202020202020B2 |
:107B1800202020204B6F6D7061737356616C756502 |
:107B2800202020205370616E6E756E672020202003 |
:107B380020202020456D7066616E6720202020205F |
:107B480020202020416E616C6F6731312020202079 |
:107B5800202020204D6F746F725F566F726E652003 |
:107B6800202020204D6F746F725F48696E74656EB7 |
:107B7800202020204D6F746F725F4C696E6B7320EC |
:107B8800202020204D6F746F725F52656368747394 |
:107B9800202020204163635F5A20202020202020BD |
:107BA800202020204D697474656C4163634E6963BD |
:107BB8006B2020204D697474656C416363526F6C4F |
:107BC8006C202020496E74656772616C4572724E34 |
:107BD80069636B20496E74656772616C4572725295 |
:107BE8006F6C6C204D697474656C496E744E696372 |
:107BF8006B2020204D697474656C496E74526F6CEB |
:107C08006C0920004E65757472616C4E69636B2057 |
:107C180020202020526F6C6C4F666673657420209C |
:107C280020202020496E74526F6C6C2A46616B7458 |
:107C38006F722020416E616C6F67323620202020E1 |
:107C480020202020446972656B74417573676C52FB |
:107C58006F6C6C204D65737377657274526F6C6CC2 |
:107C680020202020417573676C65696368526F6CCA |
:107C78006C202020492D4C616765526F6C6C202068 |
:107C880020202020537469636B526F6C6C20202075 |
:107C980020202020FFFF0A016400007D0000FF0370 |
:107CA8000102030405060708090A48616C6C6F2085 |
:107CB80057656C7400000000000000000000000020 |
:107CC80000000000000000000000000000000000AC |
:107CD800000000000000000000000000000000009C |
:107CE800000000000000000000000000000000008C |
:107CF800000000000000000000000D0142656769F7 |
:107D08006E6E657200004E6F726D616C000053708C |
:107D18006F72740000640090D0030090D0030017C5 |
:107D2800B7D13830FB103A409696020A644664ECA4 |
:027D3800FF0149 |
:00000001FF |
/branches/MicroMag3_Nick666/V0.68d/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/MicroMag3_Nick666/V0.68d/GPS.c |
---|
0,0 → 1,30 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/MicroMag3_Nick666/V0.68d/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/MicroMag3_Nick666/V0.68d/Settings.h |
---|
--- _Settings.h (nonexistent) |
+++ _Settings.h (revision 715) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 500 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/MicroMag3_Nick666/V0.68d/analog.c |
---|
0,0 → 1,147 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = acc_neutral.Y - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - acc_neutral.X; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - acc_neutral.Z; |
AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(acc_neutral.Z < 800) acc_neutral.Z+= 0.02; |
} |
else if(AdWertAccHoch < -1) |
{ |
if(acc_neutral.Z > 600) acc_neutral.Z-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/MicroMag3_Nick666/V0.68d/analog.h |
---|
0,0 → 1,24 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/MicroMag3_Nick666/V0.68d/compass.c |
---|
0,0 → 1,245 |
/* |
Copyright 2007, Niklas Nold |
This program (files compass.c and compass.h) is free software; you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; |
either version 3 of the License, or (at your option) any later version. |
This program 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. |
Please note: All the other files for the project "Mikrokopter" by H. Buss are under the license (license_buss.txt) published by www.mikrokopter.de |
*/ |
#include "main.h" |
struct MM3_calib_struct ee_calib EEMEM; // Reservierung im EEPROM |
struct MM3_working_struct MM3; |
struct MM3_calib_struct MM3_calib; |
//############################################################################ |
// Initialisierung |
void init_MM3(void) |
//############################################################################ |
{ |
// SPI-Schnittstelle initialisieren |
SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); // Interrupt an, Master, 156 kHz Oszillator |
DDRB |= (1<<PB7)|(1<<PB5)|(1<<PB2); // J8, MOSI, SCK Ausgang |
if(PlatinenVersion == 10) |
{ |
DDRD |= (1<<PD3); // PD3 als Ausgang |
PORTD &= ~(1<<PD3); // J5 permanent auf Low |
} |
else |
{ |
DDRC |= (1<<PC6); // PC6 als Ausgang |
PORTC &= ~(1<<PC6); // J9 permanent auf Low |
} |
// Init Statemachine |
MM3.AXIS = MM3_X; |
MM3.STATE = MM3_RESET; |
// Kalibrierung aus dem EEprom lesen |
eeprom_read_block(&MM3_calib,&ee_calib,sizeof(struct MM3_calib_struct)); |
} |
//############################################################################ |
// Wird in der SIGNAL (SIG_OVERFLOW0) aufgerufen |
void timer0_MM3(void) |
//############################################################################ |
{ |
switch (MM3.STATE) |
{ |
case MM3_RESET: |
PORTB |= (1<<PB2); // J8 auf High, MM3 Reset |
MM3.STATE = MM3_START_TRANSFER; |
return; |
case MM3_START_TRANSFER: |
PORTB &= ~(1<<PB2); // J8 auf Low (war ~125 µs auf High) |
if (MM3.AXIS == MM3_X) SPDR = 0x31; // Schreiben ins SPDR löst automatisch SPI-Übertragung (MOSI und MISO) aus |
else if (MM3.AXIS == MM3_Y) SPDR = 0x32; // Micromag Period Select ist auf 256 (0x30) |
else SPDR = 0x33; //if (MM3.AXIS == MM3_Z) // 1: x-Achse, 2: Y-Achse, 3: Z-Achse |
MM3.DRDY = SetDelay(8); // Laut Datenblatt max. Zeit bis Messung fertig (bei PS 256 eigentlich 4 ms) |
MM3.STATE = MM3_WAIT_DRDY; |
return; |
case MM3_WAIT_DRDY: |
if (CheckDelay(MM3.DRDY)) {SPDR = 0x00;MM3.STATE = MM3_DRDY;} // Irgendwas ins SPDR, damit Übertragung ausgelöst wird, wenn Wartezeit vorbei |
return; // Jetzt gehts weiter in SIGNAL (SIG_SPI) |
} |
} |
//############################################################################ |
// SPI byte ready |
SIGNAL (SIG_SPI) |
//############################################################################ |
{ |
static char tmp; |
int wert; |
switch (MM3.STATE) |
{ |
case MM3_DRDY: // 1. Byte ist da, zwischenspeichern |
tmp = SPDR; |
SPDR = 0x00; // Übertragung von 2. Byte auslösen |
MM3.STATE = MM3_BYTE2; |
return; |
case MM3_BYTE2: // 2. Byte der entsprechenden Achse ist da |
wert = tmp; |
wert <<= 8; // 1. Byte an MSB-Stelle rücken |
wert |= SPDR; // 2. Byte dranpappen |
if(abs(wert) < Max_Axis_Value) // Spikes filtern. Zuweisung nur, wenn Max-Wert nicht überschritten |
switch (MM3.AXIS) |
{ |
case MM3_X: |
MM3.x_axis = wert; |
MM3.AXIS = MM3_Y; |
break; |
case MM3_Y: |
MM3.y_axis = wert; |
MM3.AXIS = MM3_Z; |
break; |
default: //case MM3_Z: |
MM3.z_axis = wert; |
MM3.AXIS = MM3_X; |
} |
MM3.STATE = MM3_RESET; |
} |
} |
//############################################################################ |
// Kompass kalibrieren |
void calib_MM3(void) |
//############################################################################ |
{ |
signed int x_min=0,x_max=0,y_min=0,y_max=0,z_min=0,z_max=0; |
uint8_t measurement=50,beeper=0; |
unsigned int timer; |
GRN_ON; |
ROT_OFF; |
while (measurement) |
{ |
//H_earth = MM3.x_axis*MM3.x_axis + MM3.y_axis*MM3.y_axis + MM3.z_axis*MM3.z_axis; |
if (MM3.x_axis > x_max) x_max = MM3.x_axis; |
else if (MM3.x_axis < x_min) x_min = MM3.x_axis; |
if (MM3.y_axis > y_max) y_max = MM3.y_axis; |
else if (MM3.y_axis < y_min) y_min = MM3.y_axis; |
if (MM3.z_axis > z_max) z_max = MM3.z_axis; |
else if (MM3.z_axis < z_min) z_min = MM3.z_axis; |
if (!beeper) |
{ |
ROT_FLASH; |
GRN_FLASH; |
beeptime = 50; |
beeper = 50; |
} |
beeper--; |
// Schleife mit 100 Hz |
timer = SetDelay(10); |
while(!CheckDelay(timer)); |
// Wenn Gas zurück genommen wird, Kalibrierung mit 1/2 Sekunde Verzögerung beenden |
if (PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 100) measurement--; |
} |
// Wertebereich der Achsen |
MM3_calib.X_range = (x_max - x_min); |
MM3_calib.Y_range = (y_max - y_min); |
MM3_calib.Z_range = (z_max - z_min); |
// Offset der Achsen |
MM3_calib.X_off = (x_max + x_min) /2; |
MM3_calib.Y_off = (y_max + y_min) /2; |
MM3_calib.Z_off = (z_max + z_min) /2; |
// und im EEProm abspeichern |
eeprom_write_block(&MM3_calib,&ee_calib,sizeof(struct MM3_calib_struct)); |
} |
//############################################################################ |
// Neigungskompensierung und Berechnung der Ausrichtung |
int heading_MM3(void) |
//############################################################################ |
{ |
signed int sin_nick, cos_nick, sin_roll, cos_roll; |
long x_axis, y_axis, z_axis; |
long x_corr, y_corr; |
signed int heading; |
int8_t nicktilt,rolltilt; |
unsigned int div_faktor; |
div_faktor = (uint16_t)EE_Parameter.UserParam3 *8; |
// Berechung von sinus und cosinus |
nicktilt = (IntegralNick/div_faktor); |
sin_nick = sin_i(nicktilt); |
cos_nick = cos_i(nicktilt); |
rolltilt = (IntegralRoll/div_faktor); |
sin_roll = sin_i(rolltilt); |
cos_roll = cos_i(rolltilt); |
// Offset |
x_axis = (MM3.x_axis - MM3_calib.X_off); |
y_axis = (MM3.y_axis - MM3_calib.Y_off); |
z_axis = (MM3.z_axis - MM3_calib.Z_off); |
/* |
// Normierung Wertebereich |
if ((MM3_calib.X_range > MM3_calib.Y_range) && (MM3_calib.X_range > MM3_calib.Z_range)) |
{ |
y_axis = (y_axis * MM3_calib.X_range) / MM3_calib.Y_range; |
z_axis = (z_axis * MM3_calib.X_range) / MM3_calib.Z_range; |
} |
else if ((MM3_calib.Y_range > MM3_calib.X_range) && (MM3_calib.Y_range > MM3_calib.Z_range)) |
{ |
x_axis = (x_axis * MM3_calib.Y_range) / MM3_calib.X_range; |
z_axis = (z_axis * MM3_calib.Y_range) / MM3_calib.Z_range; |
} |
else //if ((MM3_calib.Z_range > MM3_calib.X_range) && (MM3_calib.Z_range > MM3_calib.Y_range)) |
{ |
x_axis = (x_axis * MM3_calib.Z_range) / MM3_calib.X_range; |
y_axis = (y_axis * MM3_calib.Z_range) / MM3_calib.Y_range; |
} |
*/ |
// Neigungskompensierung |
x_corr = x_axis * cos_nick; |
x_corr += (y_axis * sin_roll * sin_nick) /1024; |
x_corr -= (z_axis * cos_roll * sin_nick) /1024; |
x_corr /= 1024; |
y_corr = y_axis * cos_roll; |
y_corr += z_axis * sin_roll; |
y_corr /= 16; |
// Winkelberechnung |
heading = atan2_i(x_corr, y_corr); |
// Skalieren von +-180° auf 0-360° |
if (heading < 0) heading = -heading; |
else heading = 360 - heading; |
return (heading); |
} |
/branches/MicroMag3_Nick666/V0.68d/compass.h |
---|
0,0 → 1,44 |
struct MM3_working_struct |
{ |
uint8_t STATE; |
unsigned int DRDY; |
uint8_t AXIS; |
volatile signed int x_axis; |
volatile signed int y_axis; |
volatile signed int z_axis; |
}; |
struct MM3_calib_struct |
{ |
int8_t X_off; |
int8_t Y_off; |
int8_t Z_off; |
int16_t X_range; |
int16_t Y_range; |
int16_t Z_range; |
}; |
extern struct MM3_working_struct MM3; |
extern struct MM3_calib_struct MM3_calib; |
void init_MM3(void); |
void timer0_MM3(void); |
void calib_MM3(void); |
int heading_MM3(void); |
#define Max_Axis_Value 500 |
// Die Werte der Statemachine |
#define MM3_RESET 0 |
#define MM3_START_TRANSFER 1 |
#define MM3_WAIT_DRDY 2 |
#define MM3_DRDY 3 |
#define MM3_BYTE2 4 |
#define MM3_X 5 |
#define MM3_Y 6 |
#define MM3_Z 7 |
#define MM3_TILT 8 |
#define MM3_IDLE 9 |
/branches/MicroMag3_Nick666/V0.68d/eeprom.c |
---|
0,0 → 1,182 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 32 * 4; //zur freien Verwendung |
EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 2; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 140; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/MicroMag3_Nick666/V0.68d/fc.c |
---|
0,0 → 1,1132 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
float GyroFaktor; |
float IntegralFaktor; |
volatile int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
float Ki = FAKTOR_I; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
struct mk_param_struct EE_Parameter; |
struct acc_neutral_struct ee_acc_neutral EEMEM; // Reservierung im EEPROM |
struct acc_neutral_struct acc_neutral; |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Neutrallage kalibrieren und fest im EEPROM abspeichern |
void calib_acc(void) |
//############################################################################ |
{ |
acc_neutral.X = 0; |
acc_neutral.Y = 0; |
acc_neutral.Z = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
acc_neutral.X = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
acc_neutral.Y = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
acc_neutral.Z = Aktuell_az; |
eeprom_write_block(&acc_neutral,&ee_acc_neutral,sizeof(struct acc_neutral_struct)); |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
acc_neutral.X = 0; |
acc_neutral.Y = 0; |
acc_neutral.Z = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
eeprom_read_block(&acc_neutral,&ee_acc_neutral,sizeof(struct acc_neutral_struct)); |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
ExternHoehenValue = 0; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
//DebugOut.Analog[26] = MesswertNick; |
DebugOut.Analog[28] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
IntegralAccZ += Aktuell_az - acc_neutral.Z; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
Mess_Integral_Gier2 += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = Mess_IntegralNick / 4096L; |
tmpl *= MesswertGier; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 2048L; |
tmpl2 = Mess_IntegralRoll / 4096L; |
tmpl2 *= MesswertGier; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 2048L; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(AdWertRoll < 15) MesswertRoll = -1000; |
if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertRoll > 1010) MesswertRoll = +1000; |
if(AdWertRoll > 1017) MesswertRoll = +2000; |
} |
else |
{ |
if(AdWertRoll > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(AdWertNick < 15) MesswertNick = -1000; |
if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +1000; |
if(AdWertNick > 1017) MesswertNick = +2000; |
} |
else |
{ |
if(AdWertNick > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(MOTOR_OFF || !MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
} |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
Ki = (float)Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static unsigned int modell_fliegt = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 1; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < 0) GasMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 2000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 200) || (GasMischanteil < 40)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting); // aktiven Datensatz merken |
} |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], sizeof(struct mk_param_struct)); |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
int tmp_int; |
ParameterZuordnung(); |
StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick) |
MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--; |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll) |
MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Digitale Steuerung per DubWise |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define KEY_VALUE (Parameter_UserParam1 * 4) //(Poti3 * 8) |
if(DubWiseKeys[1]) beeptime = 10; |
if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickNick = (ExternStickNick * 7 + tmp_int) / 8; |
if(DubWiseKeys[1] & DUB_KEY_LEFT) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_RIGHT) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickRoll = (ExternStickRoll * 7 + tmp_int) / 8; |
if(DubWiseKeys[0] & 8) ExternStickGier = 50;else |
if(DubWiseKeys[0] & 4) ExternStickGier =-50;else ExternStickGier = 0; |
if(DubWiseKeys[0] & 2) ExternHoehenValue++; |
if(DubWiseKeys[0] & 16) ExternHoehenValue--; |
StickNick += ExternStickNick / 8; |
StickRoll += ExternStickRoll / 8; |
StickGier += ExternStickGier; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_UserParam1 > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) {Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll) beeptime = 100; |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 0.1; |
IntegralFaktor = 0.005; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll) |
{ |
long tmp_long, tmp_long2; |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 15) || (MaxStickRoll > 15)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if((MaxStickNick > 15) || (MaxStickRoll > 15) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturNick /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
DebugOut.Analog[21] = MittelIntegralNick / 26; |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[28] = ausgleichNick; |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} else cnt = 0; |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
DebugOut.Analog[27] = ausgleichRoll; |
DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} |
//DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(abs(StickGier) > 20) // war 35 |
{ |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
} |
tmp_int = (long)EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
int w,v; |
static uint8_t updKompass = 0; |
if (!updKompass--) // Aufruf mit ~10 Hz |
{ |
KompassValue = heading_MM3(); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
updKompass = 50; |
} |
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 < 35 && NeueKompassRichtungMerken) |
{ |
KompassStartwert = KompassValue; |
NeueKompassRichtungMerken = 0; |
} |
w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w > 0) |
{ |
Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[2] = Mittelwert_AccNick; |
DebugOut.Analog[3] = Mittelwert_AccRoll; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] =(Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[16] = Mittelwert_AccHoch; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[26] = MesswertNick; |
//DebugOut.Analog[28] = MesswertRoll; |
if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
DebugOut.Analog[25] = IntegralRoll * IntegralFaktor; |
DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor); |
DebugOut.Analog[28] = MesswertRoll; |
// Maximalwerte abfangen |
#define MAX_SENSOR 2048 |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//OCR0B = 180 - (Poti1 + 120) / 4; |
//DruckOffsetSetting = OCR0B; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
} |
else |
HoehenReglerAktiv = 1; |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
if(tmp_int > 50) tmp_int = 50; |
else if(tmp_int < -50) tmp_int = -50; |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > MAX_GAS - 20) GasMischanteil = MAX_GAS - 20; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
// GierMischanteil = 0; |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
if(GierMischanteil > ((MAX_GAS - GasMischanteil))) GierMischanteil = ((MAX_GAS - GasMischanteil)); |
if(GierMischanteil < -((MAX_GAS - GasMischanteil))) GierMischanteil = -((MAX_GAS - GasMischanteil)); |
if(GasMischanteil < 20) GierMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - (StickNick - GPS_Nick); // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - (StickNick - GPS_Nick); // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > 16000) SummeNick = 16000; |
if(SummeNick < -16000) SummeNick = -16000; |
pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - (StickRoll - GPS_Roll); // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - (StickRoll - GPS_Roll);// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > 16000) SummeRoll = 16000; |
if(SummeRoll < -16000) SummeRoll = -16000; |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
#define GRENZE Poti1 |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/MicroMag3_Nick666/V0.68d/fc.h |
---|
0,0 → 1,148 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Hoch; |
extern long Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll,IntegralAccZ; |
extern long Integral_Gier; |
extern int HoehenWert; |
extern int SollHoehe; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern unsigned char MotorWert[5]; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
struct acc_neutral_struct |
{ |
volatile int X; |
volatile int Y; |
volatile float Z; |
}; |
extern struct acc_neutral_struct acc_neutral; |
extern void calib_acc(void); |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
#endif //_FC_H |
/branches/MicroMag3_Nick666/V0.68d/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="fc.c"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="compass.c"></File><File path="compass.h"></File><File path="mymath.c"></File><File path="mymath.h"></File></Project> |
/branches/MicroMag3_Nick666/V0.68d/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/MicroMag3_Nick666/V0.68d/gps.h |
---|
0,0 → 1,14 |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/MicroMag3_Nick666/V0.68d/main.c |
---|
0,0 → 1,262 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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" |
// Reservierung im EEPROM |
unsigned char EEPromArray[10] EEMEM; |
struct mk_param_struct EEParameterArray[5] 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; |
number--; // Auf Index 0 bis 4 anpassen |
eeprom_read_block(buffer, &EEParameterArray[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; |
number--; // Auf Index 0 bis 4 anpassen |
eeprom_write_block(buffer, &EEParameterArray[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(); |
init_MM3(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 69 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], sizeof(struct mk_param_struct)); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], sizeof(struct mk_param_struct)); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
//kurze Wartezeit (sonst reagiert die "Kompass kalibrieren?"-Abfrage nicht |
timer = SetDelay(500); |
while(!CheckDelay(timer)); |
//Kompass kalibrieren? |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 100 && PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 100) |
{ |
printf("\n\rKalibriere Kompass"); |
calib_MM3(); |
} |
//Neutrallage kalibrieren? |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 100 && PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -100) |
{ |
printf("\n\rKalibriere Neutrallage"); |
calib_acc(); |
} |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
DubWiseKeys[0] = 0; |
DubWiseKeys[1] = 0; |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
if(SIO_DEBUG && !UpdateMotor) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
timer = SetDelay(100); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
} |
} |
return (1); |
} |
/branches/MicroMag3_Nick666/V0.68d/main.h |
---|
0,0 → 1,95 |
#ifndef _MAIN_H |
#define _MAIN_H |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if(PlatinenVersion == 10) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if(PlatinenVersion == 10) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
extern unsigned char PlatinenVersion; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "compass.h" |
#include "mymath.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/MicroMag3_Nick666/V0.68d/makefile |
---|
0,0 → 1,423 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 68 |
VERSION_INDEX = 3 |
VERSION_KOMPATIBEL = 7 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
ifeq ($(VERSION_INDEX), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)g |
endif |
ifeq ($(VERSION_INDEX), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)h |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c |
SRC += compass.c mymath.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 \ |
-mtiny-stack -mcall-prologues \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/MicroMag3_Nick666/V0.68d/menu.c |
---|
0,0 → 1,145 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 = 13,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); RemotePollDisplayLine = -1; } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); RemotePollDisplayLine = -1;} |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier/2); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,acc_neutral.X); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,acc_neutral.Y); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch,(int)acc_neutral.Z); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 12: |
LCD_printfxy(0,0,"MM3 Off"); |
LCD_printfxy(0,1,"X_Offset: %3i",MM3_calib.X_off); |
LCD_printfxy(0,2,"Y_Offset: %3i",MM3_calib.Y_off); |
LCD_printfxy(0,3,"Z_Offset: %3i",MM3_calib.Z_off); |
break; |
case 13: |
LCD_printfxy(0,0,"MM3 Range"); |
LCD_printfxy(0,1,"X_Range: %4i",MM3_calib.X_range); |
LCD_printfxy(0,2,"Y_Range: %4i",MM3_calib.Y_range); |
LCD_printfxy(0,3,"Z_Range: %4i",MM3_calib.Z_range); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/MicroMag3_Nick666/V0.68d/menu.h |
---|
0,0 → 1,6 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/branches/MicroMag3_Nick666/V0.68d/mymath.c |
---|
0,0 → 1,111 |
/* |
Copyright 2007, Niklas Nold |
This program (files math.c and math.h) is free software; you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; |
either version 3 of the License, or (at your option) any later version. |
This program 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. |
Please note: All the other files for the project "Mikrokopter" by H. Buss are under the license (license_buss.txt) published by www.mikrokopter.de |
*/ |
#include "main.h" |
const uint8_t pgm_atan[346] PROGMEM = {0,1,2,3,4,4,5,6,7,8,9,10,11,11,12,13,14,15,16,17,17,18,19,20,21,21,22,23,24,24,25,26,27,27,28,29,29,30,31,31,32,33,33,34,35,35,36,36,37,37,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,45,46,46,47,47,48,48,48,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,55,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,60,61,61,61,61,62,62,62,62,62,63,63,63,63,63,63,64,64,64,64,64,64,65,65,65,65,65,65,66,66,66,66,66,66,66,67,67,67,67,67,67,67,68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69,70,70,70,70,70,70,70,70,70,71,71,71,71,71,71,71,71,71,71,71,72,72,72,72,72,72,72,72,72,72,72,73,73,73,73,73,73,73,73,73,73,73,73,73,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79}; |
//############################################################################ |
// Arkustangens2 im Gradmaß |
signed int atan2_i(signed int x, signed int y) |
//############################################################################ |
{ |
int16_t angle; |
uint16_t i; |
int8_t m; |
if (!x && !y) return 0; //atan2 = 0 für x und y = 0 |
if (y < 0) m=-1; |
else m=1; |
if (!x) return (90*m); // atan2 = 90° für x = 0 |
i = abs(y / x); // Berechne i für die Lookup table (Schrittweite atan(x) ist 0,015625 -> y *64) |
if (i<346) angle = pgm_read_byte(&pgm_atan[i]); // Lookup für 1° bis 79° |
else if (i>7334) angle = 90; // Grenzwert ist 90° |
else if (i>2444) angle = 89; // 89° bis 80° über Wertebereiche |
else if (i>1465) angle = 88; |
else if (i>1046) angle = 87; |
else if (i>813) angle = 86; |
else if (i>664) angle = 85; |
else if (i>561) angle = 84; |
else if (i>486) angle = 83; |
else if (i>428) angle = 82; |
else if (i>382) angle = 81; |
else angle = 80; // (i>345) |
if (x > 0) return (angle*m); // Quadrant I und IV |
else if ((x < 0) && (m > 0)) return (-angle + 180); // Quadrant II |
else return (angle - 180); // x < 0 && y < 0 Quadrant III |
} |
const uint16_t pgm_sinus_i[91] PROGMEM = {0,18,36,54,71,89,107,125,143,160,178,195,213,230,248,265,282,299,316,333,350,367,384,400,416,433,449,465,481,496,512,527,543,558,573,587,602,616,630,644,658,672,685,698,711,724,737,749,761,773,784,796,807,818,828,839,849,859,868,878,887,896,904,912,920,928,935,943,949,956,962,968,974,979,984,989,994,998,1002,1005,1008,1011,1014,1016,1018,1020,1022,1023,1023,1024,1024}; |
//############################################################################ |
// Kosinusfunktion im Gradmaß |
signed int cos_i(signed int winkel) |
//############################################################################ |
{ |
return (sin_i(90-winkel)); |
} |
//############################################################################ |
// Sinusfunktion im Gradmaß |
signed int sin_i(signed int winkel) |
//############################################################################ |
{ |
short int m,n; |
signed int sinus; |
if (winkel < 0) |
{ |
m = -1; |
winkel = abs(winkel); |
} |
else m = +1; |
// Quadranten auswerten |
if (winkel <= 90) n=1; |
else if ((winkel > 90) && (winkel <= 180)) {winkel = 180 - winkel; n = 1;} |
else if ((winkel > 180) && (winkel <= 270)) {winkel = winkel - 180; n = -1;} |
else {winkel = 360 - winkel; n = -1;} //if ((winkel > 270) && (winkel <= 360)) |
sinus = pgm_read_word(&pgm_sinus_i[winkel]); |
return (sinus*m*n); |
} |
/* |
const uint8_t pgm_asin[201] PROGMEM = {0,0,1,1,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,14,15,15,15,16,16,16,17,17,17,17,18,18,18,19,19,19,20,20,20,20,21,21,21,22,22,22,23,23,23,24,24,24,25,25,25,25,26,26,26,27,27,27,28,28,28,29,29,29,30,30,30,31,31,31,32,32,32,33,33,33,34,34,34,35,35,35,36,36,37,37,37,38,38,38,39,39,39,40,40,41,41,41,42,42,42,43,43,44,44,44,45,45,46,46,46,47,47,48,48,49,49,49,50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,62,62,63,64,64,65,66,66,67,68,68,69,70,71,72,73,74,75,76,77,79,80,82,84,90}; |
//############################################################################ |
// Akurssinusfunktion im Gradmaß |
int8_t asin_i(signed int i) |
//############################################################################ |
{ |
signed char m; |
if (i < 0) {m=-1;i=abs(i);} |
else m=1; |
i %= 200; |
return (pgm_read_byte(&pgm_asin[i]) * m); |
} |
*/ |
/branches/MicroMag3_Nick666/V0.68d/mymath.h |
---|
0,0 → 1,8 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
extern signed int atan2_i(signed int x, signed int y); |
extern signed int cos_i(signed int winkel); |
extern signed int sin_i(signed int winkel); |
//extern int8_t asin_i(signed int i); |
/branches/MicroMag3_Nick666/V0.68d/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/MicroMag3_Nick666/V0.68d/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/MicroMag3_Nick666/V0.68d/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/MicroMag3_Nick666/V0.68d/rc.c |
---|
0,0 → 1,86 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
// if((signal > (int) Parameter_UserParam2 * 10) && (signal < 8000)) |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
// tmp = (7 * (PPM_in[index]) + signal) / 8; |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/MicroMag3_Nick666/V0.68d/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/MicroMag3_Nick666/V0.68d/spi.c |
---|
0,0 → 1,113 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
ToNaviCtrl.Sync1 = 0x81; |
ToNaviCtrl.Sync2 = 0x55; |
ToNaviCtrl.Comp = 12; |
ToNaviCtrl.IntegralNick = 12345; |
ToNaviCtrl.IntegralRoll = 56789; |
ToNaviCtrl.StickNick = 100; |
ToNaviCtrl.StickRoll = 150;//(char) StickRoll; |
ToNaviCtrl.StickGier = 200;//(char) StickGier; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
/* DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
*/ |
//---- |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
ToNaviCtrl.ChkSum = ToNaviCtrl.Sync1; |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ |
SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
// if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex]; |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = Ptr_buffer[SPI_BufferIndex]; |
ToNaviCtrl.ChkSum += Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
SPITransferCompleted = 1; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
/*static unsigned char i =0; |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = 4; |
ToNaviCtrl.StickRoll = 5;//(char) StickRoll; |
ToNaviCtrl.StickGier = 6;//(char) StickGier; |
sei(); |
*/ |
} |
#endif |
/branches/MicroMag3_Nick666/V0.68d/spi.h |
---|
0,0 → 1,89 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
//#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
unsigned char ChkSum; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned int Dummy; |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/MicroMag3_Nick666/V0.68d/timer0.c |
---|
0,0 → 1,143 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 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) // 9,8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
if(!cnt--) |
{ |
cnt = 10; |
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) timer0_MM3(); // Kompass auslesen |
} |
void Timer_Init(void) |
{ |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/MicroMag3_Nick666/V0.68d/timer0.h |
---|
0,0 → 1,15 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
/branches/MicroMag3_Nick666/V0.68d/twimaster.c |
---|
0,0 → 1,134 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 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 |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
//Stop 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); |
} |
//############################################################################ |
//Write to I2C |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
// I2C receive byte and send ACK |
void i2c_receive_byte(void) |
//############################################################################ |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
//############################################################################ |
// I2C receive last byte and send NOT ACK |
void i2c_receive_last_byte(void) |
//############################################################################ |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char motorread = 0; |
switch (twi_state++) // First i2c_start from SendMotorData() |
{ |
// Master Transmit |
case 0: // Address Slave SL+W |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: // Send Data |
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: // Repeat case 0+1 for all Slaves |
if (motor < 4) twi_state = 0; |
i2c_start(); // Repeated start -> switch salve or switch Master Transmit -> Master Receive |
break; |
// Master Receive |
case 3: // Address Slave SL+R |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: //1. Byte vom Motor übertragen |
i2c_receive_byte(); |
break; |
case 5: // 1. Byte lesen und 2. Byte übertragen |
motor_rx[motorread] = TWDR; |
i2c_receive_last_byte(); |
break; |
case 6: //2. Byte lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread > 3) motorread=0; |
default: |
i2c_stop(); |
twi_state = 0; |
I2CTimeout = 10; |
motor = 0; |
} |
} |
/branches/MicroMag3_Nick666/V0.68d/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/MicroMag3_Nick666/V0.68d/uart.c |
---|
0,0 → 1,402 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char RemotePollDisplayLine = 0; |
unsigned char NurKanalAnforderung = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char DubWiseKeys[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Empfang ", //10 |
"Analog11 ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
"Acc_Z ", |
"MittelAccNick ", |
"MittelAccRoll ", |
"IntegralErrNick ", |
"IntegralErrRoll ", //20 |
"MittelIntNick ", |
"MittelIntRoll ", |
"NeutralNick ", |
"RollOffset ", |
"IntRoll*Faktor ", //25 |
"Analog26 ", |
"DirektAusglRoll ", |
"MesswertRoll ", |
"AusgleichRoll ", |
"I-LageRoll ", //30 |
"StickRoll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char SioTmp; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(buf_ptr == 0) |
{ |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) buf_ptr = 1; // Startzeichen und Daten schon verarbeitet |
RxdBuffer[0] = SioTmp; |
crc = SioTmp; |
} |
#if 0 |
else if ((buf_ptr == 1) // Adresse auswerten |
{ |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
} |
#endif |
else if (/*(buf_ptr > 0) && */(buf_ptr < MAX_EMPFANGS_BUFF)) |
{ // Eingangsdaten sammeln |
if(SioTmp != '\r') |
{ |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
} |
else |
{ |
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])) |
{ |
if(!NeuerDatensatzEmpfangen) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else { CntCrcError++;} |
buf_ptr = 0; |
} |
} |
else |
{ |
buf_ptr = 0; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
// unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'a':// Texte der Analogwerte |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
DebugTextAnforderung = tmp_char_arr2[0]; |
break; |
case 'b': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
break; |
case 'c': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
ConfirmFrame = DubWiseKeys[3]; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], sizeof(struct mk_param_struct)); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],sizeof(struct mk_param_struct)); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],sizeof(struct mk_param_struct)); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],sizeof(struct mk_param_struct),3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], sizeof(struct mk_param_struct)); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &ExternControl,sizeof(ExternControl)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A',DebugTextAnforderung + '0',(unsigned char *) ANALOG_TEXT[DebugTextAnforderung],16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz ohne CRC bestätigen |
{ |
SendeBuffer[0] = '#'; |
SendeBuffer[1] = ConfirmFrame; |
SendeBuffer[2] = '\r'; |
UebertragungAbgeschlossen = 0; |
ConfirmFrame = 0; |
UDR = SendeBuffer[0]; |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++RemotePollDisplayLine == 4 || NurKanalAnforderung) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
RemotePollDisplayLine = -1; |
} |
else SendOutData('0' + RemotePollDisplayLine,0,(unsigned char *)&DisplayBuff[20 * RemotePollDisplayLine],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/MicroMag3_Nick666/V0.68d/uart.h |
---|
0,0 → 1,107 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
#define DUB_KEY_UP 4 |
#define DUB_KEY_DOWN 8 |
#define DUB_KEY_RIGHT 32 |
#define DUB_KEY_LEFT 16 |
#define DUB_KEY_FIRE 64 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
extern unsigned char DubWiseKeys[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/MicroMag3_Nick666/V0.68d/version.txt |
---|
0,0 → 1,116 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |