/branches/salvo_gps/Basis_v0070d/tags/Flight-Ctrl_MEGA644_V0_7e.hex |
---|
0,0 → 1,2655 |
:100000000C94C2020C94DF020C94DF020C94DF0209 |
:100010000C94DF020C94DF020C94DF020C94DF02DC |
:100020000C94DF020C94CF0E0C94DF020C94B00EF3 |
:100030000C94511B0C94DF020C94DF020C94DF0231 |
:100040000C94DF020C94DF020C942C0D0C94DF0254 |
:100050000C943B090C94DF020C94A0050C94DF0275 |
:100060000C94D50F0C94DF020C94861A0C94DF02CA |
:10007000A31AAA1ABE1ACB1AD81AD01AD81AEA1A70 |
:10008000141BFB1AFF1A1F1B091B141B021B061B48 |
:100090001F1B091B141B181B1C1B1F1B231B0A0ADD |
:1000A0000D004E65757472616C0048656164696E1F |
:1000B00067486F6C64000A0D537465756572756EE0 |
:1000C000673A20004F4B0A0D000A0D4162676C65CC |
:1000D000696368204C756674647275636B73656ED2 |
:1000E000736F722E2E000A0D42656E75747A65204C |
:1000F000506172616D657465727361747A202564F4 |
:10010000000A0D414343206E696368742061626791 |
:1001100065676C696368656E21000A0D496E6974D4 |
:100120002E20454550524F4D3A2047656E65726905 |
:100130006572652044656661756C742D50617261ED |
:100140006D657465722E2E2E000A0D3D3D3D3D3DC0 |
:100150003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DCF |
:100160003D3D3D3D3D3D3D3D3D000A0D466C6967D1 |
:100170006874436F6E74726F6C0A0D4861726477B5 |
:100180006172653A25642E25640A0D536F66747793 |
:100190006172653A5625642E2564256320002E0081 |
:1001A00048693A253469202043663A25346920009D |
:1001B00047733A253469202047693A25346920007D |
:1001C0004E693A2534692020526F3A25346920005F |
:1001D00045787465726E436F6E74726F6C20200088 |
:1001E00052616E67653A2533692D25336900537472 |
:1001F000656C6C756E673A202533690053657470C1 |
:100200006F696E74202025336900536572766F2004 |
:100210002000506F7469343A202025336900506FF4 |
:100220007469333A202025336900506F7469323A7B |
:10023000202025336900506F7469313A202025331E |
:10024000690053746172743A20202020202535699A |
:10025000004D657373776572743A20202535690007 |
:100260005269636874756E673A2020253569004BC2 |
:100270006F6D706173732020202020202000456D59 |
:1002800070662E506567656C3A253569005370615C |
:100290006E6E756E673A202025356900486F636879 |
:1002A0002025346920282533692900526F6C6C2081 |
:1002B000253469202825336929004E69636B202580 |
:1002C000346920282533692900414343202D2053D8 |
:1002D000656E736F72004769657220253469202846 |
:1002E00025336929282533692900526F6C6C202534 |
:1002F00034692028253369292825336929004E6966 |
:10030000636B202534692028253369292825336922 |
:100310002900476965722025346920282533692919 |
:1003200000526F6C6C202534692028253369290020 |
:100330004E69636B202534692028253369290047DD |
:100340006965722025346920282533692900526F98 |
:100350006C6C20253469202825336929004E696397 |
:100360006B20253469202825336929004779726F6D |
:10037000202D2053656E736F720050333A25346917 |
:10038000202050343A253469200050313A25346910 |
:10039000202050323A253469200047733A253469C9 |
:1003A000202047693A25346920004E693A2534698E |
:1003B0002020526F3A25346920004B373A253469A2 |
:1003C00020204B383A25346920004B353A253469D2 |
:1003D00020204B363A25346920004B333A253469C6 |
:1003E00020204B343A25346920004B313A253469BA |
:1003F00020204B323A25346920004B6F6D706173B9 |
:10040000733A20202025356900526F6C6C3A202009 |
:1004100020202020253569004E69636B3A2020207A |
:1004200020202025356900616B742E204C616765A2 |
:100430000048F668656E726567656C756E67004B9F |
:1004400065696E6520004F66662020202020203AD6 |
:1004500020253569004C756674647275636B3A20AB |
:1004600025356900536F6C6C486F6568653A2025C7 |
:10047000356900486F6568653A20202020202535C1 |
:10048000690028632920486F6C6765722042757384 |
:10049000730053657474696E673A202564200048C0 |
:1004A000573A5625642E25642053573A25642E2545 |
:1004B000642563002B204D696B726F4B6F70746500 |
:1004C00072202B005B25695D005B25695D000000E3 |
:1004D0001100230034004600570069007A008B00A9 |
:1004E0009C00AE00BF00D000E100F2000301140147 |
:1004F0002401350146015601660177018701970104 |
:10050000A701B601C601D501E501F40103021202FB |
:1005100021022F023E024C025A0268027502830237 |
:1005200090029D02AA02B702C302CF02DB02E702D9 |
:10053000F302FE02090314031F03290333033D03DF |
:1005400047035003590362036B0373037B03830365 |
:100550008A03920399039F03A603AC03B203B70374 |
:10056000BC03C103C603CA03CE03D203D603D90317 |
:10057000DC03DE03E103E303E403E603E703E7034D |
:10058000E803E80311241FBECFEFD0E1DEBFCDBFEB |
:1005900013E0A0E0B1E0ECE1F3EA02C005900D92B7 |
:1005A000A43BB107D9F719E0A4EBB3E001C01D9259 |
:1005B000A434B107E1F70E9476030C948C510C949B |
:1005C00000009C01F999FECF32BD21BDF89A80B59B |
:1005D00008959C01F999FECF1FBA32BD21BD60BDBF |
:1005E0000FB6F894FA9AF99A0FBE0895F999FECFCA |
:1005F00022E030E032BD21BDF89A80B5863060F04F |
:10060000F999FECF1FBA32BD21BD82E080BD0FB681 |
:10061000F894FA9AF99A0FBE08958091A407A82F2A |
:10062000B0E0FD01EE0FFF1FEC58F84F8081918183 |
:100630008D5E9F4F14F010920201AA0FBB1FAC58A1 |
:10064000B84F8D919C918A5B9F4FBCF480910201C1 |
:10065000882399F481E080930201809171068F5F75 |
:1006600080937106853038F088EE93E09093D6033E |
:100670008093D50302C00E94042680917106809366 |
:100680003E0710923F0708951F93182F863008F0F9 |
:1006900015E0419FC001112429EE32E050E08C5951 |
:1006A0009F4F0E948F4EF999FECF1FBA82E090E0D3 |
:1006B00092BD81BD10BD0FB6F894FA9AF99A0FBE9B |
:1006C0000E94E64D1F910895FB01863008F085E0F9 |
:1006D000489FB00111246C597F4F21EE32E050E069 |
:1006E000CF010E94734E0E94E64D08957F928F9233 |
:1006F0009F92AF92BF92CF92DF92EF92FF920F93B1 |
:100700001F93CF93DF9314B815B8189B06C0199B9D |
:1007100002C08DE003C08BE001C08AE0809300013D |
:100720008DEC87B98FEF88B98BE184B981E085B909 |
:100730008EE38AB9579A87EF8BB984B7877F84BFD6 |
:10074000809160008861809360001092600080ED6D |
:1007500097E09093D6038093D50310927E04109275 |
:100760007D04109279071092780710927C04109201 |
:100770007B0410927A0410927904809100018A30EF |
:1007800011F4289801C0289A0E94430E0E94D506B1 |
:100790000E943C1B0E94CF0F0E94481A789410922E |
:1007A000610687E08093620688E08093630681E0BB |
:1007B000809364062091000185E690E09F938F93DB |
:1007C00087E090E09F938F931F921F92822F6AE0A1 |
:1007D0000E94E550892F90E09F938F93822F0E9473 |
:1007E000E55090E09F938F938AE691E09F938F93DB |
:1007F0001F920E94710A89E491E09F938F931F9248 |
:100800000E94710A8DB79EB740960FB6F8949EBFAE |
:100810000FBE8DBF809100018C3010F4299A01C069 |
:100820002998F999FECFC1E0D0E0D2BDC1BDF89AB8 |
:1008300080B5873409F43BC08AE191E09F938F93A0 |
:100840001F920E94710A0E940F4310E00F900F90B8 |
:100850000F90123039F0133019F40E94B64104C0E1 |
:10086000143010F00E94614243E564EA77E0812F82 |
:100870000E9444031F5F163061F7F999FECF1FBA3B |
:1008800082E090E092BD81BD83E080BD0FB6F89418 |
:10089000FA9AF99A0FBEF999FECF1FBAD2BDC1BD1F |
:1008A00087E480BD0FB6F894FA9AF99A0FBEF999C9 |
:1008B000FECF84E090E092BD81BDF89A80B585308E |
:1008C00050F081E091E09F938F931F920E94710AF4 |
:1008D0000F900F900F900E94F60243E564EA77E0D4 |
:1008E0000E9464030E94F60290E09F938F9386EE2D |
:1008F00090E09F938F931F920E94710A8091AC07A2 |
:100900000F900F900F900F900F9080FD03C0C8EED6 |
:10091000D3E020C089EC90E09F938F931F920E94B8 |
:10092000710A88EE93E00E946B0EEC010E945C134A |
:100930000F900F900F90CE010E94750E8823D9F36F |
:1009400084EC90E09F938F931F920E94710A0F9006 |
:100950000F900F900E94C327809100018A3011F4FC |
:10096000289801C0289A80ED97E09093D603809351 |
:10097000D50385E58093730686EB90E09F938F9374 |
:100980001F920E94710A8091AC070F900F900F90F8 |
:1009900082FF03C08AEA90E002C082EA90E09F935F |
:1009A0008F931F920E94710A0F900F900F908EE903 |
:1009B00090E09F938F931F920E94710A0E94B5133B |
:1009C00088E893E190938F0380938E0381E0809376 |
:1009D00072060F900F900F9064E0762E50E7852EF0 |
:1009E00057E1952EA12C43E0B42E35E0C32ED12C37 |
:1009F00020E1E22E27E2F22E00E810E08091D203FF |
:100A0000882309F49AC01092D2038091710688233A |
:100A100019F00E940D0302C00E947A290E941E262E |
:100A2000809100018A3011F4289801C0289A8091A1 |
:100A30000501882321F081508093050112C0109296 |
:100A4000C4031092C50310927D0610929B0410926D |
:100A50009A0410929D0410929C0410929F0410928C |
:100A60009E0480917804882329F080917804815035 |
:100A70008093780480918E0390918F03892BD1F419 |
:100A8000D0928F03C0928E030E94571A8091080360 |
:100A9000909109038F5F9F4FE9F48091810488232F |
:100AA000C9F0F092D603E092D503109309030093A6 |
:100AB000080310C080918E0390918F03019790934B |
:100AC0008F0380938E03809100018A3011F428985F |
:100AD00001C0289A8091D203882321F0809181045B |
:100AE000882311F40E94F8060E94F107CE010E94AB |
:100AF000750E882301F120910E0330910F03809130 |
:100B0000BC0790E0281739077CF480910803909186 |
:100B100009038F5F9F4F41F49092D6038092D503D3 |
:100B2000B0920903A09208037092D70384E190E089 |
:100B30000E946B0EEC010E94F54D8091D7035ECFB1 |
:100B40001F920F920FB60F9211248F939F93EF93E2 |
:100B5000FF93809103018823E1F48091CE0390916B |
:100B6000CF0301969093CF038093CE03FC01ED5CFD |
:100B7000FA4FE081ED3019F08639910539F4109281 |
:100B8000CF031092CE0381E080930301E093C6006F |
:100B900004C01092CF031092CE03FF91EF919F916A |
:100BA0008F910F900FBE0F901F901895DC0120E0E1 |
:100BB00030E040E050E008C0FA01ED5CFA4F80817F |
:100BC000280F311D4F5F5F4F4A175B07A8F33F7037 |
:100BD000C90136E0969587953A95E1F7835CFD016A |
:100BE000ED5CFA4F808311962F73235CFD01ED5C61 |
:100BF000FA4F2083AC5CBA4F8DE08C9310920301C6 |
:100C0000809133058093C6000895CF93DF93EA0166 |
:100C1000B22F93E2909333056093340580933505AA |
:100C200063E070E0A0E04EC0FE01EA0FF11D90818C |
:100C3000AF5FB15019F430E040E00FC0FE01EA0FA1 |
:100C4000F11D4081AF5FB15011F430E006C0FE01EC |
:100C5000EA0FF11D3081AF5FB150892F86958695DF |
:100C6000835CFB01ED5CFA4F8083242F22952F706B |
:100C7000892F90E08370907054E0880F991F5A95E7 |
:100C8000E1F7282B235CFB01EC5CFA4F2083842FD7 |
:100C900090E08F709070880F991F880F991F232FF5 |
:100CA0002295269526952370282B235CFB01EB5C6F |
:100CB000FA4F20833F73335CFB01EA5CFA4F3083C9 |
:100CC0006C5F7F4FBB2309F0AFCFCB010E94D605ED |
:100CD000DF91CF9108951F93CF93DF93EC0170E0E4 |
:100CE000A22FB0E0119748C0E42FF0E0E058F94F90 |
:100CF00030814F5FE42FF0E0E058F94F50814F5FB3 |
:100D0000E42FF0E0E058F94F10814F5FE42FF0E05E |
:100D1000E058F94F20814F5F842F90E08A179B079E |
:100D200074F55D53FE01E70FF11D852F82958F70DD |
:100D30003D53330F330F382B3083613001F1912F46 |
:100D40009D537F5FFE01E70FF11D71505295507F5B |
:100D5000892F86958695582B5083623081F0635099 |
:100D60007E5FFE01E70FF11D9295990F990F907C20 |
:100D70002D53922B90837F5F662309F0B5CFDF91CF |
:100D8000CF911F9108951F93182F8A3019F48DE089 |
:100D90000E94C3068091C00085FFFCCF1093C6005F |
:100DA00080E090E01F9108950895E1ECF0E088E183 |
:100DB0008083A0ECB0E08C9182608C93808180680D |
:100DC00080838081806480838AE28093C40088EC81 |
:100DD00090E00E946B0E9093600680935F068CED0E |
:100DE00090E00E946B0E90937F0680937E0608959C |
:100DF00080910301882309F4F3C08091B403882310 |
:100E000071F080910301882351F02BE043E756E015 |
:100E10006091320587E40E9405061092B403809128 |
:100E20007E0690917F060E94750E882309F448C0C3 |
:100E300080910301882309F443C0609125047091D7 |
:100E4000260480912704909128042CE630E040E0AD |
:100E500050E00E943A5130936C0620936B066091EB |
:100E60002D0470912E0480912F04909130042CE673 |
:100E700030E040E050E00E943A5130936E062093FB |
:100E80006D068091900480936F0680919104809309 |
:100E9000700628E04BE656E06091320587E70E9435 |
:100EA000050680917106853018F086E08093710602 |
:100EB00083E690E00E946B0E90937F0680937E06FF |
:100EC00080915F06909160060E94750E882321F440 |
:100ED0008091B6038823B1F080910301882391F0BB |
:100EE00022E446E157E06091320584E40E94050661 |
:100EF0001092B6038AEF90E00E946B0E909360060A |
:100F000080935F06609104016F3F89F0462F50E0A7 |
:100F100074E0440F551F7A95E1F74A5F5E4F605DBC |
:100F200020E181E40E9405068FEF809304019091F7 |
:100F300058079923A1F080910301882381F083E26F |
:100F400080933305909334058DE08093350510929E |
:100F5000030110925807809133058093C600809159 |
:100F6000B503882359F180910301882339F10E9448 |
:100F7000BE131092B5033091BE03932F9F5F9093E1 |
:100F8000BE03943021F08091BF03882359F026E1FD |
:100F900044E757E060E084E30E9405068FEF80930A |
:100FA000BE030CC044E1949FA00111244D5D5C4F31 |
:100FB00024E160E0832F8F5C0E9405068091B703D7 |
:100FC000882371F080910301882351F02AE041E6E3 |
:100FD00056E06091320586E50E9405061092B7033F |
:100FE00008951F93DF93CF9300D000D0CDB7DEB725 |
:100FF0008091B903882309F436C18091820688362E |
:1010000009F486C0893690F4823609F453C08336D9 |
:1010100030F48B34F1F0813609F023C13FC08336C0 |
:1010200009F45FC0873609F01CC1A5C0813738F4C8 |
:101030008C3608F0D0C08B3609F013C18DC08437D0 |
:1010400009F481C0863709F492C0813709F009C1DB |
:1010500096C02091BC0343E062E0CE0101960E945D |
:101060006B0689819A8190936204809361048091D8 |
:101070006104909162042091630430916404845E61 |
:101080009D4F821B930B68E671E00E940551845BC3 |
:1010900090409093660480936504E3C02091BC0364 |
:1010A00043E062E0CE0103960E946B068B81809341 |
:1010B000040113C02091BC0343E06BE083E796E09A |
:1010C0000E946B068091060490917506892B80938F |
:1010D000060480917C06809358078FEF809305016A |
:1010E000C0C02091BC0343E06BE083E796E00E9420 |
:1010F0006B068091060490917506892B80930604F7 |
:1011000080917C068093580781E08093B603E5CFF9 |
:101110002091BC0343E062E0CE0103960E946B067F |
:10112000809106049B81892B809306048C818F3FDC |
:1011300021F481E08093BF0302C01092BF0381E0DD |
:101140008093B5038EC02091BC0343E064E080EC43 |
:1011500093E00E946B06C1CF2091BC0343E064E0A2 |
:1011600084EC93E00E946B068091C703B4CF81E0CA |
:101170008093B70376C081E08093B40372C020915E |
:10118000BC0343E062E0CE0103960E946B068091AF |
:1011900003018823E1F38B818F3F89F0863010F0C3 |
:1011A00085E08B8343E564EA77E08B810E946403EA |
:1011B0008B8123E544EA57E06091320508C0109125 |
:1011C00032050E94F60223E544EA57E0612F855B71 |
:1011D0000E94050646C02091BC0343E063E584EA13 |
:1011E00097E00E946B068091820643E564EA77E00F |
:1011F0008B560E94440320918206F999FECF1FBAB4 |
:1012000082E090E092BD81BD2B5620BD0FB6F894D0 |
:10121000FA9AF99A0FBE6091CF0770E080E090E0F3 |
:1012200024EC39E040E050E00E94C6506093920305 |
:101230007093930380939403909395036091D007E8 |
:1012400070E080E090E00E94C65060939603709337 |
:10125000970380939803909399030E94F6020E944B |
:1012600004261092B9030F900F900F900F90CF911A |
:10127000DF911F9108951F920F920FB60F921124C4 |
:101280002F933F934F935F936F937F938F939F938E |
:10129000AF93BF93CF93DF93EF93FF938091C600FB |
:1012A0008093B8038091B8030E941B454091C90305 |
:1012B000463910F01092C8038091B8038D3009F0C0 |
:1012C0005CC08091C803823009F057C01092C803F7 |
:1012D000A42FB0E0FD01E258F94F3081ED01C15873 |
:1012E000D94F28818091CC039091CD03831B910924 |
:1012F000821B91099F709093CD038093CC039C0136 |
:1013000096E0369527959A95E1F7235C2093CB03D9 |
:10131000982F9F73935C9093CA038081281729F4B8 |
:101320008881981711F491E006C08091BB038F5F0C |
:101330008093BB0390E08091B903882309F069C0D2 |
:10134000992309F466C081E08093B9034093BC03FC |
:10135000A058B94F8DE08C9380918206823509F0B8 |
:1013600058C02CE088E190E00FB6F894A8958093DF |
:1013700060000FBE209360004CC08091C803813094 |
:10138000F9F0813020F0823009F041C024C0809112 |
:10139000B803833239F48091B903882319F481E0CA |
:1013A0008093C8038091B8038093800681E0809386 |
:1013B000C9038091B8038093CC031092CD0329C058 |
:1013C00082E08093C803E42FF0E08091B803E058F6 |
:1013D000F94F808309C0E42FF0E08091B803E05812 |
:1013E000F94F8083463920F44F5F4093C90302C010 |
:1013F0001092C8032091B8038091CC039091CD0343 |
:10140000820F911D9093CD038093CC0302C0109264 |
:10141000C803FF91EF91DF91CF91BF91AF919F9161 |
:101420008F917F916F915F914F913F912F910F908D |
:101430000FBE0F901F901895982F809159078130FB |
:1014400061F480910504E82FF0E0ED5DFC4F90839E |
:101450008F5F8093050481E00895892F0E94C30661 |
:1014600008951F93182F04C080E30E941C0A115096 |
:101470001116D4F31F9108951F93182F04C080E212 |
:101480000E941C0A11501116D4F31F9108950F9356 |
:101490001F93CF93DF938C01EB0108C0F8010F5F1E |
:1014A0001F4FE4918E2F0E941C0A21972097B1F7BD |
:1014B000DF91CF911F910F9108950F931F93CF93B9 |
:1014C000DF938C01EB0106C0F80181918F010E942E |
:1014D0001C0A21972097C1F7DF91CF911F910F919F |
:1014E00008952F923F924F925F926F927F928F92C8 |
:1014F0009F92AF92BF92CF92DF92EF92FF920F93A3 |
:101500001F93DF93CF93CDB7DEB7E5970FB6F8946F |
:10151000DEBF0FBECDBF2C969FAD2C972D964FAD45 |
:101520002D972B968FAD2B9780935907EDE4AE2E18 |
:10153000B12CAC0EBD1E292F342FC9019DA78CA73D |
:101540001EA61FA618AA19AA9E01245D3F4F3DABF7 |
:101550002CAB0CA51DA502C00F5F1F4FF801F49026 |
:10156000FF2019F0F5E2FF16B9F7B8012CA53DA54B |
:10157000621B730B19F0C9010E94470AFF2009F48E |
:1015800052C2A8014F5F5F4F5DA74CA71982442448 |
:101590001BAA5FEF5AAB02C0C5015C01ECA5FDA51B |
:1015A000CF0101969DA78CA76491A42DB0E0A170F6 |
:1015B000B070653721F0862F80628837F1F410977C |
:1015C00071F0F50120813181428153812EA73FA71F |
:1015D00048AB59AB24E030E0A20EB31E0EC0F501BB |
:1015E000808191819C0140E050E02EA73FA748AB4D |
:1015F00059AB42E050E0A40EB51E603221F489815F |
:10160000882351F61AC0633211F458E05AC06A3286 |
:1016100021F06D3281F4C50109C0C5010296D501E2 |
:10162000BC91BBABB7FFB9CFB195BBABE0E14E2AE4 |
:10163000FFED4F22B2CF6B3211F46983ADCF6E3222 |
:1016400009F03AC0ECA5FDA59F012F5F3F4F3DA7D4 |
:101650002CA784918A3221F0682F20E030E021C04D |
:10166000C5010296D5014D915C9157FF02C04FEF25 |
:101670005FEF4AAB92CFC90173E0880F991F7A954B |
:10168000E1F7220F331F280F391F260F311D20537A |
:101690003040ECA5FDA5AF014F5F5F4F5DA74CA7A4 |
:1016A0006491862F80538A3030F3A90137FF02C03E |
:1016B0004FEF5FEF4AAB7DCF603329F444FC6CCF32 |
:1016C00050E2452A69CF862F81538930E8F420E023 |
:1016D00030E0C90143E0880F991F4A95E1F7220FD6 |
:1016E000331F280F391F260F311D20533040ECA522 |
:1016F000FDA5CF0101969DA78CA76491862F8053ED |
:101700008A3038F32BAB55CF683619F494E0492A68 |
:1017100043CF6C3619F4A1E04A2A3ECF562EF5018C |
:10172000B3E66B1741F422E030E0A20EB31E8081D5 |
:101730008C83198225C134E4631739F044E66417B9 |
:1017400031F059E66517C1F502C081E0482A40FE34 |
:1017500009C0A4E0B0E0AA0EBB1E20813181428105 |
:1017600053810BC042E050E0A40EB51E80819181F0 |
:101770009C01442737FD4095542F2EA73FA748AB27 |
:1017800059AB8EA59FA5A8A9B9A9B7FF11C02EA5D1 |
:101790003FA548A959A950954095309521953F4FAF |
:1017A0004F4F5F4F2EA73FA748AB59AB3DE2398360 |
:1017B000562E1AE0312E80C04FE4641721F05FE608 |
:1017C000651731F402C081E0482AB8E03B2E73C0AF |
:1017D00090E7691791F4A2E0B0E0AA0EBB1E8081E9 |
:1017E00091819C0140E050E02EA73FA748AB59AB48 |
:1017F00030E4432AA8E75A2E5CC06337E1F5D501EF |
:10180000CD90DC90C114D10489F4B8E2BC83EEE63B |
:10181000ED83F5E7FE832CE62F83288739E23987AD |
:101820001A86F4E0CF2ED12CCC0EDD1E4AA947FD3E |
:1018300010C0552747FD509560E070E0C6010E943A |
:10184000664E009771F0182F1C195AA951174CF0C9 |
:1018500009C0F60101900020E9F731971E2F1C19ED |
:1018600001C01AA982E090E0A80EB91E1982E3E730 |
:101870005E2E40E08CC0653521F0653739F4562E78 |
:1018800002C091E0492A7AE0372E15C0683519F078 |
:10189000683709F06FC043FE0BC02EA53FA548A9CD |
:1018A00059A9211531054105510511F030E4432AAC |
:1018B000562E60E1362E19824AA947FD02C05FED1F |
:1018C00045228EA59FA5A8A9B9A90097A105B10594 |
:1018D00049F49AA9992331F45CE2C52ED12CCC0E9F |
:1018E000DD1E44C04CE2C42ED12CCC0EDD1EEEA475 |
:1018F000FFA408A919A9632C772488249924C80176 |
:10190000B701A40193010E9418516A3020F430E31A |
:10191000232E260E08C027E5222E260EA8E55A16ED |
:1019200011F4BFED2B22F60122926F01C801B7011D |
:10193000A40193010E941851C901DA018EA79FA743 |
:10194000A8ABB9ABE614F7040805190518F07C013B |
:101950008D01D5CFF8E03F1649F443FE07C020E3E0 |
:10196000221621F0D601E0E3EE936D011CA91C19AB |
:101970004AA90DC0662309F456C06C831982562EFD |
:1019800094E0C92ED12CCC0EDD1E40E011E0042FD6 |
:10199000011B07FD00E08981882319F0812F8F5FEB |
:1019A00006C046FC02C0812F02C0812F8E5F782EB8 |
:1019B000700EE42CFF2480E3882E912C8E209F2033 |
:1019C0008114910421F48BA987190E943C0A898112 |
:1019D000882329F061E070E0CE01019609C0E6FE9F |
:1019E00009C0F0E3FA835B8262E070E0CE01029608 |
:1019F0000E945D0A20E28216910421F48BA98719C6 |
:101A00000E94310A802F0E94310A612F772767FDDB |
:101A10007095C6010E945D0AE4FE9BCD8BA98719D3 |
:101A20000E943C0A96CDE5960FB6F894DEBF0FBE35 |
:101A3000CDBFCF91DF911F910F91FF90EF90DF907D |
:101A4000CF90BF90AF909F908F907F906F905F905E |
:101A50004F903F902F9008951F920F920FB60F92C4 |
:101A600011242F933F935F936F937F938F939F9353 |
:101A7000AF93BF938091D703882329F08091D70338 |
:101A800081508093D7038091DF0381508093DF03DF |
:101A90008F5F11F58091DD039091DE03009729F0AF |
:101AA00001979093DE038093DD0389E08093DF0349 |
:101AB00080910D038F5F817080930D03882319F44B |
:101AC00081E08093D2038091D0039091D10301965D |
:101AD0009093D1038093D0038091D5039091D60346 |
:101AE0000297B8F08091D5039091D6030197909317 |
:101AF000D6038093D5038091D5039091D60320918E |
:101B000008033091090382239323892B09F0A7C08E |
:101B100006C08FEF9FEF9093090380930803809195 |
:101B200000018A3039F404C05A9A05C0479A03C0AC |
:101B30005A9801C047988091AC0783FF96C0349BA8 |
:101B40000AC08091D3039091D40301969093D4035B |
:101B50008093D3038AC08091D3039091D403892BBF |
:101B600009F45FC08091D3039091D4038A569140C9 |
:101B700008F057C02091D3033091D4038091D30350 |
:101B80009091D40369E270E00E94F150260F371F54 |
:101B90003093D4032093D3038091D3039091D40343 |
:101BA0000B9750F08091D3039091D4030A979093B0 |
:101BB00062048093610404C0109262041092610474 |
:101BC0008FEF90E09093DE038093DD038091D30349 |
:101BD0009091D4038758904090936204809361045D |
:101BE000809161049091620497FF0AC08091610422 |
:101BF0009091620488599E4F90936204809361048F |
:101C000080916104909162048856914054F08091D3 |
:101C1000610490916204885691409093620480938D |
:101C20006104809161049091620420916304309179 |
:101C30006404845E9D4F821B930B68E671E00E94F2 |
:101C40000551845B9040909366048093650481E025 |
:101C50008093DA031092D4031092D30306C08091CC |
:101C600000018A3009F062CF5FCFBF91AF919F91A1 |
:101C70008F917F916F915F913F912F910F900FBE48 |
:101C80000F901F9018958091D0039091D1030B96DF |
:101C90009093E1038093E00382E085BD83EA84BDF5 |
:101CA00017BC88E788BD86E086BD83EC8093B000D2 |
:101CB00084E08093B100E0E7F0E08081826080837F |
:101CC000EEE6F0E08081816080838AE08093B3005B |
:101CD0001092B20008952091D0033091D1032F5F6C |
:101CE0003F4F280F391FC90108952091D00330912B |
:101CF000D103821B930B80709078892F869508956D |
:101D00002091D0033091D1032F5F3F4F280F391F0F |
:101D10008091D0039091D103A901481B590BCA01AE |
:101D200080709078892F869599F308952091D0033B |
:101D30003091D1032F5F3F4F280F391F4FEE02C064 |
:101D400040937A008091D0039091D103B901681B30 |
:101D5000790BCB0180709078892F869589F308954F |
:101D60001F920F920FB60F9211248F939F93809121 |
:101D7000060390910703892B11F05F9A01C05F98C9 |
:101D800083E08093B000809170008E7F809370001C |
:101D90009F918F910F900FBE0F901F9018951F92DB |
:101DA0000F920FB60F9211242F933F934F935F938F |
:101DB0006F937F938F939F93AF93BF93CF93DF9353 |
:101DC000EF93FF938091060390910703049709F026 |
:101DD00088C08091A70390E0880F991F40910A0363 |
:101DE00050910B039A01220F331F240F351F820FCE |
:101DF000931F64E070E00E94055170930B036093A1 |
:101E00000A03EB01E0968091E607209125043091CA |
:101E10002604409127045091280480FF0EC0609151 |
:101E2000C60770E080E090E00E94C65020E030E4F9 |
:101E300040E050E00E943A5114C06091C60770E043 |
:101E400080E090E00E94C65020E030E440E050E0A6 |
:101E50000E943A5150954095309521953F4F4F4FF4 |
:101E60005F4FC20FD31FD093D903C093D8032091E3 |
:101E7000D8033091D9038091C70743E0849FC00104 |
:101E800011242817390740F08091C807849FC001AA |
:101E900011248217930720F49093D9038093D803D9 |
:101EA0002091D8033091D903309341072093400704 |
:101EB000C9016FEF70E00E94F1508D9740F4235BF1 |
:101EC0003F4F3093D9032093D80383E101C080E6CC |
:101ED00080930C038091D80380958093B30083ECAA |
:101EE00040C08091060390910703892B39F18091BE |
:101EF000060390910703049708F52091D8033091C9 |
:101F0000D9032F3F310561F058F05F9A83E0809349 |
:101F1000B0002F5F30403093D9032093D80323C003 |
:101F200083E88093B00080910C038093B30081E03C |
:101F300090E0909307038093060315C080910603F9 |
:101F400090910703892B79F48091C90790E0880F5D |
:101F5000991F880F991F90930703809306035F983A |
:101F600083E08093B000809106039091070301976E |
:101F70009093070380930603FF91EF91DF91CF9138 |
:101F8000BF91AF919F918F917F916F915F914F9191 |
:101F90003F912F910F900FBE0F901F9018951092A8 |
:101FA0007C008FEE80937A0008951F920F920FB6F7 |
:101FB0000F921124EF92FF920F931F932F933F9351 |
:101FC0004F935F936F937F938F939F93AF93BF9341 |
:101FD000EF93FF9310927A00809101048F5F8093BA |
:101FE00001048150853009F486C0863090F4823037 |
:101FF00009F440C0833030F48823F1F0813009F0D7 |
:1020000078C22FC0833009F441C0843009F071C216 |
:102010005AC0883009F4C2C0893038F4863009F4D7 |
:1020200083C0873009F065C29CC0893009F4D3C0F1 |
:102030008A3009F05EC2C6C1809178009091790023 |
:10204000909300048093FF0381E0809302048091C9 |
:10205000F6039091F70301969093F7038093F603AC |
:102060004CC280917800909179009093FE03809308 |
:10207000FD0392C080917800909179009093FC03C9 |
:102080008093FB0384E08093020437C240910E03E7 |
:1020900050910F0380917800909179009A01220F5E |
:1020A000331F240F351F63E070E00E94F150260FAC |
:1020B000371F369527953695279530930F03209334 |
:1020C0000E0386E0E0CF2091780030917900809176 |
:1020D0001B0490911C04821B930B90935B078093CD |
:1020E0005A0780915A0790915B079093E903809378 |
:1020F000E80387E0C8CF8091780090917900209123 |
:10210000190430911A04821B930B909366078093F5 |
:10211000650780916507909166079093EB03809324 |
:10212000EA0310920204E9C1809100012091FF03AB |
:10213000309100048A3049F48091780090917900C0 |
:10214000820F931F9695879506C080917800909195 |
:102150007900820F931F9093E7038093E60381E059 |
:1021600092CF809100012091FD033091FE038A30CF |
:1021700049F48091780090917900820F931F969591 |
:10218000879506C08091780090917900820F931F07 |
:102190009093E5038093E40382E075CF8091000182 |
:1021A0002091FB033091FC038A3049F48091780040 |
:1021B00090917900820F931F9695879506C0809124 |
:1021C000780090917900820F931F9093E30380939E |
:1021D000E20385E058CF6091780070917900E0903B |
:1021E0001F04F090200400912104109122048827FC |
:1021F00077FD8095982F0E94AF4FA80197010E940C |
:10220000AB4E0E947C4F7093ED036093EC03809182 |
:10221000EC039091ED0302970CF43EC060911F0413 |
:1022200070912004809121049091220420E030E8F4 |
:102230004BE354E40E94104F88230CF078C0609167 |
:102240001F047091200480912104909122042AE0BF |
:1022500037ED43EA5CE30E94AC4E60931F04709339 |
:10226000200480932104909322048091A4049091EF |
:10227000A504845F914008F05AC060911F047091DA |
:10228000200480912104909122042DEC3CEC4CEC34 |
:102290005DE30E94AC4E43C08091EC039091ED034E |
:1022A0008F5F9F4F0CF043C060911F04709120041A |
:1022B000809121049091220420E030E849E054E428 |
:1022C0000E945F5018169CF560911F0470912004C5 |
:1022D00080912104909122042AE037ED43EA5CE3E7 |
:1022E0000E94AB4E60931F047093200480932104DE |
:1022F000909322048091A4049091A504845F91405E |
:10230000B0F460911F047091200480912104909199 |
:1023100022042DEC3CEC4CEC5DE30E94AB4E609350 |
:102320001F0470932004809321049093220481E081 |
:102330008093F303809178009091790090935D07EA |
:1023400080935C0720915D0430915E0440915F04AE |
:10235000509160048091EC039091ED03AA2797FDC2 |
:10236000A095BA2F820F931FA41FB51F80935D0401 |
:1023700090935E04A0935F04B0936004E0905D04CA |
:10238000F0905E0400915F041091600460915D0420 |
:1023900070915E0480915F049091600420E034E0CD |
:1023A00040E050E00E943A51E21AF30A040B150B88 |
:1023B000E0925D04F0925E0400935F041093600469 |
:1023C00083E061CE80916A0790916B07209178003D |
:1023D00030917900820F931F90936B0780936A0767 |
:1023E000809162078F5F80936207809162078530DA |
:1023F00008F47FC080917800909179009093150344 |
:1024000080931403109262074091F4035091F503F6 |
:1024100020915E0730915F0780916A0790916B076A |
:10242000281B390B8091820490918304281B390B5F |
:1024300080919E0390E0BC01269FC001279F900DD4 |
:10244000369F900D11249A0163E0220F331F6A9585 |
:10245000E1F7241B350B820F931F68E070E00E94A8 |
:1024600005517093F5036093F40320916A0730914E |
:102470006B07E0901003F09011030091120310918C |
:102480001303C801B701660F771F881F991F6E0DD0 |
:102490007F1D801F911F442737FD4095542F620FE9 |
:1024A000731F841F951F24E030E040E050E00E943D |
:1024B0003A51C901DA018093100390931103A0935C |
:1024C0001203B093130320915E0730915F07809150 |
:1024D000100390911103A0911203B0911303281BD4 |
:1024E000390B309383042093820410926B0710926F |
:1024F0006A071092020410920104809102048093F2 |
:102500007C0080910104882319F08FEE80937A007B |
:10251000FF91EF91BF91AF919F918F917F916F91BB |
:102520005F914F913F912F911F910F91FF90EF90ED |
:102530000F900FBE0F901F901895BF92CF92DF9211 |
:10254000EF92FF920F931F931092F8031092F903EA |
:102550001092FA030CE8FF24F39428E0B22E9AE0DC |
:10256000D92E85EFE82E1FEEC12E05C0133019F4C9 |
:102570000B3008F009E08091E2039091E3038C5F57 |
:10258000934024F48091160381500CC08091E203A3 |
:102590009091E3038750944014F411E006C08091B9 |
:1025A00016038F5F8093160310E08091E4039091EF |
:1025B000E5038C5F934024F48091170381500AC097 |
:1025C0008091E4039091E5038750944034F080912A |
:1025D00017038F5F8093170301C01F5F8091E6038D |
:1025E0009091E7038C5F934024F48091180381500D |
:1025F0000AC08091E6039091E7038750944034F03D |
:10260000809118038F5F8093180301C01F5FB09201 |
:1026100008040E944E1A809116038A3020F4F0922A |
:10262000F803D092160380911603863F20F0F092B3 |
:10263000F803E0921603809117038A3020F4F09299 |
:10264000F903D092170380911703863F20F0F09290 |
:10265000F903E0921703809118038A3020F4F09276 |
:10266000FA03D092180380911803863F20F0F0926D |
:10267000FA03E0921803809108048823E1F710928E |
:102680006207C0927A00809162078823E1F30A30E2 |
:1026900020F48AE090E00E94960E015009F066CF87 |
:1026A00086E490E00E94960E1F910F91FF90EF90AC |
:1026B000DF90CF90BF900895EF92FF920F931F93FA |
:1026C000CF93DF93F999FECF33E0E32E30E0F32E82 |
:1026D000F2BCE1BCF89A80B5C82FD0E0C531D10575 |
:1026E00008F02A97C7BD84E690E00E94960E80917C |
:1026F00014039091150382559340C8F4C0E0D0E0D4 |
:1027000016C0C7BD82E390E00E94960E1F930F9300 |
:102710001F920E94710A80911403909115030F90EB |
:102720000F900F908458934038F0219602C00EE924 |
:1027300011E0CA3FD10528F38C2FF999FECF1FBABB |
:10274000F2BCE1BC80BD0FB6F894FA9AF99A0FBEBC |
:10275000809367078CE291E00E94960EDF91CF9103 |
:102760001F910F91FF90EF900895E3E2F3E080E274 |
:10277000819393E0E337F907D9F708951F93809188 |
:102780000604282F30E080FF15C0809107048823BD |
:1027900011F0815002C08091730380930704E3E23B |
:1027A000F3E080E2819393E0E337F907D9F78FEF05 |
:1027B0008093BE0321FF10C0809107048F5F809338 |
:1027C0000704E3E2F3E080E2819393E0E337F90763 |
:1027D000D9F78FEF8093BE0323703070233031051B |
:1027E00011F41092070480910704282F30E08A30FA |
:1027F00040F481E1809305043F932F9389EC94E0AA |
:1028000007C080E1809305043F932F9384EC94E00C |
:102810009F938F9381E08F930E94710A0F900F9086 |
:102820000F900F900F9010910704153009F403C218 |
:10283000163090F4123009F4D0C0133030F4112364 |
:1028400009F1113009F08DC465C0133009F41BC1C2 |
:10285000143009F086C46BC1183009F480C31930F4 |
:1028600038F4163009F401C3173009F07AC453C3A1 |
:102870001A3009F4EEC31A3008F4AFC31B3009F064 |
:1028800070C425C41092050484EB94E09F938F9349 |
:1028900011E01F930E94710A84E180930504209146 |
:1028A000000185E690E09F938F9387E090E09F93EF |
:1028B0008F931F921F92822F6AE00E94E550892F0A |
:1028C00090E09F938F93822F0E94E55090E09F931A |
:1028D0008F938FE994E09F938F931F930E94710AC7 |
:1028E00088E2809305040E94F60290E09F938F9304 |
:1028F00082E994E09F938F931F930E94710A8CE367 |
:102900008093050482E894E09F938F931F930E9425 |
:10291000710AFDC28091AC0780FF47C01092050488 |
:1029200080918204909183049F938F9383E794E036 |
:102930009F938F931F930E94710A84E180930504F3 |
:1029400080918404909185049F938F9384E694E012 |
:102950009F938F931F930E94710A88E280930504CE |
:1029600080911403909115039F938F9385E594E0D4 |
:102970009F938F931F930E94710A8CE380930504A9 |
:102980008091670790E09F938F9386E494E09F93F4 |
:102990008F931F930E94710A8DB79EB744960FB60E |
:1029A000F8949EBF0FBE8DBFE1C384E18093050400 |
:1029B0008FE394E09F938F931F930E94710A88E2A4 |
:1029C0008093050481E394E09F938F931F930E946B |
:1029D000710A8DB79EB70696E2CF1092050487E282 |
:1029E00094E09F938F9311E01F930E94710A84E1FA |
:1029F000809305046091250470912604809127043A |
:102A00009091280420E034E040E050E00E943A51E8 |
:102A10005F934F933F932F9388E194E09F938F931D |
:102A20001F930E94710A88E28093050460912D042F |
:102A300070912E0480912F049091300420E034E0B6 |
:102A400040E050E00E943A515F934F933F932F93A1 |
:102A500089E094E09F938F931F930E94710A8CE307 |
:102A60008093050480916104909162049F938F93F9 |
:102A70008AEF93E09F938F931F930E94710A8DB703 |
:102A80009EB746968CCF109205048091780790915E |
:102A9000790720917607309177079F938F933F9323 |
:102AA0002F938AEE93E09F938F9311E01F930E94E0 |
:102AB000710A84E18093050480917C0790917D07E1 |
:102AC00020917A0730917B079F938F933F932F93A9 |
:102AD0008AED93E09F938F931F930E94710A88E27F |
:102AE00080930504809180079091810720917E0753 |
:102AF00030917F079F938F933F932F938AEC93E0BE |
:102B00009F938F931F930E94710A8CE38093050417 |
:102B100080918407909185072091820730918307E7 |
:102B20009F938F933F932F938AEB93E07BC01092F8 |
:102B30000504E091A507F0E0EE0FFF1FEC58F84FF9 |
:102B400020813181E091A407F0E0EE0FFF1FEC58E7 |
:102B5000F84F808191813F932F939F938F938AEABF |
:102B600093E09F938F9311E01F930E94710A84E179 |
:102B700080930504E091A707F0E0EE0FFF1FEC58EB |
:102B8000F84F20813181E091A607F0E0EE0FFF1FA2 |
:102B9000EC58F84F808191813F932F939F938F93AF |
:102BA0008AE993E09F938F931F930E94710A88E2B2 |
:102BB00080930504E091A907F0E0EE0FFF1FEC58A9 |
:102BC000F84F20813181E091A807F0E0EE0FFF1F60 |
:102BD000EC58F84F808191813F932F939F938F936F |
:102BE0008AE893E09F938F931F930E94710A8CE36E |
:102BF00080930504E091AB07F0E0EE0FFF1FEC5867 |
:102C0000F84F20813181E091AA07F0E0EE0FFF1F1D |
:102C1000EC58F84F808191813F932F939F938F932E |
:102C20008AE793E09F938F931F930E94710A8DB759 |
:102C30009EB74C96B4CE109205048CE693E09F9319 |
:102C40008F9311E01F930E94710A809100010F90F1 |
:102C50000F900F908A3009F044C084E180930504FE |
:102C60008091E2039091E30320910F0430911004CE |
:102C70003F932F93821B930B9F938F938DE593E04C |
:102C80009F938F931F930E94710A88E2809305049B |
:102C90008091E4039091E503209111043091120496 |
:102CA0003F932F93821B930B9F938F938EE493E01C |
:102CB0009F938F931F930E94710A8CE38093050466 |
:102CC00080911304909114042091E6033091E7035E |
:102CD0009F938F93821B930B9F938F938FE393E02C |
:102CE00055C0E0910F04F09110048B3009F057C0EB |
:102CF00084E1809305042091E2033091E303CF0146 |
:102D000062E070E00E9405517F936F932E1B3F0B92 |
:102D10003F932F9380E393E09F938F931F930E94A1 |
:102D2000710A88E280930504E0911104F091120485 |
:102D30002091E4033091E503CF0162E070E00E944E |
:102D400005517F936F932E1B3F0B3F932F9381E28F |
:102D500093E09F938F931F930E94710A8CE380935B |
:102D600005042091130430911404E091E603F091DE |
:102D7000E703C90162E070E00E9405517F936F9301 |
:102D80002E1B3F0B3F932F9382E193E09F938F93F2 |
:102D90001F930E94710A8DB79EB7459600CE84E1BD |
:102DA000809305042091E2033091E30380911603A0 |
:102DB00090E09F938F93CF0162E070E00E940551F5 |
:102DC0007F936F932E1B3F0B3F932F938EEF92E0D9 |
:102DD0009F938F931F930E94710A88E2809305044A |
:102DE000E0911104F09112042091E4033091E50385 |
:102DF0008091170390E09F938F93CF0162E070E082 |
:102E00000E9405517F936F932E1B3F0B3F932F938F |
:102E10008AEE92E09F938F931F930E94710A8CE336 |
:102E2000809305042091130430911404E091E6038B |
:102E3000F091E7038091180390E09F938F93C9016D |
:102E400062E070E00E9405517F936F932E1B3F0B51 |
:102E50003F932F9386ED92E09F938F931F930E9451 |
:102E6000710A8DB79EB74B969ACD1092050489ECE6 |
:102E700092E09F938F9311E01F930E94710A84E167 |
:102E8000809305042091EA033091EB0380911904AB |
:102E900090911A049F938F933F932F938AEB92E024 |
:102EA0009F938F931F930E94710A88E28093050479 |
:102EB0002091E8033091E90380911B0490911C0458 |
:102EC0009F938F933F932F938BEA92E09F938F93DF |
:102ED0001F930E94710A8CE38093050460911F0484 |
:102EE0007091200480912104909122040E947C4FD3 |
:102EF0007F936F9380911208909113089F938F9303 |
:102F00008CE992E09F938F931F930E94710A8DB773 |
:102F10009EB7489644CD84E18093050480910E03CA |
:102F200090910F039F938F938DE892E09F938F93DF |
:102F300011E01F930E94710A88E28093050480913A |
:102F4000780490E09F938F938EE792E09F938F9306 |
:102F50001F930E94710A8DB79EB70A9620CD1092DA |
:102F600005048FE692E09F938F9311E01F930E94D8 |
:102F7000710A84E180930504809165049091660450 |
:102F80009F938F9380E692E09F938F931F930E946D |
:102F9000710A88E280930504809161049091620433 |
:102FA0009F938F9381E592E09F938F931F930E944D |
:102FB000710A8CE38093050480916304909164040A |
:102FC0009F938F9382E492E09F938F931F930E942D |
:102FD000710A8DB79EB74296E2CC1092050480919B |
:102FE0007004909171049F938F9386E392E09F9376 |
:102FF0008F9311E01F930E94710A84E1809305046E |
:1030000080917204909173049F938F938AE292E06F |
:103010009F938F931F930E94710A88E28093050407 |
:1030200080917404909175049F938F938EE192E048 |
:103030009F938F931F930E94710A8CE380930504E2 |
:1030400080917604909177049F938F9382E192E030 |
:103050009ECC109205048AE092E09F938F9311E03A |
:103060001F930E94710A84E1809305048091A70355 |
:1030700090E09F938F938CEF91E09F938F931F939A |
:103080000E94710A88E2809305048091D803909190 |
:10309000D9039F938F938EEE91E09F938F931F930D |
:1030A0000E94710A8CE3809305048091C80790E028 |
:1030B0009F938F938091C70790E09F938F9380EEAB |
:1030C00091E09F938F931F930E94710A65CC109299 |
:1030D000050480ED91E09F938F9311E01F930E9470 |
:1030E000710A84E18093050480917706992787FD12 |
:1030F00090959F938F9380917606992787FD909561 |
:103100009F938F9380EC91E09F938F931F930E94E6 |
:10311000710A88E28093050480917806992787FDDB |
:1031200090959F938F938091790690E09F938F93D2 |
:1031300080EB91E09F938F931F930E94710A8CE321 |
:103140008093050480917D0690E09F938F938091FA |
:103150007A06992787FD90959F938F9380EA91E057 |
:10316000D1CE1150109373031092070410920604ED |
:103170001F910895EF92FF920F931F93CF93DF93C8 |
:103180008C01EB019C0197FF04C022273327281BE9 |
:10319000390BCE01D7FF04C0882799278C1B9D0BC4 |
:1031A000821793073CF4CE01E8018C01B1E0EB2ECD |
:1031B000F12C02C0EE24FF24209741F401151105E3 |
:1031C00029F461E070E080E090E025C0B801882734 |
:1031D00077FD8095982F28EE33E040E050E00E9484 |
:1031E000C6509E01442737FD4095542F0E943A5106 |
:1031F000A90137FF03C0509541955F4FBA01882759 |
:1032000077FD8095982F6D3021E0720720E08207CE |
:1032100020E0920704F524E630E040E050E00E9410 |
:10322000C6502CE031E040E050E00E943A51CA0123 |
:10323000B901A4E0660F771F881F991FAA95D1F7DF |
:10324000621B730B840B950B24E630E040E050E0EA |
:103250000E943A5153C0633442E0740740E084074F |
:1032600040E0940734F524E630E040E050E00E946E |
:10327000C650605B78468040904026E331E040E0F5 |
:1032800050E00E943A51CA01B901F4E0660F771F7D |
:10329000881F991FFA95D1F7621B730B840B950B4E |
:1032A00024E630E040E050E00E943A51215F3F4F79 |
:1032B00025C022E330E040E050E00E94C650645E4A |
:1032C00070478040904026EA31E040E050E00E94A4 |
:1032D0003A51CA01B901E4E0660F771F881F991FB0 |
:1032E000EA95D1F7621B730B840B950B22E330E058 |
:1032F00040E050E00E943A51225E3F4FEF2831F407 |
:103300008AE590E0AC01421B530B9A0117FD03C004 |
:10331000D7FF06C002C0D7FD03C0309521953F4FAF |
:10332000C901DF91CF911F910F91FF90EF90089508 |
:103330009C0137FF04C088279927821B930B88566E |
:10334000914034F0C90168E671E00E9405519C018A |
:1033500037FD03C061E070E005C0309521953F4F17 |
:103360006FEF7FEFC9018B5590408A35910538F496 |
:1033700084EB90E0AC01421B530B9A010FC0C901D2 |
:10338000855B90408A35910518F4245B30400FC06E |
:10339000C9018F5091408A35910518F041E050E005 |
:1033A00008C088E691E0AC01421B530B9A014FEF35 |
:1033B0005FEFF901EE0FFF1FE253FB4F85919491F0 |
:1033C000469F9001479F300D569F300D1124A90153 |
:1033D000489F9001499F300D589F300D1124C9011D |
:1033E00008952AE530E0A901481B590BCA010E9443 |
:1033F00098190895EF92FF920F931F93CF93DF9345 |
:103400008C01EB01BC0197FF04C066277727681B7E |
:10341000790B9E01D7FF04C0222733272C1B3D0BBD |
:103420002617370754F4CA010E9498197C01B80185 |
:10343000882777FD8095982F09C0CA010E94F1194D |
:103440007C01BE01882777FD8095982F28EE33E018 |
:1034500040E050E00E94C6500027F7FC0095102F76 |
:10346000A80197010E943A51C90137FF03C0909506 |
:1034700081959F4F9C01442737FD4095542FB901FA |
:10348000CA01DF91CF911F910F91FF90EF900895A6 |
:103490001092B9008AE28093B800089585EA80937B |
:1034A000BC0080E0089584E98093BC0008954CEB53 |
:1034B00050E084E9DA018C93109208042BEB30E0A1 |
:1034C000F90180811092090480E88C931092BD006C |
:1034D0001092BA001082E9EBF0E01082A8EBB0E0A5 |
:1034E0001C9210828AE28C9385EADA018C93108216 |
:1034F000F901108285E88C9308951092B9008093A9 |
:10350000BB0085E88093BC0080E008951F920F9275 |
:103510000FB60F9211248F939F93EF93FF93809197 |
:1035200008048F5F809308048150E82FF0E0E731B2 |
:10353000F10508F093C0E85CFF4FEE0FFF1F059008 |
:10354000F491E02D09948091090490E08996880F08 |
:10355000991F0CC0809109048F5F809309048150EA |
:1035600029C0833009F07AC080913B081092B900DD |
:103570008093BB0085E88093BC0070C084E9809391 |
:10358000BC0080910904843018F4109208044AC0E9 |
:103590001092090447C080910A04880F8D5AE6CF23 |
:1035A0008091BB00E0910A04F0E0E459F84F808379 |
:1035B00080910A04813041F0813018F0823089F620 |
:1035C00006C08091FB07D2CF80910408CFCF8091B5 |
:1035D0002F08CCCF80910A049091BB00E82FF0E037 |
:1035E000E459F84F94838F5F80930A04843058F134 |
:1035F00010920A0428C01092B90080E1B9CF8091DE |
:103600001603B4CF1092B90082E1B2CF80911703B4 |
:10361000ADCF84E98093BC008AE090E090938F0363 |
:1036200080938E0385EAA7CF1092B90088E9A0CFD6 |
:103630001092B90084E19CCF8091180397CF10922B |
:10364000B90080E895CF84E98093BC008AE090E0DF |
:1036500090938F0380938E03109208048091BC0096 |
:1036600080688093BC00FF91EF919F918F910F90A4 |
:103670000FBE0F901F90189583EC80938100EFE6AA |
:10368000F0E0808180628083109214041092130411 |
:1036900010921204109211041092100410920F0450 |
:1036A00008951F920F920FB60F9211240F931F933C |
:1036B0002F933F934F935F936F937F938F939F933A |
:1036C000AF93BF93CF93DF93EF93FF932091860047 |
:1036D0003091870080910D0490910E04281B390BC6 |
:1036E000809186009091870090930E0480930D0442 |
:1036F000C9018D54944000910B0410910C04835F18 |
:103700009A4160F40430110514F01092740381E0C2 |
:1037100090E090930C0480930B048AC00A3011054A |
:103720000CF086C0C9018B5F9040845B914008F02B |
:1037300068C0E901C25DD140F801EE0FFF1FEC58EF |
:10374000F84F808191819E01281B390BC90137FFF9 |
:1037500003C0909581959F4F06974CF48091780413 |
:10376000883C28F480917804865F80937804F8017F |
:10377000EE0FFF1FEC58F84F20813181C901880FEF |
:10378000991F820F931F8C0F9D1F64E070E00E94B1 |
:1037900005519B01CE010196861797071CF4215015 |
:1037A000304006C021976C177D0714F42F5F3F4F00 |
:1037B00080917804E801CC0FDD1F833CB8F0FE0156 |
:1037C000EC58F84F80819181A901481B590BCA011F |
:1037D00063E070E00E940551CB01880F991F860FAE |
:1037E000971FC657D84F9983888304C0C657D84FB0 |
:1037F00019821882F801EE0FFF1FEC58F84F318341 |
:103800002083F8013196F0930C04E0930B04E5302B |
:10381000F10511F45D9A06C05D98E630F10511F4EA |
:103820005C9A05C05C98379711F45B9A01C05B986D |
:10383000FF91EF91DF91CF91BF91AF919F918F91C8 |
:103840007F916F915F914F913F912F911F910F91B8 |
:103850000F900FBE0F901F9018952F923F924F928E |
:103860005F926F927F928F929F92AF92BF92CF9210 |
:10387000DF92EF92FF920F931F93DF93CF93CDB719 |
:10388000DEB729970FB6F894DEBF0FBECDBF2091EB |
:10389000E6033091E7038091130490911404821B96 |
:1038A000930B90934508809344082091E603309150 |
:1038B000E7038091270890912808821B930B90932F |
:1038C000A3078093A2078091E4039091E5032091E0 |
:1038D000110430911204821B930B9093FA0780938A |
:1038E000F9078091E2039091E30320910F04309156 |
:1038F0001004821B930B9093060880930508609137 |
:10390000EA037091EB03882777FD8095982F2CE0D0 |
:1039100030E040E050E00E94C6509B01AC01609155 |
:103920003E0870913F08882777FD8095982F620F99 |
:10393000731F841F951F22E030E040E050E00E949A |
:103940003A5130933F0820933E086091E80370910C |
:10395000E903882777FD8095982F2CE030E040E040 |
:1039600050E00E94C6509B01AC01609152087091DA |
:103970005308882777FD8095982F620F731F841F47 |
:10398000951F22E030E040E050E00E943A51309331 |
:103990005308209352086091EC037091ED0388273F |
:1039A00077FD8095982F20911208309113084427B5 |
:1039B00037FD4095542F620F731F841F951F22E01F |
:1039C00030E040E050E00E943A51309313082093D9 |
:1039D00012082091EA033091EB03C901880F991F67 |
:1039E000820F931F880F991F880F991FAA2797FD91 |
:1039F000A095BA2F209135043091360440913704B8 |
:103A000050913804280F391F4A1F5B1F209335043B |
:103A10003093360440933704509338042091E803E0 |
:103A20003091E903C901880F991F820F931F880FF6 |
:103A3000991F880F991FAA2797FDA095BA2F20914B |
:103A4000390430913A0440913B0450913C04280FD2 |
:103A5000391F4A1F5B1F2093390430933A04409367 |
:103A60003B0450933C042091EA033091EB03809196 |
:103A7000200890912108820F931F90932108809332 |
:103A800020082091E8033091E90380914708909144 |
:103A90004808820F931F90934808809347088091AD |
:103AA0001D0490911E04019690931E0480931D04A2 |
:103AB000E0905C07F0905D07A0901F04B090200498 |
:103AC000C0902104D090220460913D0470913E0486 |
:103AD00080913F04909140040E94AF4F3B014C0104 |
:103AE0000027F7FC0095102FC801B7010E94AF4FC7 |
:103AF000A60195010E94AB4E9B01AC01C401B3012C |
:103B00000E94AC4E0E947C4F60933D0470933E0433 |
:103B100080933F049093400480914408909145081D |
:103B20005C01CC24B7FCC094DC2C80914E089091B1 |
:103B30004F08A0915008B0915108A80EB91ECA1E96 |
:103B4000DB1EA0924E08B0924F08C0925008D0924F |
:103B500051082091440830914508442737FD40958D |
:103B6000542F8091580890915908A0915A08B0910B |
:103B70005B08820F931FA41FB51F80935808909372 |
:103B80005908A0935A08B0935B08209144083091DB |
:103B90004508442737FD4095542F80911608909191 |
:103BA0001708A0911808B0911908820F931FA41F3D |
:103BB000B51F8093160890931708A0931808B09328 |
:103BC000190880914408909145089C01442737FDCD |
:103BD0004095542F8091550490915604A09157041C |
:103BE000B0915804280F391F4A1F5B1F2E833F8353 |
:103BF00048875987209355043093560440935704BF |
:103C00005093580430E1A31637EFB30637E0C306EC |
:103C100030E0D30684F080EF98E0A8EFBFEFA80E65 |
:103C2000B91ECA1EDB1EA0924E08B0924F08C09269 |
:103C30005008D092510880914E0890914F08A09161 |
:103C40005008B0915108B7FF0CC0805F9840A84F52 |
:103C5000BF4F80934E0890934F08A0935008B093A5 |
:103C6000510890918A049D83992309F094C0809112 |
:103C70008B04882309F08FC08091AC0786FF8BC02E |
:103C80006091A2077091A307E0909804FF2400E0E0 |
:103C900010E0882777FD8095982F2091450430917A |
:103CA000460440914704509148040E94C65020E0C9 |
:103CB00038E040E050E00E943A51CA01B901A80141 |
:103CC00097010E94C65020E030E140E050E00E94A1 |
:103CD0003A51D22EC32EB42EA52E2093EA0430934F |
:103CE000EB044093EC045093ED046091A2077091B3 |
:103CF000A307882777FD8095982F20914D04309158 |
:103D00004E0440914F04509150040E94C65020E050 |
:103D100038E040E050E00E943A51CA01B901A801E0 |
:103D200097010E94C65020E030E140E050E00E9440 |
:103D30003A51B901FA012093E6047093E7044093E5 |
:103D4000E804F093E9042D2D3C2D4B2D5A2DC9018B |
:103D5000DA01B7FF07C0B095A095909581959F4F68 |
:103D6000AF4FBF4F81389105A105B10584F4CB0158 |
:103D7000DF01B7FF07C0B095A095909581959F4F43 |
:103D8000AF4FBF4F81389105A105B105A4F081E087 |
:103D90008093690410C01092E6041092E704109218 |
:103DA000E8041092E9041092EA041092EB041092D5 |
:103DB000EC041092ED048091F9079091FA0720919C |
:103DC000EA043091EB044091EC045091ED04298316 |
:103DD0003A834B835C83820F931F9093FA078093FF |
:103DE000F9070091F9071091FA076090E6047090C6 |
:103DF000E7048090E8049090E90480919904282ECB |
:103E0000332444245524C201B101A40193010E942A |
:103E1000C65020E032E040E050E00E943A51020FEC |
:103E2000131F1093FA070093F9072091F9073091B7 |
:103E3000FA07442737FD4095542F80915104909103 |
:103E40005204A0915304B0915404820F931FA41FF5 |
:103E5000B51F8093510490935204A0935304B093E0 |
:103E600054048091F9079091FA07209186043091CB |
:103E70008704821B930BAA2797FDA095BA2F209148 |
:103E80004D0430914E0440914F0450915004820FE4 |
:103E9000931FA41FB51F80934D0490934E04A093CD |
:103EA0004F04B0935004A0909603B0909703C09035 |
:103EB0009803D0909903A816B906CA06DB06C4F485 |
:103EC00088EA91E6A0E0B0E08A199B09AC09BD0937 |
:103ED00080934D0490934E04A0934F04B0935004EC |
:103EE0008093510490935204A0935304B0935404CC |
:103EF00022273327A9012A193B094C095D09809122 |
:103F00004D0490914E04A0914F04B091500482173B |
:103F10009307A407B507B4F4D601C501885A9146A2 |
:103F2000A040B04080934D0490934E04A0934F0462 |
:103F3000B09350048093510490935204A09353047F |
:103F4000B09354048091E4039091E5030F9734F407 |
:103F500088E19CEF9093FA078093F9078091E4033E |
:103F60009091E503079734F480E398EF9093FA0774 |
:103F70008093F907E09000013AE0E316A9F48091FC |
:103F8000E4039091E503835F934034F088EE93E07F |
:103F90009093FA078093F9078091E4039091E503E9 |
:103FA0008A5F9340DCF014C08091E4039091E503B4 |
:103FB000855E974034F088EE93E09093FA07809303 |
:103FC000F9078091E4039091E503835F974034F013 |
:103FD00080ED97E09093FA078093F90780910508A8 |
:103FE0009091060886199709909306088093050812 |
:103FF0000091050810910608C201B10129813A819A |
:104000004B815C810E94C65020E032E040E050E0ED |
:104010000E943A5150954095309521953F4F4F4F12 |
:104020005F4F020F131F109306080093050820919D |
:10403000050830910608442737FD4095542F80919C |
:10404000490490914A04A0914B04B0914C04820F12 |
:10405000931FA41FB51F8093490490934A04A09313 |
:104060004B04B0934C048091050890910608209170 |
:10407000880430918904821B930BAA2797FDA09591 |
:10408000BA2F209145043091460440914704509145 |
:104090004804820F931FA41FB51F8093450490937B |
:1040A0004604A0934704B0934804A0909203B090B4 |
:1040B0009303C0909403D0909503A816B906CA063E |
:1040C000DB06C4F488EA91E6A0E0B0E08A199B0917 |
:1040D000AC09BD098093450490934604A09347041E |
:1040E000B09348048093490490934A04A0934B04EE |
:1040F000B0934C0422273327A9012A193B094C0904 |
:104100005D098091450490914604A0914704B091C7 |
:10411000480482179307A407B507B4F4D601C50174 |
:10412000885A9146A040B04080934504909346043D |
:10413000A0934704B09348048093490490934A04A1 |
:10414000A0934B04B0934C048091E2039091E3035D |
:104150000F9734F488E19CEF90930608809305084C |
:104160008091E2039091E303079734F480E398EFA2 |
:104170009093060880930508EAE0EE16A9F4809172 |
:10418000E2039091E303835F934034F088EE93E081 |
:1041900090930608809305088091E2039091E303D1 |
:1041A0008A5F9340DCF014C08091E2039091E303B6 |
:1041B000855E974034F088EE93E0909306088093F4 |
:1041C00005088091E2039091E303835F974034F008 |
:1041D00080ED97E090930608809305088FEE80931A |
:1041E0007A008E819F81A885B98580934104909340 |
:1041F0004204A0934304B0934404809145049091F9 |
:104200004604A0914704B0914804809325049093FC |
:104210002604A0932704B093280480914D04909124 |
:104220004E04A0914F04B091500480932D049093BC |
:104230002E04A0932F04B0933004809149049091F0 |
:104240004A04A0914B04B0914C04809329049093AC |
:104250002A04A0932B04B0932C04809151049091D4 |
:104260005204A0915304B09154048093310490936C |
:104270003204A0933304B09334048091AC0787FFD9 |
:1042800063C09D81992309F05FC080918B048823CE |
:1042900009F05AC08091050890910608893C910563 |
:1042A0005CF02091050830910608809105089091F6 |
:1042B0000608885C904011C080910508909106081E |
:1042C00088539F4FA4F420910508309106088091EF |
:1042D00005089091060888539F4F880F991F880FF3 |
:1042E000991F820F931F9093060880930508809171 |
:1042F000F9079091FA07893C91055CF02091F90744 |
:104300003091FA078091F9079091FA07885C904004 |
:1043100011C08091F9079091FA0788539F4FA4F438 |
:104320002091F9073091FA078091F9079091FA07E7 |
:1043300088539F4F880F991F880F991F820F931FD3 |
:104340009093FA078093F9078091A807E82FF0E08F |
:10435000EE0FFF1FEC58F84F80819181209170047F |
:104360003091710483599F4F821793071CF02F5F80 |
:104370003F4F0CC08081918182599F4F82179307D4 |
:104380004CF42115310531F0215030403093710447 |
:10439000209370048091A907E82FF0E0EE0FFF1F33 |
:1043A000EC58F84F80819181209172043091730410 |
:1043B00083599F4F821793071CF02F5F3F4F0CC00C |
:1043C0008081918182599F4F821793074CF4211568 |
:1043D000310531F021503040309373042093720442 |
:1043E0008091AA07E82FF0E0EE0FFF1FEC58F84F7E |
:1043F00080819181209174043091750483599F4F7D |
:10440000821793071CF02F5F3F4F0CC08081918172 |
:1044100082599F4F821793074CF42115310531F0D3 |
:104420002150304030937504209374048091AB0781 |
:10443000E82FF0E0EE0FFF1FEC58F84F80819181DC |
:10444000209176043091770483599F4F8217930708 |
:104450001CF02F5F3F4F0CC08081918182599F4F8C |
:10446000821793074CF42115310531F0215030406B |
:1044700030937704209376048091700490917104B6 |
:1044800097FF05C010927104109270040AC08F3F0C |
:10449000910539F034F08FEF90E0909371048093A0 |
:1044A0007004809172049091730497FF05C010927C |
:1044B0007304109272040AC08F3F910539F034F0F2 |
:1044C0008FEF90E090937304809372048091740452 |
:1044D0009091750497FF05C01092750410927404B2 |
:1044E0000AC08F3F910539F034F08FEF90E0909340 |
:1044F000750480937404809176049091770497FFFB |
:1045000005C010927704109276040AC08F3F91057F |
:1045100039F034F08FEF90E0909377048093760435 |
:1045200029960FB6F894DEBF0FBECDBFCF91DF91B5 |
:104530001F910F91FF90EF90DF90CF90BF90AF90C1 |
:104540009F908F907F906F905F904F903F902F90B3 |
:1045500008958091AF078B3F98F08B3F19F48091BD |
:1045600070040EC08C3F19F48091720409C08D3F15 |
:1045700019F48091740404C08E3F21F48091760474 |
:1045800080939F038091AE078B3F98F08B3F19F487 |
:10459000809170040EC08C3F19F48091720409C0A0 |
:1045A0008D3F19F48091740404C08E3F21F48091F2 |
:1045B000760480939E0380919E03882319F41092C1 |
:1045C0009E0305C0843618F084E680939E03809194 |
:1045D000B0078B3F98F08B3F19F4809170040EC0A8 |
:1045E0008C3F19F48091720409C08D3F19F48091B9 |
:1045F000740404C08E3F21F4809176048093A0035C |
:104600008091A003882319F41092A00305C084367A |
:1046100018F084E68093A0038091B2078B3F98F056 |
:104620008B3F19F4809170040EC08C3F19F4809177 |
:10463000720409C08D3F19F48091740404C08E3F48 |
:1046400021F4809176048093A1038091B9078B3F78 |
:1046500098F08B3F19F4809170040EC08C3F19F4D0 |
:104660008091720409C08D3F19F48091740404C0D4 |
:104670008E3F21F4809176048093A2038091BA0743 |
:104680008B3F98F08B3F19F4809170040EC08C3FE3 |
:1046900019F48091720409C08D3F19F4809174045B |
:1046A00004C08E3F21F4809176048093A30380910F |
:1046B000A3038B3010F48AE002C08F3F11F4809383 |
:1046C000A3038091BB078B3F98F08B3F19F4809137 |
:1046D00070040EC08C3F19F48091720409C08D3FA4 |
:1046E00019F48091740404C08E3F21F48091760403 |
:1046F0008093A4038091C0078B3F98F08B3F19F4FF |
:10470000809170040EC08C3F19F48091720409C02E |
:104710008D3F19F48091740404C08E3F21F4809180 |
:1047200076048093A6038091C1078B3F98F08B3F5E |
:1047300019F4809170040EC08C3F19F480917204BA |
:1047400009C08D3F19F48091740404C08E3F21F498 |
:1047500080917604809390048091C2078B3F98F0FB |
:104760008B3F19F4809170040EC08C3F19F4809136 |
:10477000720409C08D3F19F48091740404C08E3F07 |
:1047800021F480917604809391048091C3078B3F3C |
:1047900098F08B3F19F4809170040EC08C3F19F48F |
:1047A0008091720409C08D3F19F48091740404C093 |
:1047B0008E3F21F480917604809392048091C40707 |
:1047C0008B3F98F08B3F19F4809170040EC08C3FA2 |
:1047D00019F48091720409C08D3F19F4809174041A |
:1047E00004C08E3F21F480917604809393048091DD |
:1047F000D4078B3F98F08B3F19F4809170040EC062 |
:104800008C3F19F48091720409C08D3F19F4809196 |
:10481000740404C08E3F21F4809176048093940444 |
:104820008091D5078B3F98F08B3F19F480917004ED |
:104830000EC08C3F19F48091720409C08D3F19F4A9 |
:104840008091740404C08E3F21F48091760480939B |
:1048500095048091D6078B3F98F08B3F19F4809197 |
:1048600070040EC08C3F19F48091720409C08D3F12 |
:1048700019F48091740404C08E3F21F48091760471 |
:10488000809396048091D7078B3F98F08B3F19F463 |
:10489000809170040EC08C3F19F48091720409C09D |
:1048A0008D3F19F48091740404C08E3F21F48091EF |
:1048B0007604809397048091C5078B3F98F08B3FD7 |
:1048C00019F4809170040EC08C3F19F48091720429 |
:1048D00009C08D3F19F48091740404C08E3F21F407 |
:1048E000809176048093A7038091CA078B3F98F04C |
:1048F0008B3F19F4809170040EC08C3F19F48091A5 |
:10490000720409C08D3F19F48091740404C08E3F75 |
:1049100021F4809176048093A8038091CD078B3F8A |
:1049200098F08B3F19F4809170040EC08C3F19F4FD |
:104930008091720409C08D3F19F48091740404C001 |
:104940008E3F21F480917604809398048091CE0765 |
:104950008B3F98F08B3F19F4809170040EC08C3F10 |
:1049600019F48091720409C08D3F19F48091740488 |
:1049700004C08E3F21F48091760480939904809145 |
:10498000D3078B3F98F08B3F19F4809170040EC0D1 |
:104990008C3F19F48091720409C08D3F19F4809105 |
:1049A000740404C08E3F21F4809176048093A9039F |
:1049B0008091D9078B3F98F08B3F19F48091700458 |
:1049C0000EC08C3F19F48091720409C08D3F19F418 |
:1049D0008091740404C08E3F21F48091760480930A |
:1049E000220880912208823010F481E002C08F3FBB |
:1049F00011F4809322088091DB078B3F98F08B3F66 |
:104A000019F4809170040EC08C3F19F480917204E7 |
:104A100009C08D3F19F48091740404C08E3F21F4C5 |
:104A2000809176048093420880914208823010F48D |
:104A300081E002C08F3F11F4809342088091DC072F |
:104A40008B3F98F08B3F19F4809170040EC08C3F1F |
:104A500019F48091720409C08D3F19F48091740497 |
:104A600004C08E3F21F480917604809303088091E6 |
:104A7000DD078B3F98F08B3F19F4809170040EC0D6 |
:104A80008C3F19F48091720409C08D3F19F4809114 |
:104A9000740404C08E3F21F48091760480935408FE |
:104AA0008091DE078B3F98F08B3F19F48091700462 |
:104AB0000EC08C3F19F48091720409C08D3F19F427 |
:104AC0008091740404C08E3F21F480917604809319 |
:104AD000FC078091DF078B3F98F08B3F19F48091A2 |
:104AE00070040EC08C3F19F48091720409C08D3F90 |
:104AF00019F48091740404C08E3F21F480917604EF |
:104B0000809307088091E0078B3F98F08B3F19F462 |
:104B1000809170040EC08C3F19F48091720409C01A |
:104B20008D3F19F48091740404C08E3F21F480916C |
:104B3000760480935E088091E3078B3F98F08B3F6B |
:104B400019F4809170040EC08C3F19F480917204A6 |
:104B500009C08D3F19F48091740404C08E3F21F484 |
:104B600080917604809355088091E1078B3F98F0FF |
:104B70008B3F19F4809170040EC08C3F19F4809122 |
:104B8000720409C08D3F19F48091740404C08E3FF3 |
:104B900021F48091760480930D088091E4078B3F87 |
:104BA00098F08B3F19F4809170040EC08C3F19F47B |
:104BB0008091720409C08D3F19F48091740404C07F |
:104BC0008E3F21F48091760480935C086091A60367 |
:104BD00070E080E090E00E94AD4F27E137EB41EDBF |
:104BE00058E30E94635060939A0370939B038093F1 |
:104BF0009C0390939D038091B70780934308809115 |
:104C0000B6078093080808951F93CF93DF93182F5A |
:104C1000C4E6D0E00DC0115080918104882351F486 |
:104C2000D093D603C093D5038AEF90E00E94800E04 |
:104C3000112389F7DF91CF911F910895809181040D |
:104C4000882321F5109204081092FB0710922F0878 |
:104C500010923B088091C003882311F08093FB07DA |
:104C60008091C103882311F0809304088091C203CE |
:104C7000882311F080933B088091C303882311F0AF |
:104C800080932F088091A6048C7F03C08091A60496 |
:104C900081608093A6048091FB07E0E3F7E08093B6 |
:104CA00030071092310780910408809332071382F5 |
:104CB00080913B0880933407158280912F08809360 |
:104CC0003607178210920804109209040E944E1AA7 |
:104CD0000895809100018D3010F00E949D12109275 |
:104CE0007A008091E2039091E30390930608809309 |
:104CF00005088091E4039091E5039093FA0780936F |
:104D0000F9078091E6039091E7039093450880931B |
:104D100044086091EA037091EB03882777FD809542 |
:104D2000982F2CE030E040E050E00E94C650709395 |
:104D30003F0860933E086091E8037091E90388277B |
:104D400077FD8095982F0E94C6507093530860930A |
:104D500052088091EC039091ED0390931308809397 |
:104D600012088FEE80937A008091A807E82FF0E078 |
:104D7000EE0FFF1FEC58F84F808191812091700455 |
:104D80003091710483599F4F821793071CF02F5F56 |
:104D90003F4F0CC08081918182599F4F82179307AA |
:104DA0004CF42115310531F021503040309371041D |
:104DB000209370048091A907E82FF0E0EE0FFF1F09 |
:104DC000EC58F84F808191812091720430917304E6 |
:104DD00083599F4F821793071CF02F5F3F4F0CC0E2 |
:104DE0008081918182599F4F821793074CF421153E |
:104DF000310531F021503040309373042093720418 |
:104E00008091AA07E82FF0E0EE0FFF1FEC58F84F53 |
:104E100080819181209174043091750483599F4F52 |
:104E2000821793071CF02F5F3F4F0CC08081918148 |
:104E300082599F4F821793074CF42115310531F0A9 |
:104E40002150304030937504209374048091AB0757 |
:104E5000E82FF0E0EE0FFF1FEC58F84F80819181B2 |
:104E6000209176043091770483599F4F82179307DE |
:104E70001CF02F5F3F4F0CC08081918182599F4F62 |
:104E8000821793074CF42115310531F02150304041 |
:104E9000309377042093760480917004909171048C |
:104EA00097FF05C010927104109270040AC08F3FE2 |
:104EB000910539F034F08FEF90E090937104809376 |
:104EC0007004809172049091730497FF05C0109252 |
:104ED0007304109272040AC08F3F910539F034F0C8 |
:104EE0008FEF90E090937304809372048091740428 |
:104EF0009091750497FF05C0109275041092740488 |
:104F00000AC08F3F910539F034F08FEF90E0909315 |
:104F1000750480937404809176049091770497FFD0 |
:104F200005C010927704109276040AC08F3F910555 |
:104F300039F034F08FEF90E090937704809376040B |
:104F40006091CF0770E080E090E024EC39E040E031 |
:104F500050E00E94C6506093920370939303809335 |
:104F60009403909395036091D00770E080E090E007 |
:104F70000E94C650609396037093970380939803A2 |
:104F8000909399030895469A10921A041092190466 |
:104F900010921C0410921B0480E090E0A0E0B0E0AE |
:104FA00080931F0490932004A0932104B0932204C3 |
:104FB0001092100410920F04109212041092110417 |
:104FC00010921404109213041092280810922708CB |
:104FD00010929804109299040E94692684E690E049 |
:104FE0000E94960E0E9469268091AC0780FF10C037 |
:104FF0008091140390911503875B934038F480915E |
:105000001403909115038E5E924010F40E945C137D |
:105010004091E2035091E3035093100440930F0436 |
:105020002091E4033091E50330931204209311049E |
:105030008091E6039091E703909314048093130406 |
:105040008091E6039091E7039093280880932708C6 |
:1050500030931604209315045093180440931704BA |
:10506000F999FECF24E030E032BD21BDF89A80B539 |
:10507000853038F1809152089091530897FF03C012 |
:10508000909581959F4F6CE070E00E940551709360 |
:105090001C0460931B0480913E0890913F0897FF89 |
:1050A00003C0909581959F4F6CE070E00E94055180 |
:1050B00070931A046093190460915C0770915D0706 |
:1050C00042C0F999FECF32BD21BDF89A30B5F999A9 |
:1050D000FECF85E090E092BD81BDF89A20B5932F78 |
:1050E00080E0820F911D90931A0480931904F9991E |
:1050F000FECF86E090E092BD81BDF89A30B5F99977 |
:10510000FECF87E090E092BD81BDF89A20B5932F45 |
:1051100080E0820F911D90931C0480931B04F999E9 |
:10512000FECF88E090E092BD81BDF89A30B5F99944 |
:10513000FECF89E090E092BD81BDF89A20B5732F33 |
:1051400060E0620F711D882777FD8095982F0E947F |
:10515000AF4F60931F0470932004809321049093B9 |
:1051600022041092450410924604109247041092B3 |
:1051700048041092490410924A0410924B04109271 |
:105180004C0410924D0410924E0410924F04109251 |
:105190005004109251041092520410925304109231 |
:1051A0005404109255041092560410925704109211 |
:1051B000580410920608109205081092FA071092EF |
:1051C000F907109245081092440884E690E00E9486 |
:1051D000960E8091100390911103A0911203B0914B |
:1051E000130390935F0780935E071092F50310926C |
:1051F000F40310925D0410925E0410925F0410920A |
:10520000600480916104909162049093640480939F |
:1052100063040E94BB4382E390E09093D6038093A3 |
:10522000D5036091CF0770E080E090E024EC39E096 |
:1052300040E050E00E94C6506856754C8F4F9F4F1B |
:1052400060939203709393038093940390939503D8 |
:105250006091D00770E080E090E00E94C6506856F0 |
:10526000754C8F4F9F4F6093960370939703809375 |
:105270009803909399031092AB031092AA03609144 |
:10528000610470916204882777FD8095982F2AEA3F |
:1052900035E040E050E00E94C65060934E087093A5 |
:1052A0004F08809350089093510810926B0410920D |
:1052B0006A0481E0809301010E94E64D8091A6047A |
:1052C00084608093A60460916104709162048827D1 |
:1052D00077FD8095982F2AEA35E040E050E00E9463 |
:1052E000C650609358087093590880935A08909359 |
:1052F0005B0808952F923F924F925F926F927F9238 |
:105300008F929F92AF92BF92CF92DF92EF92FF92D5 |
:105310000F931F93DF93CF93CDB7DEB728970FB6C8 |
:10532000F894DEBF0FBECDBF0E942D1C8091C60831 |
:105330009091C708009729F001979093C708809330 |
:10534000C6080E948E44892B39F4809100018A306E |
:1053500011F4289A01C02898809100018C3010F433 |
:10536000299A01C0299820917F04309180043A83C2 |
:10537000298380910808282F30E0C90109964981C6 |
:105380005A81841795072CF0B901665F7F4F7A83A5 |
:10539000698380917804843608F06CC0809105019F |
:1053A000882399F480910803909109038F5F9F4FA0 |
:1053B00061F488E99AE39093D6038093D50380E063 |
:1053C0009CE090930903809308038091C804909116 |
:1053D000C904009731F001979093C9048093C804E1 |
:1053E00004C01092810410926704809100018A30F9 |
:1053F00011F4289A01C028988091A4049091A504E2 |
:10540000895E9340A0F18091BD07E82FF0E0FA8318 |
:10541000E98381E080936704A091A407B0E0AA0F1C |
:10542000BB1FFD01E657F84F11821082E091A507DE |
:105430002E2F30E0220F331FC9018657984FFC01F1 |
:1054400011821082AC58B84F11961C921E922C58A3 |
:10545000384FD90111961C921E92E091A707F0E0F7 |
:10546000EE0FFF1FEC58F84F11821082FEC210920F |
:105470008104FBC2809178048D3808F4F6C2109242 |
:1054800067048091BE0722E3829FC001112490939C |
:10549000C9048093C804E981FA81B9978CF080919E |
:1054A0008104882369F08091A4049091A504FFEF02 |
:1054B0008F3F9F0729F001969093A5048093A40441 |
:1054C0008091A4049091A5048F3F910509F038F5CF |
:1054D0001092E2041092E3041092E4041092E504A6 |
:1054E0001092DE041092DF041092E0041092E104A6 |
:1054F0008A3F9105C9F481E08093C1041092DA04D7 |
:105500001092DB041092DC041092DD04109255041A |
:1055100010925604109257041092580405C08091BE |
:10552000A60482608093A604E091A607F0E0EE0F47 |
:10553000FF1FEC58F84F80819181813591050CF463 |
:10554000E1C180918104882309F0DCC18091A70723 |
:10555000E82FF0E0EE0FFF1FEC58F84F80819181AB |
:105560008C3491050CF40EC18091C7048F5F809339 |
:10557000C704893C08F4C6C1809100018C3010F446 |
:10558000299801C0299A0E94C32710928104109281 |
:10559000C7041092A5041092A4048091A407482F78 |
:1055A00050E0FA01EE0FFF1FEC58F84F8081918117 |
:1055B000873491059CF4E091A507F0E0EE0FFF1F02 |
:1055C000EC58F84F0190F081E02DF7FF03C0F09503 |
:1055D000E195FF4FE734F1050CF478C08091A50701 |
:1055E000A82FB0E0FD01EE0FFF1FEC58F84F8081AF |
:1055F00091818734910544F0FA01EE0FFF1FEC58BA |
:10560000F84F0190F081E02DFD01EE0FFF1FEC58E7 |
:10561000F84F808191818734910564F0FA01EE0F93 |
:10562000FF1FEC58F84F808191818734910514F069 |
:1056300022E001C021E0FD01EE0FFF1FEC58F84F02 |
:1056400080819181863491055CF4FA01EE0FFF1F91 |
:10565000EC58F84F80819181873491050CF023E05C |
:10566000FD01EE0FFF1FEC58F84F808191818A5B9E |
:105670009F4F5CF4FA01EE0FFF1FEC58F84F80814A |
:105680009181873491050CF024E0AA0FBB1FAC5820 |
:10569000B84F8D919C918A5B9F4F5CF4FA01EE0F9D |
:1056A000FF1FEC58F84F80819181863491050CF4EE |
:1056B00025E0F999FECF1FBA82E090E092BD81BD4E |
:1056C00020BD0FB6F894FA9AF99A0FBEE091A5079B |
:1056D000F0E0EE0FFF1FEC58F84F0190F081E02D45 |
:1056E000F7FF03C0F095E195FF4F7497A4F4440FC2 |
:1056F000551F4C58584FDA018D919C918A5B9F4FF2 |
:1057000054F481E08093710688EE93E09093D60381 |
:105710008093D503F7C00E94F60243E564EA77E080 |
:105720000E9464038091AC0780FF10C08091140335 |
:1057300090911503875B934038F480911403909106 |
:1057400015038E5E924010F40E945C130E94C327E2 |
:105750000E94F6020E9404260E94E3448091B00851 |
:10576000882309F4CFC088EE93E00E94800E88EE73 |
:1057700093E09093D6038093D50384EF91E00E9449 |
:10578000800EC0C080819181855B9F4F0CF0B8C0B6 |
:105790008091C7048F5F8093C704893C08F4B2C02E |
:1057A000809100018C3010F4299801C0299AF99950 |
:1057B000FECF1FBA04E010E012BD01BD8FEF80BD27 |
:1057C0000FB6F894FA9AF99A0FBE109281041092CB |
:1057D000C7041092A5041092A4040E94C32720912C |
:1057E000190430911A04F999FECF1FBA12BD01BDF8 |
:1057F000C90160E071E00E94055160BD0FB6F894E8 |
:10580000FA9AF99A0FBEF999FECF1FBA85E090E097 |
:1058100092BD81BDC90160E071E00E94055180BD6B |
:105820000FB6F894FA9AF99A0FBE20911B043091A2 |
:105830001C04F999FECF1FBA86E090E092BD81BDAD |
:10584000C90160E071E00E94055160BD0FB6F89497 |
:10585000FA9AF99A0FBEF999FECF1FBA87E090E045 |
:1058600092BD81BDC90160E071E00E94055180BD1B |
:105870000FB6F894FA9AF99A0FBE20911F0430914E |
:1058800020044091210450912204F999FECF1FBABF |
:1058900088E090E092BD81BDCA01B9010E947C4FB1 |
:1058A000DC01CB0160E071E00E94055160BD0FB6E4 |
:1058B000F894FA9AF99A0FBE20911F0430912004AF |
:1058C0004091210450912204F999FECF1FBA89E03A |
:1058D00090E092BD81BDCA01B9010E947C4FDC01FC |
:1058E000CB0160E071E00E94055180BD0FB6F894D5 |
:1058F000FA9AF99A0FBE0E94F6020E94042602C08C |
:105900001092C704E091A607F0E0EE0FFF1FEC58DD |
:10591000F84F808191818B5A9F4F0CF0A6C0E09187 |
:10592000A707F0E0EE0FFF1FEC58F84F8081918140 |
:10593000855B9F4F0CF077C08091C6048F5F80938A |
:10594000C604893C08F471C0469A88EC8093C6046A |
:1059500081E090E09093A5048093A40481E080937B |
:1059600081041092DA041092DB041092DC0410928D |
:10597000DD041092550410925604109257041092B0 |
:1059800058041092590410925A0410925B04109219 |
:105990005C04109245041092460410924704109241 |
:1059A000480410924D0410924E0410924F0410922D |
:1059B00050048091250490912604A0912704B09171 |
:1059C00028048093490490934A04A0934B04B09315 |
:1059D0004C0480912D0490912E04A0912F04B0913D |
:1059E00030048093510490935204A0935304B093D5 |
:1059F00054041092E2041092E3041092E404109212 |
:105A0000E5041092DE041092DF041092E00410927C |
:105A1000E10480E090E00E9438468091A60488600E |
:105A20008093A60402C01092C604E091A707F0E09C |
:105A3000EE0FFF1FEC58F84F808191818C34910557 |
:105A400094F08091C5048F5F8093C504893C68F011 |
:105A500046981092810488EC8093C5041092A504A6 |
:105A60001092A40402C01092C50480917403815066 |
:105A7000809374038F5F29F080916704882309F471 |
:105A8000C7C30E94A9228091A407082F10E0000F2D |
:105A9000111FF801EC58F84F80819181E090B30715 |
:105AA000FF24BC016E9DC0016F9D900D7E9D900DE9 |
:105AB00011244091B7045091B8049A01220F331F6A |
:105AC000240F351F820F931F64E070E00E94055180 |
:105AD0007093B8046093B7040657184FD8018D919E |
:105AE0009C910091B40710E0FC01E09FC001E19F90 |
:105AF000900DF09F900D1124860F971F9093B8047E |
:105B00008093B7042091F2043091F3044091EE04A5 |
:105B10005091EF04821B930B841B950B90937A0496 |
:105B2000809379048091A507C82EDD24CC0CDD1C60 |
:105B3000F601EC58F84F808191819C012E9DC001A7 |
:105B40002F9D900D3E9D900D11244091B5045091D4 |
:105B5000B6049A01220F331F240F351F820F931FA3 |
:105B600064E070E00E9405517093B6046093B50440 |
:105B70004AE857E0C40ED51ED6018D919C91FC01D8 |
:105B8000E09FC001E19F900DF09F900D1124860FC2 |
:105B9000971F9093B6048093B5042091F40430913C |
:105BA000F5044091F0045091F104821B930B841B87 |
:105BB000950B90937C0480937B04E091A707F0E021 |
:105BC000EE0FFF1FEC58F84F8081918190958195E1 |
:105BD0009F4F90937E0480937D04E091A607F0E0B0 |
:105BE000EE0FFF1FEC58F84F8081918188589F4F2E |
:105BF0009093800480937F046091A30370E080E021 |
:105C000090E00E94AD4F20E030E040E251E40E947D |
:105C1000AC4E20E030E040E85CE30E9463506093CB |
:105C2000490870934A0880934B0890934C08609100 |
:105C3000A40370E080E090E00E94AD4F20E030EEE1 |
:105C40004BE256E40E94144F60932B0870932C088B |
:105C500080932D0890932E088091C503882331F0FE |
:105C60008AE090E09093D6038093D5038091C5039A |
:105C700082FF09C080915C08482F50E0440F551FF7 |
:105C8000440F551F10C083FD03C040E050E00BC01F |
:105C900080915C0890E0880F991F880F991F442716 |
:105CA0005527481B590B20919A0430919B04C90138 |
:105CB000F3E0880F991FFA95E1F7821B930B840F8D |
:105CC000951F68E070E00E94055170939B046093FB |
:105CD0009A048091C50384FF09C080915C08482F15 |
:105CE00050E0440F551F440F551F10C085FD03C0E1 |
:105CF00040E050E00BC080915C0890E0880F991F55 |
:105D0000880F991F44275527481B590B20919C0445 |
:105D100030919D04C90163E0880F991F6A95E1F7EE |
:105D2000821B930B840F951F68E070E00E94055161 |
:105D300070939D0460939C048091C40383FF03C00F |
:105D400082E390E004C082FF07C08EEC9FEF909347 |
:105D50009F0480939E0404C010929F0410929E049E |
:105D60008091C40381FF09C08091AA039091AB0385 |
:105D700001969093AB038093AA038091C40384FFA0 |
:105D800009C08091AA039091AB0301979093AB0354 |
:105D90008093AA0380919A0490919B0462E070E042 |
:105DA0000E9405510091790410917A04060F171F83 |
:105DB00010937A040093790480919C0490919D043F |
:105DC00062E070E00E940551E0917B04F0917C0458 |
:105DD000E60FF71FF0937C04E0937B0480919E0410 |
:105DE00090919F04880F991F880F991F40917D04FF |
:105DF00050917E04480F591F50937E0440937D04B8 |
:105E000080917D0680FF5CC080915C08813808F439 |
:105E100057C02091B30730E080917606992787FD1F |
:105E20009095BC01269FC001279F900D369F900D35 |
:105E30001124080F191F10937A040093790480919C |
:105E40007706992787FD9095DC012A9FC0012B9F3B |
:105E5000900D3A9F900D1124E80FF91FF0937C04E8 |
:105E6000E0937B0480917806992787FD9095480FF1 |
:105E7000591F50937E0440937D042091B10730E078 |
:105E800080917A06992787FD9095FC012E9FC0018D |
:105E90002F9F900D3E9F900D11249093AB03809304 |
:105EA000AA0380917906282F30E080917F04909199 |
:105EB00080042817390724F43093800420937F044A |
:105EC00080917F049091800497FF04C01092800419 |
:105ED00010927F048091AC0782FF0CC080E090E0BC |
:105EE000A0E0B0E080932B0890932C08A0932D089D |
:105EF000B0932E0820E030E040E050E06091490887 |
:105F000070914A0880914B0890914C080E94104F64 |
:105F1000882364F480E090E0A0E0B0E0809349083A |
:105F200090934A08A0934B08B0934C0820E030E0CF |
:105F300040E050E060912B0870912C0880912D0872 |
:105F400090912E080E94104F882364F480E090E026 |
:105F5000A0E0B0E080932B0890932C08A0932D082C |
:105F6000B0932E084091790410917A04E091A00436 |
:105F7000F091A104842F912F64E070E00E940551FC |
:105F8000CB0177FF03C0909581959F4FE817F907E4 |
:105F9000DCF4842F912F9C0137FF03C030952195AD |
:105FA0003F4FC90195958795959587959093A10445 |
:105FB0008093A0048536910564F084E690E0909388 |
:105FC000A1048093A00405C03197F093A104E0934D |
:105FD000A00440917B0410917C04E091A204F09114 |
:105FE000A304842F912F64E070E00E940551CB013F |
:105FF00077FF03C0909581959F4FE817F907DCF470 |
:10600000842F912F9C0137FF03C0309521953F4F7E |
:10601000C90195958795959587959093A30480934D |
:10602000A2048536910564F084E690E09093A30481 |
:106030008093A20405C03197F093A304E093A204D7 |
:1060400080916704882341F01092A1041092A0046B |
:106050001092A3041092A2048091A507A82FB0E08B |
:10606000FD01EE0FFF1FEC58F84F20813181809128 |
:10607000CB07482F50E04217530744F48091E507BF |
:1060800082FF04C081E080938C040FC0AA0FBB1F65 |
:10609000AC58B84F2D913C918091CC07481B5109C9 |
:1060A0002417350714F410928C048091A507A82FAB |
:1060B000B0E0FD01EE0FFF1FEC58F84F2081318159 |
:1060C0008091CB07482F50E088279927841B950B98 |
:1060D0002817390744F48091E50783FF04C081E065 |
:1060E00080938D0414C080918D04882381F0AA0FC1 |
:1060F000BB1FAC58B84F2D913C918091CC0790E0DC |
:10610000841B950B8217930714F410928D048091D1 |
:10611000A407A82FB0E0FD01EE0FFF1FEC58F84FC9 |
:10612000208131818091CB07482F50E042175307DF |
:1061300044F48091E50780FF04C081E080938F04E0 |
:1061400013C080918F04882379F0AA0FBB1FAC582D |
:10615000B84F2D913C918091CC07481B51092417D1 |
:10616000350714F410928F048091A407A82FB0E093 |
:10617000FD01EE0FFF1FEC58F84F20813181809117 |
:10618000CB07482F50E088279927841B950B2817A9 |
:10619000390744F48091E50781FF04C081E08093D2 |
:1061A0008E0414C080918E04882381F0AA0FBB1F37 |
:1061B000AC58B84F2D913C918091CC0790E0841B56 |
:1061C000950B8217930714F410928E0480918C041F |
:1061D000882321F480918D04882321F081E080932D |
:1061E0008B0402C010928B0480918F04882321F4C9 |
:1061F00080918E04882351F081E080938A0410926C |
:106200008B0410928C0410928D0402C010928A04A8 |
:1062100080918B04882321F480918A04882351F093 |
:106220008091CA0790E029813A818217930714F47C |
:106230009A83898380916704882341F110927E04B8 |
:1062400010927D0410927A041092790410927C04CA |
:1062500010927B0480E090E0A8ECBFE380934908B3 |
:1062600090934A08A0934B08B0934C088BE09CEBAA |
:10627000A2E3BCE380932B0890932C08A0932D08F5 |
:10628000B0932E0810928B0410928A0480911C08FF |
:1062900090911D08A0911E08B0911F08209125041F |
:1062A000309126044091270450912804820F931FB7 |
:1062B000A41FB51F80931C0890931D08A0931E086F |
:1062C000B0931F088091230890912408A09125087D |
:1062D000B091260820912D0430912E0440912F0476 |
:1062E00050913004820F931FA41FB51F8093230881 |
:1062F00090932408A0932508B093260880910E0857 |
:1063000090910F08A0911008B091110820912904D4 |
:1063100030912A0440912B0450912C04820F931F3A |
:10632000A41FB51F80930E0890930F08A093100828 |
:10633000B09311088091FF0790910008A091010887 |
:10634000B09102082091310430913204409133041D |
:1063500050913404820F931FA41FB51F8093FF0731 |
:1063600090930008A0930108B093020880918A04DA |
:10637000882329F480918B04882309F45CC010924F |
:10638000350410923604109237041092380410929B |
:10639000390410923A0410923B0410923C0410927B |
:1063A0001C0810921D0810921E0810921F081092CF |
:1063B00023081092240810922508109226081092A3 |
:1063C0000E0810920F0810921008109211081092E7 |
:1063D000FF071092000810920108109202088091A5 |
:1063E000450490914604A0914704B09148048093DD |
:1063F000490490934A04A0934B04B0934C048091B9 |
:106400004D0490914E04A0914F04B091500480939C |
:10641000510490935204A0935304B09354041092E7 |
:10642000F7031092F60310928904109288041092D8 |
:1064300087041092860480918A04882309F017C18A |
:1064400080918B04882309F012C1E090B807FF24E3 |
:1064500000E010E0609125047091260480912704EB |
:1064600090912804A80197010E943A5159016A01AC |
:1064700080913E0890913F08AA2797FDA095BA2FDA |
:10648000A81AB90ACA0ADB0A60912D0470912E0479 |
:1064900080912F0490913004A80197010E943A51F5 |
:1064A00079018A018091520890915308AA2797FD9B |
:1064B000A095BA2FE81AF90A0A0B1B0BC601B50101 |
:1064C00020E130E040E050E00E943A51922E832ECD |
:1064D000742E652E822F932FA42FB52F5C016D0192 |
:1064E000C801B70120E130E040E050E00E943A519D |
:1064F000222E532E442E352E822F932FA42FB52FCC |
:106500007C018D018091A0049091A10481349105BA |
:106510003CF48091A2049091A30481349105E4F0AD |
:10652000692D782D872D962D23E030E040E050E056 |
:106530000E943A51C901DA015C016D01622D752D8D |
:10654000842D932D23E030E040E050E00E943A514A |
:10655000C901DA017C018D01E091A707F0E0EE0F9F |
:10656000FF1FEC58F84F0190F081E02DF7FF03C0BA |
:10657000F095E195FF4F7A97C4F0C601B50123E08D |
:1065800030E040E050E00E943A51C901DA015C017C |
:106590006D01C801B70123E030E040E050E00E9407 |
:1065A0003A51C901DA017C018D0131E2A316B1042F |
:1065B000C104D10434F040E2A42EB12CC12CD12C62 |
:1065C00011C040EEA4164FEFB4064FEFC4064FEFD4 |
:1065D000D40644F430EEA32E3FEFB32E3FEFC32E8C |
:1065E0003FEFD32E51E2E516F1040105110534F019 |
:1065F00020E2E22EF12C012D112D11C060EEE616E5 |
:106600006FEFF6066FEF06076FEF160744F490EE94 |
:10661000E92E9FEFF92E9FEF092F9FEF192F809101 |
:10662000450490914604A0914704B09148048A190A |
:106630009B09AC09BD098093450490934604A0933F |
:106640004704B093480480914D0490914E04A0916A |
:106650004F04B09150048E199F09A00BB10B809389 |
:106660004D0490934E04A0934F04B0935004809136 |
:10667000F6039091F7038F3F910509F008F485C563 |
:1066800080918A04882309F002C580918B048823B5 |
:1066900009F0FDC480916904882309F0F8C4609171 |
:1066A0001C0870911D0880911E0890911F0820E021 |
:1066B00031E040E050E00E943A5159016A012093D4 |
:1066C0001C0830931D0840931E0850931F086091CA |
:1066D000230870912408809125089091260820E0D5 |
:1066E00031E040E050E00E943A5139014A012093E4 |
:1066F0002308309324084093250850932608E090FF |
:10670000B807FF2400E010E02091350430913604F2 |
:106710004091370450913804C801B7010E94C65017 |
:1067200020E031E040E050E00E943A512B833C836E |
:106730004D835E83209335043093360440933704B1 |
:10674000509338042091390430913A0440913B042D |
:1067500050913C04C801B7010E94C65020E031E0CE |
:1067600040E050E00E943A5119012A012093390477 |
:1067700030933A0440933B0450933C0460913D04B1 |
:1067800070913E0480913F049091400420E031E0FC |
:1067900040E050E00E943A5120933D0430933E0483 |
:1067A00040933F04509340048B819C81AD81BE8116 |
:1067B000A81AB90ACA0ADB0AA092CE04B092CF0482 |
:1067C000C092D004D092D104E090D107FF2400E021 |
:1067D00010E0C601B501A80197010E943A51590184 |
:1067E0006A012093BD043093BE044093BF045093CC |
:1067F000C00462187308840895086092CA047092F5 |
:10680000CB048092CC049092CD04C401B301A801C2 |
:1068100097010E943A5179018A012093B90430937B |
:10682000BA044093BB045093BC04C601B50120E0F8 |
:1068300031E040E050E00E943A51309389042093C7 |
:106840008804C801B70120E031E040E050E00E9438 |
:106850003A5130938704209386048091A00490914C |
:10686000A10481349105C4F48091A2049091A30401 |
:10687000813491058CF4E091A707F0E0EE0FFF1F43 |
:10688000EC58F84F0190F081E02DF7FF03C0F09530 |
:10689000E195FF4F7A97C4F0809188049091890424 |
:1068A00062E070E00E94055170938904609388044F |
:1068B000809186049091870462E070E00E94055107 |
:1068C000709387046093860460910E0870910F089E |
:1068D000809110089091110820E031E040E050E0F4 |
:1068E0000E943A5120930E0830930F0840931008ED |
:1068F000509311086091FF07709100088091010882 |
:106900009091020820E031E040E050E00E943A51CE |
:106910002093FF073093000840930108509302082A |
:10692000E0902904F0902A0400912B0410912C048B |
:106930008091250490912604A0912704B091280409 |
:10694000E81AF90A0A0B1B0BE092D604F092D7045E |
:106950000093D8041093D90420913104309132046B |
:10696000409133045091340480912D0490912E0471 |
:10697000A0912F04B0913004281B390B4A0B5B0BFC |
:106980002093D2043093D3044093D4045093D5047D |
:10699000E092CE04F092CF040093D0041093D1047F |
:1069A0002093CA043093CB044093CC045093CD047D |
:1069B0008091490490914A04A0914B04B0914C04F9 |
:1069C0008E199F09A00BB10B8093490490934A0440 |
:1069D000A0934B04B0934C048091510490915204C5 |
:1069E000A0915304B0915404821B930BA40BB50BDC |
:1069F0008093510490935204A0935304B093540491 |
:106A000080916A0490916B048138910594F0809193 |
:106A1000130490911404019690931404809313042A |
:106A200080912708909128080196909328088093D8 |
:106A3000270880916A0490916B0480589F4F94F4CA |
:106A400080911304909114040197909314048093FF |
:106A500013048091270890912808019790932808A3 |
:106A60008093270810926B0410926A048091580852 |
:106A700090915908A0915A08B0915B088031E7EFD6 |
:106A80009E07E7E0AE07E0E0BE0764F08051974F55 |
:106A9000A740B0408093580890935908A0935A0893 |
:106AA000B0935B088091580890915908A0915A08BA |
:106AB000B0915B08B7FF0CC0805F9840A84FBF4FF4 |
:106AC0008093580890935908A0935A08B0935B0894 |
:106AD000809100018A3011F4289801C0289A81E041 |
:106AE00090E09093B4048093B3048091AB049091B0 |
:106AF000AC04A091AD04B091AE0420911C0830917B |
:106B00001D0840911E0850911F08821B930BA40B77 |
:106B1000B50B815E914BAF4FBF4F8F539C49A04047 |
:106B2000B04008F0D7C02091CE043091CF044091FE |
:106B3000D0045091D104213060E1360760E046076F |
:106B400060E056070CF453C08091B204882309F426 |
:106B50004AC0DA01C9010CE0B595A79597958795CC |
:106B60000A95D1F701969093B4048093B304CA01B7 |
:106B7000B90128E030E040E050E00E943A51C901FC |
:106B8000DA018093BD049093BE04A093BF04B09338 |
:106B9000C00489589341A040B04064F088E893E174 |
:106BA000A0E0B0E08093BD049093BE04A093BF0426 |
:106BB000B093C0046091BD047091BE048091BF0485 |
:106BC0009091C00420E031E040E050E00E943A5152 |
:106BD0008091880490918904820F931F9093890477 |
:106BE0008093880406C081E08093B20402C01092B2 |
:106BF000B2044091CE045091CF046091D0047091C2 |
:106C0000D104403080EF58078FEF68078FEF780787 |
:106C10000CF05DC08091B104882309F454C088272A |
:106C20009927DC01841B950BA60BB70B1CE0B595CF |
:106C3000A795979587951A95D1F72091B304309130 |
:106C4000B404280F391F3093B4042093B304CB014C |
:106C5000BA0128E030E040E050E00E943A51C9011A |
:106C6000DA018093BD049093BE04A093BF04B09357 |
:106C7000C00488579C4EAF4FBF4F64F488E79CEE2A |
:106C8000AFEFBFEF8093BD049093BE04A093BF0409 |
:106C9000B093C0046091BD047091BE048091BF04A4 |
:106CA0009091C00420E031E040E050E00E943A5171 |
:106CB0008091880490918904820F931F9093890496 |
:106CC0008093880411C081E08093B1040DC01092BC |
:106CD000B1040AC01092B4041092B30488EE93E099 |
:106CE000909391038093900320913E0830913F0848 |
:106CF00030930A082093090837FF08C0882799278E |
:106D0000821B930B90930A088093090820915208E4 |
:106D10003091530837FF03C0309521953F4F309392 |
:106D20003608209335088091090890910A08883C1C |
:106D300091050CF049C0283C31050CF045C080910C |
:106D4000D207282F30E08091B3049091B404281723 |
:106D5000390724F43093B4042093B3048091CE0413 |
:106D60009091CF04A091D004B091D104815094406F |
:106D7000A040B04074F080910F04909110042091D5 |
:106D8000B3043091B404820F931F90931004809346 |
:106D90000F048091CE049091CF04A091D004B091C3 |
:106DA000D10480509C4FAF4FBF4F74F480910F04BB |
:106DB000909110042091B3043091B404821B930B82 |
:106DC0009093100480930F0481E090E09093B404BA |
:106DD0008093B3041092B9041092BA041092BB04C9 |
:106DE0001092BC048091A7049091A804A091A904DA |
:106DF000B091AA04209123083091240840912508DD |
:106E000050912608821B930BA40BB50B815E914B0E |
:106E1000AF4FBF4F8F539C49A040B04008F0D7C040 |
:106E20002091CA043091CB044091CC045091CD0400 |
:106E3000213060E1360760E0460760E056070CF459 |
:106E400053C08091B004882309F44AC0DA01C90113 |
:106E5000FCE0B595A79597958795FA95D1F701969A |
:106E60009093B4048093B304CA01B90128E030E0E0 |
:106E700040E050E00E943A51C901DA018093B90420 |
:106E80009093BA04A093BB04B093BC048958934177 |
:106E9000A040B04064F088E893E1A0E0B0E08093C7 |
:106EA000B9049093BA04A093BB04B093BC0460915E |
:106EB000B9047091BA048091BB049091BC0420E0A5 |
:106EC00031E040E050E00E943A5180918604909178 |
:106ED0008704820F931F909387048093860406C0D3 |
:106EE00081E08093B00402C01092B0044091CA04C3 |
:106EF0005091CB046091CC047091CD04403080EF70 |
:106F000058078FEF68078FEF78070CF05DC080910E |
:106F1000AF04882309F454C088279927DC01841B17 |
:106F2000950BA60BB70BECE0B595A79597958795B4 |
:106F3000EA95D1F72091B3043091B404280F391F9A |
:106F40003093B4042093B304CB01BA0128E030E0BD |
:106F500040E050E00E943A51C901DA018093B9043F |
:106F60009093BA04A093BB04B093BC0488579C4E82 |
:106F7000AF4FBF4F64F488E79CEEAFEFBFEF809355 |
:106F8000B9049093BA04A093BB04B093BC0460917D |
:106F9000B9047091BA048091BB049091BC0420E0C4 |
:106FA00031E040E050E00E943A5180918604909197 |
:106FB0008704820F931F909387048093860411C0E7 |
:106FC00081E08093AF040DC01092AF040AC010920C |
:106FD000B4041092B30488EE93E0909391038093ED |
:106FE00090038091090890910A08883C91050CF063 |
:106FF00058C08091350890913608883C91050CF076 |
:1070000050C08091D207282F30E08091B304909136 |
:10701000B4042817390724F43093B4042093B3043C |
:107020008091CA049091CB04A091CC04B091CD047E |
:1070300081509440A040B04074F080911104909130 |
:1070400012042091B3043091B404820F931F9093E3 |
:107050001204809311048091CA049091CB04A091F2 |
:10706000CC04B091CD0480509C4FAF4FBF4FCCF4B7 |
:1070700080911104909112042091B3043091B404D2 |
:10708000821B930B90931204809311040AC01092F8 |
:10709000870410928604109289041092880410923A |
:1070A000690420E030E040E050E060912B087091EE |
:1070B0002C0880912D0890912E080E94104F882353 |
:1070C00041F4109287041092860410928904109261 |
:1070D000880480911C0890911D08A0911E08B09111 |
:1070E0001F088093AB049093AC04A093AD04B093BD |
:1070F000AE048091230890912408A0912508B091B6 |
:1071000026088093A7049093A804A093A904B093A1 |
:10711000AA0410923504109236041092370410928B |
:1071200038041092390410923A0410923B041092E1 |
:107130003C0410923D0410923E0410923F041092C1 |
:10714000400410921C0810921D0810921E08109204 |
:107150001F081092230810922408109225081092FC |
:10716000260810920E0810920F0810921008109224 |
:1071700011081092FF071092000810920108109257 |
:1071800002081092F7031092F6038091DA03882325 |
:1071900009F481C11092DA0320913E0830913F0832 |
:1071A00030930A082093090837FF08C088279927D9 |
:1071B000821B930B90930A08809309082091520830 |
:1071C0003091530837FF03C0309521953F4F3093DE |
:1071D0003608209335088091090890910A08843672 |
:1071E00091050CF046C1243631050CF042C12091C6 |
:1071F0006104309162048091DB039091DC03281BD1 |
:10720000390B37FF03C0309521953F4F26303105AC |
:107210000CF039C180917D0490917E04439687974C |
:1072200008F097C080916E0490916F048F3F910594 |
:107230002CF4019690936F0480936E0480916E04F9 |
:1072400090916F0403970CF498C0609116087091A8 |
:10725000170880911808909119082AEA35E040E053 |
:1072600050E00E943A5130930A0820930908209177 |
:107270006104309162048091A0079091A107281BBE |
:10728000390B30933608209335084FEF2C343407F0 |
:1072900034F428593E4F30933608209335088091B6 |
:1072A000350890913608853B910534F08856914019 |
:1072B00090933608809335088091090890910A08C8 |
:1072C0002091350830913608821B930B9093360835 |
:1072D00080933508039734F082E090E0909336086D |
:1072E0008093350880913508909136088E5F9F4FC6 |
:1072F00034F48EEF9FEF9093360880933508809199 |
:10730000090890910A0897FF03C0909581959F4FB7 |
:1073100002979CF110921608109217081092180804 |
:107320001092190880916104909162049093A107D2 |
:107330008093A00780911304909114042091350844 |
:1073400030913608821B930B90931404809313049E |
:1073500014C080916104909162049093A10780937E |
:10736000A00710926F0410926E04109216081092EB |
:107370001708109218081092190881E080936C0485 |
:10738000609158087091590880915A0890915B0853 |
:107390002AEA35E040E050E00E943A5179018A0142 |
:1073A000E0925808F092590800935A0810935B082D |
:1073B00020916104309162042E193F0930930A082C |
:1073C00020930908C9010197833B910590F0243B64 |
:1073D000310534F4C9018C549F4F843B910530F43E |
:1073E0000894E108F1080109110908C02C543F4F25 |
:1073F0006CF40894E11CF11C011D111DE092580869 |
:10740000F092590800935A0810935B08809158082D |
:1074100090915908A0915A08B0915B08B7FF0CC031 |
:1074200088599E4FAF4FBF4F80935808909359088B |
:10743000A0935A08B0935B0860915808709159085E |
:1074400080915A0890915B0828E631E040E050E0D6 |
:107450000E943A512AEA35E040E050E00E94C650CE |
:10746000609358087093590880935A0890935B086A |
:107470000AC010926C04109216081092170810920D |
:1074800018081092190880916104909162049093F9 |
:10749000DC038093DB03E091A407F0E0EE0FFF1F15 |
:1074A000EC58F84F208131818091550890E037FFEA |
:1074B00003C0309521953F4F28173907D4F5E09147 |
:1074C000A507F0E0EE0FFF1FEC58F84F0190F08198 |
:1074D000E02DF7FF03C0F095E195FF4FE817F9079E |
:1074E00044F58091C6089091C708892B11F19091BD |
:1074F00003089B3A50F08091AC0785FF06C080914D |
:107500006D04833061F084E00EC09A3A90F480916B |
:10751000AC0785FF0EC080916D04843019F4109281 |
:107520006D0403C083E080936D0480916D0490E04E |
:1075300008C080916D04882331F010926D0480E0C2 |
:1075400090E00E9438468091B1089091B208892B52 |
:1075500029F08091C2048C3009F4429880917D0416 |
:1075600090917E0497FF03C0909581959F4F40971F |
:107570003CF08091AC0784FD03C081E08093C1049E |
:10758000F090B507C0907D04D0907E04B6018827A6 |
:1075900077FD8095982F2F2D30E040E050E00E943D |
:1075A000C650F601D7FE04C0EE27FF27EC19FD09EF |
:1075B0009F01442737FD4095542F0E94C65020E07C |
:1075C00032E040E050E00E943A5189019A018F2D4B |
:1075D00090E0DC01AC9DC001AD9D900DBC9D900D77 |
:1075E000112464E070E00E940551600F711F88272C |
:1075F00077FD8095982F6093DA047093DB04809375 |
:10760000DC049093DD0420915504309156044091A0 |
:10761000570450915804261B370B480B590B2093E5 |
:107620005504309356044093570450935804215501 |
:10763000334C4040504064F080E593ECA0E0B0E073 |
:107640008093550490935604A0935704B093580424 |
:107650008091550490915604A0915704B09158041C |
:10766000805B9C43AF4FBF4F64F480EB9CE3AFEF74 |
:10767000BFEF8093550490935604A0935704B093A2 |
:1076800058048091610490916204892B09F463C0CD |
:107690008091AC0783FF5FC08091DD039091DE0392 |
:1076A000892B09F458C02091350830913608809113 |
:1076B000090890910A088217930724F430930A0866 |
:1076C0002093090880916C04882371F08091C10493 |
:1076D000882351F080916104909162049093640436 |
:1076E000809363041092C1048091A203282F30E09C |
:1076F00030930A08209309082115310561F1809122 |
:107700006C04882341F18091650490916604AC017A |
:10771000249FC001259F900D349F900D112460E29D |
:1077200070E00E940551882777FD8095982F209161 |
:107730005504309156044091570450915804260F37 |
:10774000371F481F591F2093550430935604409308 |
:107750005704509358048091C20481508093C2040E |
:107760008F5F09F0F4C088E18093C2048091D50353 |
:107770009091D6032091080330910903822393232B |
:10778000892B29F488B194E0892788B907C08091B2 |
:107790008104882311F0429A01C04298E090B80712 |
:1077A000FF2400E010E06091250470912604809190 |
:1077B000270490912804A80197010E943A51309320 |
:1077C00019072093180760912D0470912E04809161 |
:1077D0002F0490913004A80197010E943A513093F0 |
:1077E0001B0720931A0780913E0890913F089093C1 |
:1077F0001D0780931C078091520890915308909325 |
:107800001F0780931E07809144089091450890932C |
:1078100021078093200780918204909183049093A4 |
:1078200023078093220780916104909162049093D2 |
:1078300029078093280780910E0390910F0390935E |
:107840002B0780932A07609155047091560480910C |
:1078500057049091580420E830E040E050E00E9446 |
:107860003A5130932D0720932C076091580870915E |
:10787000590880915A0890915B082AEA35E040E067 |
:1078800050E00E943A5130932F0720932E078091A9 |
:10789000330890913408909347078093460780916E |
:1078A0003708909138089093490780934807809152 |
:1078B0000B0890910C0890934B0780934A07809196 |
:1078C000CF089091D00890934D0780934C078091FA |
:1078D000D1089091D20890934F0780934E078091E2 |
:1078E000D3089091D40890935107809350078091CA |
:1078F000D8089091D9089C0103E0220F331F0A9504 |
:10790000E1F7880F991F280F391F8091B1089091D6 |
:10791000B208280F391F80916D0442E3849FC00193 |
:107920001124280F391F3093530720935207809159 |
:10793000EE049091EF049093550780935407809143 |
:10794000F0049091F104909357078093560780912B |
:107950008A048823A9F06091050870910608882799 |
:1079600077FD8095982F0E94AF4F20914908309164 |
:107970004A0840914B0850914C080E94635032C015 |
:10798000E0900508F09006086091250470912604A7 |
:1079900080912704909128040E94AF4F20912B08DA |
:1079A00030912C0840912D0850912E080E94635070 |
:1079B0005B016C010027F7FC0095102FC801B7018F |
:1079C0000E94AF4F2091490830914A0840914B08DE |
:1079D00050914C080E9463509B01AC01C601B50157 |
:1079E0000E94AC4E0E947C4F70930608609305087D |
:1079F00080918B048823A9F06091F9077091FA07B0 |
:107A0000882777FD8095982F0E94AF4F20914908D5 |
:107A100030914A0840914B0850914C080E946350A5 |
:107A200032C0E090F907F090FA0760912D04709150 |
:107A30002E0480912F04909130040E94AF4F20912A |
:107A40002B0830912C0840912D0850912E080E944F |
:107A500063505B016C010027F7FC0095102FC801F3 |
:107A6000B7010E94AF4F2091490830914A084091D8 |
:107A70004B0850914C080E9463509B01AC01C60119 |
:107A8000B5010E94AC4E0E947C4F7093FA07609340 |
:107A9000F9076091440870914508882777FD809523 |
:107AA000982F0E94AF4F7B018C0160914908709123 |
:107AB0004A0880914B0890914C089B01AC010E94B0 |
:107AC000AC4E9B01AC01C801B7010E9463507B0121 |
:107AD0008C01609141047091420480914304909123 |
:107AE00044040E94AF4F20912B0830912C08409104 |
:107AF0002D0850912E080E94635020E030E040E0B5 |
:107B00005FE30E9463509B01AC01C801B7010E9472 |
:107B1000AC4E0E947C4F709345086093440880915E |
:107B2000050890910608909343078093420780913F |
:107B3000F9079091FA079093450780934407809145 |
:107B40000508909106088150904434F080E090E45C |
:107B50009093060880930508809105089091060887 |
:107B60008050904C34F480E090EC90930608809321 |
:107B700005088091F9079091FA078150904434F0FC |
:107B800080E090E49093FA078093F9078091F907D9 |
:107B90009091FA078050904C34F480E090EC9093F0 |
:107BA000FA078093F9078091440890914508815025 |
:107BB000904434F080E090E490934508809344082A |
:107BC00080914408909145088050904C34F480E0B6 |
:107BD00090EC9093450880934408C980DA80CC0CDF |
:107BE000DD1CCC0CDD1C8091AC0780FFD5C09091D2 |
:107BF0009F0381FF0EC0923310F580918204909113 |
:107C000083044497909385048093840410926804BD |
:107C100019C02091AA033091AB03290F311D809127 |
:107C2000B10790E0AC01249FC001259F900D349FC7 |
:107C3000900D11244497909385048093840481E0EF |
:107C40008093680480916704882321F01092850452 |
:107C50001092840420918204309183044091840422 |
:107C600050918504421753070CF096C08091680428 |
:107C7000882309F491C08091A00390E0241B350B68 |
:107C8000BC01629FC001639F900D729F900D1124F3 |
:107C900064E070E00E9405514B01A090F403B090A5 |
:107CA000F50360915D0470915E0480915F04909192 |
:107CB0006004E090A103FF2400E010E020E830E041 |
:107CC00040E050E00E943A51C801B7010E94C650FE |
:107CD00020E230E040E050E00E943A51F9017EEFAE |
:107CE000283E370714F4E8EEFEEF8091C30490912C |
:107CF000C4049C01A4E0220F331FAA95E1F7281BBE |
:107D0000390BC50162E070E00E940551261B370B5C |
:107D100028193909CF01A1E0E931FA0714F088E107 |
:107D200091E0281B390BC9018C0D9D1D60E170E0AD |
:107D30000E9405517093C4046093C3042091AD0761 |
:107D400030E0220F331F220F331F62177307ACF48A |
:107D5000C216D30624F03093C4042093C304809148 |
:107D6000AD0790E0880F991F880F991FC816D90694 |
:107D700024F4D092C404C092C3048091C3049091AF |
:107D8000C404C816D90624F4D092C404C092C30413 |
:107D9000C090C304D090C4048091430890E04497FD |
:107DA000880F991F880F991F46018C159D050CF4AB |
:107DB0004C01909227078092260700914408109169 |
:107DC00045086091DA047091DB048091DC049091A5 |
:107DD000DD042CEF3FEF4FEF5FEF0E94C650060F20 |
:107DE000171FB1EA8B169104A4F0940135952795DD |
:107DF000021713070CF49801C40162E070E00E94BE |
:107E00000551709561957F4F261737077CF49B01CC |
:107E10000DC0C801EFEF003B1E0714F480EB9FEF8D |
:107E20009C018135910514F020E530E080914308F4 |
:107E300090E0880F991F880F991FAC0148195909C4 |
:107E4000421753070CF49A01A401481B590B39013E |
:107E5000241735070CF43A01709225076092240725 |
:107E600080910508909106084090790450907A041A |
:107E70008419950990931B0880931A08E0902B08A9 |
:107E8000F0902C0800912D0810912E0820E030E091 |
:107E900040E050E0C801B7010E94104F8823D1F1A3 |
:107EA0006091E2047091E3048091E4049091E50410 |
:107EB0000E94AF4F5B016C01609125047091260414 |
:107EC00080912704909128040E94AF4FA801970148 |
:107ED0000E9463507B018C01B201882777FD809559 |
:107EE000982F0E94AF4F9B01AC01C801B7010E94BF |
:107EF000AB4E9B01AC01C601B5010E94AC4E0E9485 |
:107F00007C4F6093E2047093E3048093E4049093C5 |
:107F1000E5041CC020911A0830911B08442737FD46 |
:107F20004095542F8091E2049091E304A091E404E1 |
:107F3000B091E504820F931FA41FB51F8093E20444 |
:107F40009093E304A093E404B093E5048091E204E9 |
:107F50009091E304A091E404B091E50481509A4F1C |
:107F6000A040B04064F080E09AEFA0E0B0E08093E1 |
:107F7000E2049093E304A093E404B093E5048091B9 |
:107F8000E2049091E304A091E404B091E5048050F0 |
:107F90009640AF4FBF4F64F480E096E0AFEFBFEF85 |
:107FA0008093E2049093E304A093E404B093E50487 |
:107FB00060911A0870911B08882777FD8095982F8B |
:107FC0000E94AF4F7B018C016091E2047091E30449 |
:107FD0008091E4049091E5040E94AF4F20919A03B0 |
:107FE00030919B0340919C0350919D030E946350EC |
:107FF0009B01AC01C801B7010E94AC4E0E947C4FAE |
:108000008B01C30177FE04C0882799278619970939 |
:1080100095958795880D991D1C01442437FC409443 |
:10802000542C2091A90330E040E050E0C201B1019E |
:108030000E94C65020E430E040E050E00E943A51F7 |
:10804000A901622F232F041715071CF4C801602F04 |
:10805000292FEE27FF27E41BF50B862F922F8C018B |
:108060000E171F070CF48F01F301E80DF91DCF0166 |
:10807000800F911F64E070E00E94055177FF03C0FC |
:1080800060E070E007C08091430890E08617970792 |
:108090000CF4BC018091080890E0681779070CF493 |
:1080A000BC016093FB07CF01801B910B64E070E083 |
:1080B0000E94055177FF03C060E070E007C0809127 |
:1080C000430890E0861797070CF4BC0180910808DC |
:1080D00090E0681779070CF4BC0160930408809164 |
:1080E000F9079091FA07A0917B04B0917C04B887BE |
:1080F000AF838A1B9B0B9093F8078093F707E09060 |
:108100002B08F0902C0800912D0810912E0820E0EB |
:1081100030E040E050E0C801B7010E94104F8823D2 |
:10812000E1F16091DE047091DF048091E0049091B0 |
:10813000E1040E94AF4F5B016C0160912D047091CE |
:108140002E0480912F04909130040E94AF4FA8011B |
:1081500097010E9463507B018C01EF81F885BF017C |
:10816000882777FD8095982F0E94AF4F9B01AC0127 |
:10817000C801B7010E94AB4E9B01AC01C601B5011D |
:108180000E94AC4E0E947C4F6093DE047093DF042B |
:108190008093E0049093E1041CC02091F707309194 |
:1081A000F807442737FD4095542F8091DE049091C5 |
:1081B000DF04A091E004B091E104820F931FA41F9B |
:1081C000B51F8093DE049093DF04A093E004B09386 |
:1081D000E1048091DE049091DF04A091E004B0916D |
:1081E000E10481509A4FA040B04064F080E09AEFE3 |
:1081F000A0E0B0E08093DE049093DF04A093E0045D |
:10820000B093E1048091DE049091DF04A091E0043A |
:10821000B091E10480509640AF4FBF4F64F480E0CE |
:1082200096E0AFEFBFEF8093DE049093DF04A0935E |
:10823000E004B093E1046091F7077091F807882794 |
:1082400077FD8095982F0E94AF4F7B018C01609144 |
:10825000DE047091DF048091E0049091E1040E94BB |
:10826000AF4F20919A0330919B0340919C03509112 |
:108270009D030E9463509B01AC01C801B7010E949D |
:10828000AC4E0E947C4F7B018C012091A90330E011 |
:1082900040E050E0C201B1010E94C65020E430E04D |
:1082A00040E050E00E943A51C901E216F3060CF496 |
:1082B0009701EE27FF27E81BF90BE217F3070CF4F1 |
:1082C000F901C401861997098E0F9F1F64E070E0C1 |
:1082D0000E94055177FF03C060E070E007C0809105 |
:1082E000430890E0861797070CF4BC0180910808BA |
:1082F00090E0681779070CF4BC0160933B088E1A74 |
:108300009F0AC4018619970964E070E00E94055134 |
:1083100077FF03C060E070E007C08091430890E001 |
:10832000861797070CF4BC018091080890E0681745 |
:1083300079070CF4BC0160932F0828960FB6F894C7 |
:10834000DEBF0FBECDBFCF91DF911F910F91FF9088 |
:10835000EF90DF90CF90BF90AF909F908F907F90E5 |
:108360006F905F904F903F902F90089581E08093A1 |
:10837000A40782E08093A50793E09093A607E4E02A |
:10838000E093A70755E05093A80776E07093A907FC |
:1083900087E08093AA0768E06093AB0788EE80933C |
:1083A000AC073EE13093AD078BEF8093AF078AE0D7 |
:1083B0008093B0073093AE073093B2079093B10724 |
:1083C0006093B30790E19093B4077093B5076093FF |
:1083D000B60786EE8093B7073093B80780E880939E |
:1083E000B90744E64093BA0788E78093BB078EE558 |
:1083F0008093BC0783E28093BD0784E18093BE072E |
:108400001092BF079093C0071092C1071092C20745 |
:108410001092C3071092C4071092D4071092D50788 |
:108420001092D6071092D7074093C50788E2809331 |
:10843000C6071092E60792E39093C70786E98093F8 |
:10844000C8075093C9079093CA072AE52093CB0722 |
:108450009093CC071092E5072093CD075093CE0759 |
:1084600085E58093CF078093D00780E28093D10782 |
:10847000E093D2079093D3078FE58093D80783EFDB |
:108480008093DA073093D9073093DB078DEF809321 |
:10849000DC074093DD072093DE072093DF0720935E |
:1084A000E0071092E1077093E2076093E307ABEEF9 |
:1084B000B7E0E5E7F3E08CE001900D928150E1F741 |
:1084C000089581E08093A40782E08093A50723E0CC |
:1084D0002093A607F4E0F093A70735E03093A807B0 |
:1084E00066E06093A90787E08093AA0758E050935D |
:1084F000AB0788E68093AC079EE19093AD078BEFC6 |
:108500008093AF078AE08093B0079093AE07909373 |
:10851000B2072093B1078CE08093B307E0E1E093CA |
:10852000B4076093B5075093B60786EE8093B707FC |
:108530009093B80780E88093B90780E58093BA07E5 |
:1085400088E78093BB078EE58093BC0783E2809326 |
:10855000BD079093BE071092BF0740E24093C0074B |
:108560001092C1071092C2071092C3071092C4075D |
:108570001092D4071092D5071092D6071092D70701 |
:1085800074E67093C50788E28093C6071092E607E9 |
:1085900092E39093C70786E98093C8073093C90791 |
:1085A0009093CA072AE52093CB079093CC071092AB |
:1085B000E5072093CD073093CE0785E58093CF075D |
:1085C0008093D0074093D107F093D2078BE4809338 |
:1085D000D3078FE58093D80783EF8093DA0784E190 |
:1085E0008093D9078093DB078DEF8093DC0770932E |
:1085F000DD072093DE07E093DF072093E00710926A |
:10860000E1076093E2075093E307ABEEB7E0EFE7D3 |
:10861000F3E08CE001900D928150E1F7089581E044 |
:108620008093A40782E08093A50783E08093A60748 |
:1086300064E06093A70745E04093A807E6E0E09375 |
:10864000A90787E08093AA0778E07093AB0788E6D4 |
:108650008093AC079EE19093AD078BEF8093AF07BB |
:108660008AE08093B0079093AE079093B20760932F |
:10867000B1073FE03093B3079093B4078CE0809349 |
:10868000B5077093B60786EE8093B7079093B80747 |
:1086900080E88093B90780E58093BA0756E9509344 |
:1086A000BB0724E62093BC0783E28093BD07909329 |
:1086B000BE071092BF0780E28093C0071092C107E7 |
:1086C0001092C2071092C3071092C4071092D407E9 |
:1086D0001092D5071092D6071092D7072093C5079E |
:1086E00088E28093C6071092E60782E38093C7076B |
:1086F0005093C8074093C9078093CA079AE590939F |
:10870000CB078093CC071092E5079093CD07409359 |
:10871000CE0785E58093CF078093D00780E18093D3 |
:10872000D1076093D2072093D3078FE58093D807B2 |
:1087300083EF8093DA073093D9073093DB078DEF0F |
:108740008093DC072093DD078CE38093DE07109293 |
:10875000DF079093E0071092E107E093E207709340 |
:10876000E307ABEEB7E0E7E8F3E08CE001900D92B1 |
:108770008150E1F708951092F7041092F6041092D8 |
:10878000B2081092B1081092D9081092D80810922D |
:108790009D08109283081092EA081092B008109277 |
:1087A000C5081092D5081092EF041092EE041092B2 |
:1087B000F1041092F0041092D7081092D60810928B |
:1087C000C7081092C608089580919D08882309F46F |
:1087D000A1C08091540890E023E0880F991F2A954A |
:1087E000E1F764E670E00E940551709329056093FB |
:1087F00028058091EA08882309F48CC080918308B9 |
:10880000882309F487C08091DE0890E0837090701F |
:1088100002970CF474C08091DF0880FF70C0109242 |
:10882000EA0860918F08709190088091910890916A |
:1088300092082AE030E040E050E00E943A51209354 |
:10884000B3083093B4084093B5085093B6086091CC |
:1088500093087091940880919508909196082AE069 |
:1088600030E040E050E00E943A512093B708309346 |
:10887000B8084093B9085093BA086091970870916E |
:1088800098088091990890919A082AE030E040E099 |
:1088900050E00E943A512093BB083093BC084093AB |
:1088A000BD085093BE0810929D0880917308909166 |
:1088B0007408A0917508B09176088093BF089093D2 |
:1088C000C008A093C108B093C20860917708709166 |
:1088D00078088091790890917A0820EA36E841E09A |
:1088E00050E00E943A513093C4082093C30810927C |
:1088F000830881E08093C50820E030E00DC010922D |
:10890000C508109283081092EA0810929D0822E090 |
:1089100030E002C021E030E0C90108950E94E44344 |
:108920009C01181619060CF44CC08091C608909151 |
:10893000C70823E0883E920730F4885A9D4F9093F1 |
:10894000C7088093C6088091B0088823B1F1809150 |
:10895000B3089091B40820919E0830919F08821B23 |
:10896000930B9093D0088093CF088091B708909193 |
:10897000B8082091A2083091A308821B930B909312 |
:10898000D2088093D1088091BB089091BC082091B7 |
:10899000A6083091A708821B930B9093D40880936C |
:1089A000D30881E08093D50881E090E09093D708C8 |
:1089B0008093D60820E030E004C01092D50822E071 |
:1089C00030E0C90108950E94E443892B99F5809114 |
:1089D000B3089091B408A091B508B091B6088093FF |
:1089E0009E0890939F08A093A008B093A10880913F |
:1089F000B7089091B808A091B908B091BA088093CF |
:108A0000A2089093A308A093A408B093A50880910E |
:108A1000BB089091BC08A091BD08B091BE0880939E |
:108A2000A6089093A708A093A808B093A90881E08E |
:108A30008093B0080895482F2091F6043091F704F0 |
:108A40002530310509F49DC0263031058CF42130E4 |
:108A5000310529F1223031051CF4232BD1F003C15B |
:108A60002230310571F12330310509F0FCC02FC0EF |
:108A70002730310509F4E2C0273031050CF492C0EB |
:108A80002830310509F4E5C02930310509F0EBC083 |
:108A9000A2C0853B09F0E7C081E090E0D5C08236F6 |
:108AA00039F482E090E09093F7048093F60404C0D8 |
:108AB0001092F7041092F60410920805109209051E |
:108AC0000895813009F0CFC083E090E0BDC08830C8 |
:108AD00031F0823169F1833009F047C013C02DE9CC |
:108AE00038E0309323052093220580919D08882348 |
:108AF000E1F52251304030932105209320052E5E70 |
:108B00003F4F28C08AEE98E090932305809322057A |
:108B10008091EA08882349F58AED98E09093210531 |
:108B2000809320054096909315058093140516C0F8 |
:108B300023E838E0309323052093220580918308B1 |
:108B4000882399F424523040309321052093200546 |
:108B50002C5D3F4F309315052093140585E090E080 |
:108B60009093F7048093F60404C01092F7041092D7 |
:108B7000F604842F8F5F809308058F5F809309052B |
:108B80000895809312051092130580910805840FB3 |
:108B90008093080590910905980F9093090586E048 |
:108BA00090E052C0382F20E080911205909113057B |
:108BB000820F931F909313058093120590910805DF |
:108BC000940F9093080580910905890F80930905FA |
:108BD00089E090E039C0609112057091130561152C |
:108BE000710509F440C0E0912005F09121058083D2 |
:108BF00080910805840F8093080590910905980FCE |
:108C000090930905CB01019790931305809312056A |
:108C1000892B89F080911405909115058E179F0777 |
:108C200050F03196F0932105E09320053093F7043E |
:108C30002093F604089587E090E006C0809108052F |
:108C4000481789F488E090E09093F7048093F60445 |
:108C5000089580910905481731F4E0912205F091BB |
:108C6000230581E080831092F7041092F6040895A2 |
:108C70002F923F924F925F926F927F928F929F922C |
:108C8000AF92BF92CF92DF92EF92FF920F931F931A |
:108C9000DF93CF93CDB7DEB7A8970FB6F894DEBFBA |
:108CA0000FBECDBF9EA38DA38330910509F4B2C042 |
:108CB0008430910521F0892B09F414C165C7809196 |
:108CC000B1089091B2080197029708F420C18091F1 |
:108CD0000605909107050196909307058093060578 |
:108CE0008536910508F453C71092070510920605C2 |
:108CF00010921B0510921A0510921D0510921C056A |
:108D000010921F0510921E051092FB041092FA0497 |
:108D10001092F9041092F80410920A0510920B05B3 |
:108D200010920C0510920D0510920E0510920F0571 |
:108D300010921005109211051092FE041092FF047B |
:108D40001092000510920105109202051092030581 |
:108D50001092040510920505109225051092240525 |
:108D60001092FD041092FC041092D9081092D808B9 |
:108D70008091D508882309F44AC08091CF0890914A |
:108D8000D0089093C9088093C8086091D108709169 |
:108D9000D2087093CB086093CA0821E02093CE08D4 |
:108DA0009093850880938408709387086093860861 |
:108DB00020938A08709561957F4F909581959F4F7C |
:108DC0000E94BA189C018091C8089091C90897FF29 |
:108DD00003C08AE590E002C08EE091E0821B930B15 |
:108DE000909317058093160540911605509117052D |
:108DF0006091CA087091CB088091C8089091C90809 |
:108E00000E94FA197093190560931805B2C6109262 |
:108E1000CE08B6C68091B1089091B208019709F4C6 |
:108E200076C08091060590910705019690930705FD |
:108E3000809306058955924008F4A9C6109207054B |
:108E4000109206058091D508882309F448C0109235 |
:108E50001D0510921C0510921F0510921E05109200 |
:108E6000FB041092FA041092F9041092F804109284 |
:108E70000A0510920B0510920C0510920D05109228 |
:108E80000E0510920F051092100510921105109208 |
:108E9000FE041092FF04109200051092010510923A |
:108EA0000205109203051092040510920505109218 |
:108EB0002705109226058091CF089091D0089093B5 |
:108EC0008508809384088091D1089091D20890936E |
:108ED00087088093860881E080938A0887C1109272 |
:108EE0008A084EC610920705109206051092EF04EC |
:108EF0001092EE041092F1041092F0041092D9082E |
:108F00001092D8081092B2081092B10843C680910E |
:108F1000B1089091B2088130910509F46AC182309C |
:108F2000910541F0892B09F02BC61092070510928C |
:108F3000060530C68091CE08882309F421C68091A9 |
:108F4000D6089091D708181619060CF04FC18091D9 |
:108F5000D8089091D908099709F448C180911A0559 |
:108F600090911B05019690931B0580931A056091C3 |
:108F70008408709185088091CF089091D008AB014A |
:108F8000481B590B57FF03C0509541955F4F2091E7 |
:108F90008608309187088091D1089091D208281BCB |
:108FA000390B37FF03C0309521953F4FE0912405E1 |
:108FB000F091250580911805909119058E1B9F0B46 |
:108FC000813591050CF442C04436510564F42436D1 |
:108FD00031054CF48091FC049091FD0481319105A0 |
:108FE000CCF4049613C0483C51050CF5283C3105DF |
:108FF000F4F48091FC049091FD048B30910514F001 |
:10900000019704C08A30910529F001969093FD04E0 |
:109010008093FC048091FC049091FD048E0F9F1FAF |
:10902000909325058093240583E090E027C08091EC |
:10903000FC049091FD04823091052CF001979093EF |
:10904000FD048093FC0484E090E018C0C3970CF406 |
:1090500076C0443651055CF42436310544F43A9622 |
:10906000F0932505E093240585E090E007C0319654 |
:10907000F0932505E093240586E090E09093D908CD |
:109080008093D80810921F0510921E0581E090E091 |
:1090900090931D0580931C05A0902405B090250594 |
:1090A000CC24B7FCC094DC2C809116059091170558 |
:1090B0000E9498197C0120902405309025054424B5 |
:1090C00037FC4094542C80911605909117050E940E |
:1090D000F1193C010027F7FC0095102FC801B701DA |
:1090E000A60195010E94C65028EE33E040E050E012 |
:1090F0000E943A518091C8089091C908820F931F2D |
:109100009093850880938408882477FC8094982C19 |
:10911000C401B301A20191010E94C65028EE33E0C0 |
:1091200040E050E00E943A518091CA089091CB08EB |
:10913000820F931F909387088093860857C0443608 |
:1091400051050CF04DC0243631050CF049C087E0C4 |
:1091500090E09093D9088093D80810921D05109242 |
:109160001C0510921F0510921E05633071051CF03E |
:109170006350704006C01FEF6E3F710734F46D5F9F |
:109180007F4F709385086093840880918608909142 |
:1091900087088330910514F0039705C02FEF8E3FA9 |
:1091A00092072CF403969093870880938608809109 |
:1091B00084089091850803960797C0F480918608EB |
:1091C000909187080396079788F41092850810926B |
:1091D0008408109287081092860889E090E002C007 |
:1091E00088E090E09093D9088093D80881E090E0DF |
:1091F000C2C48091D6089091D708181619060CF0B1 |
:10920000B4C4809126059091270501969093270577 |
:10921000809326054091CF085091D0088091840812 |
:1092200090918508481B590B5CA34BA36091D10812 |
:109230007091D2088091860890918708681B790BFD |
:109240007AA369A30091FA041091FB04040F151F7F |
:109250001093FB040093FA04E090F804F090F904F2 |
:10926000E60EF71EF092F904E092F80420906708E9 |
:10927000309068084090690850906A0880916308AF |
:1092800090916408A0916508B09166088D839E83D3 |
:10929000AF83B8871092D7081092D608409107087C |
:1092A000442309F450C0209128053091290580EA13 |
:1092B00095E0289FB001299F700D389F700D1124F3 |
:1092C000882777FD8095982F242F30E040E050E0EC |
:1092D0000E943A51C80117FF04C088279927801BB4 |
:1092E000910B2817390754F0C701F7FE04C08827EF |
:1092F00099278E199F0928173907F4F4C801880F98 |
:10930000991F800F911F880F991F68E070E00E94DD |
:1093100005517093FB046093FA04C701880F991FED |
:109320008E0D9F1D880F991F68E070E00E94055107 |
:109330007093F9046093F80480911E0590911F05C5 |
:109340001816190644F41092FB041092FA041092B5 |
:10935000F9041092F8042091FA043091FB04309340 |
:10936000150820931408A090F804B090F904B09266 |
:109370003108A0923008E0900708FF2400E010E0D8 |
:10938000442737FD4095542FC801B7010E94C650AD |
:1093900020E830E040E050E00E943A5139014A01B3 |
:1093A000CC24B7FCC094DC2CC601B501A801970100 |
:1093B0000E94C65020E830E040E050E00E943A5160 |
:1093C00079018A01A0912805B0912905B8A7AFA31A |
:1093D000CD01880F991F8A0F9B1F880F991F880F37 |
:1093E000991F9C01442737FD4095542F26153705BA |
:1093F000480559052CF42D873E874F87588B1EC092 |
:1094000084EF9FEFEFA1F8A5BC01E69FC001E79FA5 |
:10941000900DF69F900D11245C01CC24B7FCC094F4 |
:10942000DC2C6D867E868F86988A6A147B048C0479 |
:109430009D0424F4AD86BE86CF86D88A2E153F05BE |
:1094400040075107D4F084EF9FEFAFA1B8A5FC010E |
:10945000AE9FC001AF9F900DBE9F900D11249C0147 |
:10946000442737FD4095542FE986FA860B871C87E1 |
:10947000E216F3060407150724F429873A874B8779 |
:109480005C87E0901C05F0901D05F8A2EF8EE0903F |
:109490005E080F8D18A1101611060CF088C0E69416 |
:1094A000E694FF240027F7FC0095102FC801B701B0 |
:1094B000A20191010E94C65022E330E040E050E05A |
:1094C0000E943A5159016A01C801B7012D813E81BC |
:1094D0004F8158850E94C65022E330E040E050E0C2 |
:1094E0000E943A5179018A018CE190E02FA138A5C0 |
:1094F000AC01249FC001259F900D349F900D112435 |
:109500009C01442737FD4095542F2A153B054C05F7 |
:109510005D052CF4298B3A8B4B8B5C8B1EC084EE43 |
:109520009FEF6FA178A5DC016A9FC0016B9F900D32 |
:109530007A9F900D11243C01882477FC8094982C0C |
:10954000A98ABA8ACB8ADC8AA614B704C804D904CB |
:1095500024F4698A7A8A8B8A9C8A2E153F054007F3 |
:109560005107C4F084EE9FEFEFA1F8A59C01E29FA4 |
:10957000C001E39F900DF29F900D11249C014427A0 |
:1095800037FD4095542F17012801E216F306040712 |
:10959000150714F419012A019091FC0786E0989FA1 |
:1095A000C0011124959587959595879573C0E6948C |
:1095B000E694FF240027F7FC0095102FC801B7019F |
:1095C000A20191010E94C65029E130E040E050E044 |
:1095D0000E943A5159016A01C801B7012D813E81AB |
:1095E0004F8158850E94C65029E130E040E050E0AC |
:1095F0000E943A5179018A016FA178A555E0660F62 |
:10960000771F5A95E1F79B01442737FD4095542F6A |
:109610002A153B054C055D052CF4298B3A8B4B8BA9 |
:109620005C8B16C088279927861B970B3C018824E2 |
:1096300077FC8094982CA98ABA8ACB8ADC8AA614F3 |
:10964000B704C804D90424F4698A7A8A8B8A9C8A6C |
:109650002E153F0540075107B4F08FA198A545E0AE |
:10966000880F991F4A95E1F7909581959F4F9C012E |
:10967000442737FD4095542F17012801E216F306C1 |
:109680000407150714F419012A018091FC0790E0E2 |
:10969000959587957C010027F7FC0095102F6BA10D |
:1096A0007CA19B01442737FD4095542FC801B70189 |
:1096B0000E94C65028E230E040E050E00E943A515B |
:1096C00059016A01A092FE04B092FF04C092000505 |
:1096D000D092010589A19AA19C01442737FD4095AC |
:1096E000542FC801B7010E94C65028E230E040E084 |
:1096F00050E00E943A5179018A01E0920205F0920D |
:1097000003050093040510930505AF8DB8A11A1643 |
:109710001B060CF050C08CE190E0EFA1F8A59C0175 |
:10972000E29FC001E39F900DF29F900D11243C0138 |
:10973000882477FC8094982C6A147B048C049D0404 |
:109740004CF46092FE047092FF04809200059092A7 |
:1097500001051EC084EE9FEF4FA158A5BC01469F96 |
:10976000C001479F900D569F900D11249C014427E6 |
:1097700037FD4095542FA216B306C406D50644F40F |
:109780002093FE043093FF0440930005509301059D |
:109790006E147F04800691060CF44FC084EE9FEF98 |
:1097A000AFA1B8A5FC01AE9FC001AF9F900DBE9FB9 |
:1097B000900D112457C08CE190E02FA138A5AC0189 |
:1097C000249FC001259F900D349F900D11243C01D2 |
:1097D000882477FC8094982C6A147B048C049D0464 |
:1097E0004CF46092FE047092FF0480920005909207 |
:1097F00001051EC084EE9FEF6FA178A5DC016A9F72 |
:10980000C0016B9F900D7A9F900D11249C014427FD |
:1098100037FD4095542FA216B306C406D50644F46E |
:109820002093FE043093FF044093000550930105FC |
:109830006E147F04800691064CF4609202057092CB |
:10984000030580920405909205051EC084EE9FEFEB |
:10985000EFA1F8A59C01E29FC001E39F900DF29F4C |
:10986000900D11249C01442737FD4095542FE2169A |
:10987000F3060407150744F420930205309303050B |
:1098800040930405509305058091FE049091FF04D8 |
:10989000A0910005B091010590930C0880930B08EE |
:1098A0002091020530910305409104055091050572 |
:1098B0003093570820935608ED84FE840F8518894D |
:1098C000E80EF91E0A1F1B1F69897A898B899C89FA |
:1098D000E60EF71E081F191FD801C701B095A09505 |
:1098E000909581959F4FAF4FBF4F80930A059093FE |
:1098F0000B05A0930C05B0930D05E984FA840B8544 |
:109900001C85E20EF31E041F151FE20CF31C041D40 |
:10991000151D57016801D094C094B094A094A11C67 |
:10992000B11CC11CD11CA0920E05B0920F05C092B3 |
:109930001005D09211059093340880933308B092AB |
:109940003808A092370860915808709159088091A2 |
:109950005A0890915B082AEA35E040E050E00E9406 |
:109960003A5179018A01C9010E94F1199A8F898FB0 |
:1099700020910A0530910B0540910C0550910D0581 |
:109980002B8F3C8F4D8F5E8FC7010E949819988F47 |
:109990008F8B40912805509129055C834B83609003 |
:1099A0000A0570900B0580900C0590900D05C7017D |
:1099B0000E94F1198C0120900E0530900F05409007 |
:1099C000100550901105C7010E9498199E8B8D8B30 |
:1099D00060912805709129057A8369832BA13CA1A8 |
:1099E00037FF03C0309521953F4F2159314054F442 |
:1099F00029A13AA137FF03C0309521953F4F215946 |
:109A000031404CF01092F1041092F0041092EF04E7 |
:109A10001092EE04B5C080918207909183078091E7 |
:109A2000820790918307B801882777FD8095982F4A |
:109A3000A40193010E94C6507B018C01AD89BE89AF |
:109A4000BD01882777FD8095982FA20191010E9482 |
:109A5000C650E61AF70A080B190B88EE93E0E98165 |
:109A6000FA81E89F9001E99F300DF89F300D112495 |
:109A7000442737FD4095542FC801B7010E943A5141 |
:109A8000C901DA01883DFFEF9F07FFEFAF07FFEF46 |
:109A9000BF0724F488ED9FEFAFEFBFEF8932910548 |
:109AA000A105B10524F088E290E0A0E0B0E0909339 |
:109AB000F1048093F004EF88F88CB701882777FDD4 |
:109AC0008095982F2B8D3C8D4D8D5E8D0E94C650BC |
:109AD0007B018C01298D3A8DB901882777FD80950E |
:109AE000982FA60195010E94C650E60EF71E081F8A |
:109AF000191F10950095F094E094E11CF11C011DD4 |
:109B0000111D88EE93E04B815C81489F9001499F35 |
:109B1000300D589F300D1124442737FD4095542FA8 |
:109B2000C801B7010E943A51C901DA01883D5FEFCF |
:109B300095075FEFA5075FEFB50724F488ED9FEF6A |
:109B4000AFEFBFEF89329105A105B10524F088E29E |
:109B500090E0A0E0B0E09093EF048093EE046DA15C |
:109B60007EA164307105B1F404C08DA19EA104975B |
:109B700089F482E090E09093B2088093B1080AC023 |
:109B80001092B2081092B10822E030E005C021E046 |
:109B900030E002C020E030E0C901A8960FB6F8948A |
:109BA000DEBF0FBECDBFCF91DF911F910F91FF9010 |
:109BB000EF90DF90CF90BF90AF909F908F907F906D |
:109BC0006F905F904F903F902F90089587B18C6079 |
:109BD00087B94298439810922F0580E88093B1038B |
:109BE000109230058093B203089580913105815021 |
:109BF000809331058F5F09F068C084E08093310560 |
:109C00008091D9078B3F80F080912208873E28F011 |
:109C10008091D80787FF25C022C08A3028F4809120 |
:109C2000D80787FF1CC01DC080912F0581508093ED |
:109C30002F058F5FB9F480912208815080932F0502 |
:109C40008091B103813011F480E801C08695809342 |
:109C5000B1038091D8079091B103892311F0429A02 |
:109C600001C042988091DB078B3F88F080914208C9 |
:109C7000873E28F08091DA0787FF07C023C08A302B |
:109C800030F48091DA0787FF1DC0439808958091D2 |
:109C900030058150809330058F5FB9F48091420880 |
:109CA0008150809330058091B203813011F480E8B7 |
:109CB00001C086958093B2038091DA079091B20338 |
:109CC000892311F0439A089543980895FC01415067 |
:109CD000504030F001900616D1F73197CF0108952A |
:109CE000882799270895A0E0B0E0E9E7FEE40C9406 |
:109CF0005F517C01EB018A01690109C0CE01219607 |
:109D0000F6010995F70181937F010150104001157B |
:109D10001105A1F7CDB7DEB7E8E00C947B51A0E0C8 |
:109D2000B0E0E5E9FEE40C945F51EC017B018A01AF |
:109D3000690109C0F70161917F01CE012196F60109 |
:109D400009950150104001151105A1F7CDB7DEB7F7 |
:109D5000E8E00C947B515058BB27AA270ED075C160 |
:109D600066D130F06BD120F031F49F3F11F41EF436 |
:109D70005BC10EF4E095E7FB51C1E92F77D180F389 |
:109D8000BA17620773078407950718F071F49EF5F8 |
:109D90008FC10EF4E0950B2EBA2FA02D0B01B90147 |
:109DA00090010C01CA01A0011124FF27591B99F051 |
:109DB000593F50F4503E68F11A16F040A22F232F5D |
:109DC000342F4427585FF3CF469537952795A795AD |
:109DD000F0405395C9F77EF41F16BA0B620B730B54 |
:109DE000840BBAF09150A1F0FF0FBB1F661F771FC5 |
:109DF000881FC2F70EC0BA0F621F731F841F48F47A |
:109E0000879577956795B795F7959E3F08F0B3CFFF |
:109E10009395880F08F09927EE0F979587950895E9 |
:109E2000D9D008F481E008950CD00FC107D140F0DB |
:109E3000FED030F021F45F3F19F0F0C0511139C16C |
:109E4000F3C014D198F39923C9F35523B1F3951BAB |
:109E5000550BBB27AA2762177307840738F09F5F4B |
:109E60005F4F220F331F441FAA1FA9F333D00E2EBA |
:109E70003AF0E0E830D091505040E695001CCAF727 |
:109E800029D0FE2F27D0660F771F881FBB1F2617EC |
:109E900037074807AB07B0E809F0BB0B802DBF01BF |
:109EA000FF2793585F4F2AF09E3F510568F0B6C0D8 |
:109EB00000C15F3FECF3983EDCF38695779567959C |
:109EC000B795F7959F5FC9F7880F911D9695879570 |
:109ED00097F90895E1E0660F771F881FBB1F62178F |
:109EE00073078407BA0720F0621B730B840BBA0B4D |
:109EF000EE1F88F7E095089504D06894B111D9C099 |
:109F00000895BCD088F09F5790F0B92F9927B7518A |
:109F1000A0F0D1F0660F771F881F991F1AF0BA952D |
:109F2000C9F712C0B13081F0C3D0B1E00895C0C00C |
:109F3000672F782F8827B85F39F0B93FCCF3869523 |
:109F400077956795B395D9F73EF490958095709580 |
:109F500061957F4F8F4F9F4F0895E89409C097FBFD |
:109F60003EF490958095709561957F4F8F4F9F4FF0 |
:109F70009923A9F0F92F96E9BB279395F695879534 |
:109F800077956795B795F111F8CFFAF4BB0F11F4F7 |
:109F900060FF1BC06F5F7F4F8F4F9F4F16C088239E |
:109FA00011F096E911C0772321F09EE8872F762FD4 |
:109FB00005C0662371F096E8862F70E060E02AF015 |
:109FC0009A95660F771F881FDAF7880F9695879501 |
:109FD00097F90895990F0008550FAA0BE0E8FEEFD6 |
:109FE00016161706E807F907C0F012161306E4075D |
:109FF000F50798F0621B730B840B950B39F40A2656 |
:10A0000061F0232B242B252B21F408950A2609F433 |
:10A01000A140A6958FEF811D811D089597F99F6737 |
:10A0200080E870E060E008959FEF80EC08950024E0 |
:10A030000A941616170618060906089500240A94AD |
:10A0400012161306140605060895092E0394000C33 |
:10A0500011F4882352F0BB0F40F4BF2B11F460FFC2 |
:10A0600004C06F5F7F4F8F4F9F4F089557FD9058EB |
:10A07000440F551F59F05F3F71F04795880F97FBCC |
:10A08000991F61F09F3F79F0879508951216130686 |
:10A090001406551FF2CF4695F1DF08C016161706B5 |
:10A0A0001806991FF1CF86957105610508940895EA |
:10A0B000E894BB2766277727CB0197F908958ADFB5 |
:10A0C00008F48FEF08950BD0C0CFB1DF28F0B6DFD2 |
:10A0D00018F0952309F0A2CFA7CF1124EACFC6DF4D |
:10A0E000A0F3959FD1F3950F50E0551F629FF001AB |
:10A0F000729FBB27F00DB11D639FAA27F00DB11D04 |
:10A10000AA1F649F6627B00DA11D661F829F22278C |
:10A11000B00DA11D621F739FB00DA11D621F839F13 |
:10A12000A00D611D221F749F3327A00D611D231FE9 |
:10A13000849F600D211D822F762F6A2F11249F5737 |
:10A1400050408AF0E1F088234AF0EE0FFF1FBB1F5A |
:10A15000661F771F881F91505040A9F79E3F5105F9 |
:10A1600070F05CCFA6CF5F3FECF3983EDCF38695B2 |
:10A1700077956795B795F795E7959F5FC1F7FE2BA4 |
:10A18000880F911D9695879597F90895629FD00144 |
:10A19000739FF001829FE00DF11D649FE00DF11DA2 |
:10A1A000929FF00D839FF00D749FF00D659FF00D51 |
:10A1B0009927729FB00DE11DF91F639FB00DE11D3E |
:10A1C000F91FBD01CF0111240895991B79E004C046 |
:10A1D000991F961708F0961B881F7A95C9F78095E6 |
:10A1E0000895AA1BBB1B51E107C0AA1FBB1FA617DE |
:10A1F000B70710F0A61BB70B881F991F5A95A9F730 |
:10A2000080959095BC01CD01089597FB092E0726F6 |
:10A210000AD077FD04D0E5DF06D000201AF470954F |
:10A2200061957F4F0895F6F7909581959F4F08951A |
:10A23000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F4A |
:10A24000EE1FFF1FA217B307E407F50720F0A21BBC |
:10A25000B30BE40BF50B661F771F881F991F1A9429 |
:10A2600069F760957095809590959B01AC01BD0153 |
:10A27000CF01089597FB092E05260ED057FD04D077 |
:10A28000D7DF0AD0001C38F45095409530952195C1 |
:10A290003F4F4F4F5F4F0895F6F79095809570951B |
:10A2A00061957F4F8F4F9F4F08952F923F924F920E |
:10A2B0005F926F927F928F929F92AF92BF92CF9256 |
:10A2C000DF92EF92FF920F931F93CF93DF93CDB75F |
:10A2D000DEB7CA1BDB0B0FB6F894DEBF0FBECDBFD7 |
:10A2E00009942A88398848885F846E847D848C84A8 |
:10A2F0009B84AA84B984C884DF80EE80FD800C81B1 |
:10A300001B81AA81B981CE0FD11D0FB6F894DEBF93 |
:0CA310000FBECDBFED010895F894FFCF03 |
:10A31C000A010101FF64496E74656772616C4E69D4 |
:10A32C00636B20202020496E74656772616C526FDC |
:10A33C006C6C202020204163634E69636B202020CD |
:10A34C00202020202020416363526F6C6C20202041 |
:10A35C002020202020204779726F476965722020C9 |
:10A36C00202020202020486F6568656E5765727428 |
:10A37C00202020202020476965726D697363686115 |
:10A38C006E7465696C20476173202020202020208A |
:10A39C002020202020204B6F6D7061737356616CF0 |
:10A3AC007565202020205370616E6E756E672020BD |
:10A3BC002020202020204D6573735F696E746567C3 |
:10A3CC005F676965722045727361747A6B6F6D702B |
:10A3DC006173732020204D6F746F725F566F726EB5 |
:10A3EC006520202020204D6F746F725F48696E7459 |
:10A3FC00656E202020204D6F746F725F4C696E6B00 |
:10A40C007320202020204D6F746F725F526563683B |
:10A41C007473202020202020202020202020202089 |
:10A42C002020202020202020202020202020202020 |
:10A43C002020202020202020202020202020202010 |
:10A44C002020202020202020202020202020202000 |
:10A45C0020202020202020202020202020202020F0 |
:10A46C002020202020204E69636B202020202020DB |
:10A47C00202020202020526F6C6C202020202020B7 |
:10A48C0020202020202064656275675F302020200A |
:10A49C0020202020202064656275675F31202020F9 |
:10A4AC0020202020202064656275675F32202020E8 |
:10A4BC0020202020202075746D5F6561737420202E |
:10A4CC0020202020202075746D5F6E6F72746820C0 |
:10A4DC0020202020202075746D5F616C742020205A |
:10A4EC002020202020204750535F53746174652036 |
:10A4FC002020202020204750535F4E69636B202082 |
:10A50C002020202020204750535F526F6C6C20205D |
:10A51C002020202020202800FFFF64008001640000 |
:10A52C00007D0000FF03737373010203040506072B |
:10A53C0008090A48616C6C6F2057656C7400000048 |
:10A54C0000000000000000000000000000000000FF |
:10A55C0000000000000000000000000000000000EF |
:10A56C0000000000000000000000000000000000DF |
:10A57C0000000000000000000000000000000000CF |
:10A58C000000000B01426567696E6E657200004E3B |
:10A59C006F726D616C000053706F72740000640018 |
:10A5AC00F40190D0030090D0030017B7D13830FBE2 |
:10A5BC00103A409696020A644664ECFF0A0B0D0BA7 |
:04A5CC000C0101007D |
:00000001FF |
/branches/salvo_gps/Basis_v0070d/tags/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>28-Oct-2008 22:04:23</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>C:\Mikrokopter\Flight_Crtl\v0070d\</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><SOURCEFILE>led.c</SOURCEFILE><SOURCEFILE>spi.c</SOURCEFILE><SOURCEFILE>math.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>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE><HEADERFILE>led.h</HEADERFILE><HEADERFILE>spi.h</HEADERFILE><HEADERFILE>math.h</HEADERFILE><OTHERFILE>makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>makefile</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 -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Programme\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Programme\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="1" orderaddress="1" ordergroup="1"/></IOView><Files><File00000><FileId>00000</FileId><FileName>fc.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>eeprom.c</FileName><Status>1</Status></File00001></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/salvo_gps/Basis_v0070d/tags/GPS.c |
---|
0,0 → 1,694 |
/* |
This program (files gps.c and gps.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 General Public License and GNU Lesser General Public License for more details. |
You should have received a copy of GNU General Public License (License_GPL.txt) and |
GNU Lesser General Public License (License_LGPL.txt) 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 |
*/ |
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
von Peter Muehlenbrock alias Salvo |
Auswertung der Daten vom GPS im ublox Format |
Hold Modus mit PID Regler |
Rückstuerz zur Basis Funktion |
Umstellung auf NaviParameter an Flight Version 00.70d |
GPS_V durch gps_gain ersetzt, damit Einstellung durch MK Tool möglich wird |
Stand 10.10.2008 |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
*/ |
#include "main.h" |
#include "math.h" |
//#include "gps.h" |
// Defines fuer ublox Messageformat um Auswertung zu steuern |
#define UBLOX_IDLE 0 |
#define UBLOX_SYNC1 1 |
#define UBLOX_SYNC2 2 |
#define UBLOX_CLASS 3 |
#define UBLOX_ID 4 |
#define UBLOX_LEN1 5 |
#define UBLOX_LEN2 6 |
#define UBLOX_CKA 7 |
#define UBLOX_CKB 8 |
#define UBLOX_PAYLOAD 9 |
// ublox Protokoll Identifier |
#define UBLOX_NAV_POSUTM 0x08 |
#define UBLOX_NAV_STATUS 0x03 |
#define UBLOX_NAV_VELED 0x12 |
#define UBLOX_NAV_CLASS 0x01 |
#define UBLOX_SYNCH1_CHAR 0xB5 |
#define UBLOX_SYNCH2_CHAR 0x62 |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
short int ublox_msg_state = UBLOX_IDLE; |
static uint8_t chk_a =0; //Checksum |
static uint8_t chk_b =0; |
short int gps_state,gps_sub_state; //Zustaende der Statemachine |
short int gps_updte_flag; |
static long signed gps_reg_x,gps_reg_y; |
static unsigned int rx_len; |
static unsigned int ptr_payload_data_end; |
unsigned int gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt |
static signed int hdng_2home,dist_2home; //Richtung und Entfernung zur home Position |
static signed gps_tick; //wird bei jedem Update durch das GPS Modul hochgezaehlt |
static short int hold_fast,hold_reset_int; //Flags fuer Hold Regler |
static uint8_t *ptr_payload_data; |
static uint8_t *ptr_pac_status; |
static int dist_flown; |
//static unsigned int int_ovfl_cnt; // Zaehler fuer Overflows des Integrators |
static int gps_quiet_cnt; // Zaehler fuer GPS Off Time beim Kameraausloesen |
static int gps_gain; // // Teilerfaktor Regelabweichung zu Ausgabewert |
short int Get_GPS_data(void); |
NAV_POSUTM_t actual_pos; // Aktuelle Nav Daten werden hier im ublox Format abgelegt |
NAV_STATUS_t actual_status; // Aktueller Nav Status |
NAV_VELNED_t actual_speed; // Aktueller Geschwindigkeits und Richtungsdaten |
GPS_ABS_POSITION_t gps_act_position; // Alle wichtigen Daten zusammengefasst |
GPS_ABS_POSITION_t gps_home_position; // Die Startposition, beim Kalibrieren ermittelt |
GPS_REL_POSITION_t gps_rel_act_position; // Die aktuelle relative Position bezogen auf Home Position |
GPS_REL_POSITION_t gps_rel_hold_position; // Die gespeicherte Sollposition fuer GPS_ Hold Mode |
GPS_REL_POSITION_t gps_rel_start_position; // Die gespeicherte Ausgangsposition fuer GPS_ Home Mode |
// Initialisierung |
void GPS_Neutral(void) |
{ |
ublox_msg_state = UBLOX_IDLE; |
gps_state = GPS_CRTL_IDLE; |
gps_sub_state = GPS_CRTL_IDLE; |
actual_pos.status = 0; |
actual_speed.status = 0; |
actual_status.status = 0; |
gps_home_position.status = 0; // Noch keine gueltige Home Position |
gps_act_position.status = 0; |
gps_rel_act_position.status = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
gps_updte_flag = 0; |
gps_alive_cnt = 0; |
} |
// Home Position sichern falls Daten verfuegbar sind. |
void GPS_Save_Home(void) |
{ |
short int n; |
n = Get_GPS_data(); |
if (n == 0) // Gueltige und aktuelle Daten ? |
{ |
// Neue GPS Daten liegen vor |
gps_home_position.utm_east = gps_act_position.utm_east; |
gps_home_position.utm_north = gps_act_position.utm_north; |
gps_home_position.utm_alt = gps_act_position.utm_alt; |
gps_home_position.status = 1; // Home Position gueltig |
} |
} |
// Relative Position zur Home Position bestimmen |
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
short int Get_Rel_Position(void) |
{ |
short int n = 0; |
n = Get_GPS_data(); |
if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind |
if (gps_alive_cnt < 1000) gps_alive_cnt += 600; // Timeoutzaehler. Wird in Motorregler Routine ueberwacht und dekrementiert |
if (gps_home_position.status > 0) //Nur wenn Home Position vorliegt |
{ |
gps_rel_act_position.utm_east = (int) (gps_act_position.utm_east - gps_home_position.utm_east); |
gps_rel_act_position.utm_north = (int) (gps_act_position.utm_north - gps_home_position.utm_north); |
gps_rel_act_position.utm_alt = (int) (gps_act_position.utm_alt - gps_home_position.utm_alt); |
gps_rel_act_position.status = 1; // gueltige Positionsdaten |
n = 0; |
gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen. |
} |
else |
{ |
n = 2; //keine gueltigen Daten vorhanden |
gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist. |
} |
return (n); |
} |
// Daten aus aktuellen ublox Messages extrahieren |
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
short int Get_GPS_data(void) |
{ |
short int n = 1; |
if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist |
gps_gain = Parameter_NaviGpsGain*8/100; //maximal Wert ist 20 |
// debug_gp_0 = (int)gps_gain; // zum Debuggen |
if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0)) |
{ |
if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind |
{ |
actual_status.status = 0; |
gps_act_position.utm_east = actual_pos.utm_east/10; |
gps_act_position.utm_north = actual_pos.utm_north/10; |
gps_act_position.utm_alt = actual_pos.utm_alt/10; |
actual_pos.status = 0; //neue ublox Messages anfordern |
gps_act_position.speed_gnd = actual_speed.speed_gnd; |
gps_act_position.speed_gnd = actual_speed.speed_gnd; |
gps_act_position.heading = actual_speed.heading/100000; |
actual_speed.status = 0; |
gps_act_position.status = 1; |
n = 0; //Daten gueltig |
} |
else |
{ |
gps_act_position.status = 0; //Keine gueltigen Daten |
actual_speed.status = 0; |
actual_status.status = 0; |
actual_pos.status = 0; //neue ublox Messages anfordern |
n = 2; |
} |
} |
return (n); |
} |
/* |
Daten vom GPS im ublox MSG Format auswerten |
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen |
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein |
*/ |
void Get_Ublox_Msg(uint8_t rx) |
{ |
switch (ublox_msg_state) |
{ |
case UBLOX_IDLE: // Zuerst Synchcharacters pruefen |
if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1; |
else ublox_msg_state = UBLOX_IDLE; |
break; |
case UBLOX_SYNC1: |
if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2; |
else ublox_msg_state = UBLOX_IDLE; |
chk_a = 0,chk_b = 0; |
break; |
case UBLOX_SYNC2: |
if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS; |
else ublox_msg_state = UBLOX_IDLE; |
break; |
case UBLOX_CLASS: // Nur NAV Meldungen auswerten |
switch (rx) |
{ |
case UBLOX_NAV_POSUTM: |
ptr_pac_status = &actual_pos.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden |
else |
{ |
ptr_payload_data = &actual_pos; |
ptr_payload_data_end = &actual_pos.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
case UBLOX_NAV_STATUS: |
ptr_pac_status = &actual_status.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
else |
{ |
ptr_payload_data = &actual_status; |
ptr_payload_data_end = &actual_status.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
case UBLOX_NAV_VELED: |
ptr_pac_status = &actual_speed.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
else |
{ |
ptr_payload_data = &actual_speed; |
ptr_payload_data_end = &actual_speed.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
default: |
ublox_msg_state = UBLOX_IDLE; |
break; |
} |
chk_a = UBLOX_NAV_CLASS + rx; |
chk_b = UBLOX_NAV_CLASS + chk_a; |
break; |
case UBLOX_LEN1: // Laenge auswerten |
rx_len = rx; |
chk_a += rx; |
chk_b += chk_a; |
ublox_msg_state = UBLOX_LEN2; |
break; |
case UBLOX_LEN2: // Laenge auswerten |
rx_len = rx_len + (rx *256); // Laenge ermitteln |
chk_a += rx; |
chk_b += chk_a; |
ublox_msg_state = UBLOX_PAYLOAD; |
break; |
case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen |
if (rx_len > 0) |
{ |
*ptr_payload_data = rx; |
chk_a += rx; |
chk_b += chk_a; |
--rx_len; |
if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end)) |
{ |
ptr_payload_data++; |
ublox_msg_state = UBLOX_PAYLOAD; |
} |
else ublox_msg_state = UBLOX_CKA; |
} |
else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
break; |
case UBLOX_CKA: // Checksum pruefen |
if (rx == chk_a) ublox_msg_state = UBLOX_CKB; |
else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
break; |
case UBLOX_CKB: // Checksum pruefen |
if (rx == chk_b) *ptr_pac_status = 1; // Paket ok |
ublox_msg_state = UBLOX_IDLE; |
break; |
default: |
ublox_msg_state = UBLOX_IDLE; |
break; |
} |
} |
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe |
short int GPS_CRTL(short int cmd) |
{ |
static unsigned int cnt; // Zaehler fuer diverse Verzoegerungen |
static long int delta_north,delta_east; // Mass fuer Distanz zur Sollposition |
signed int n; |
static signed int gps_g2t_act_v; // Aktuelle Geschwindigkeitsvorgabe fuer Home Funktion |
signed int dist_frm_start_east,dist_frm_start_north; |
int amplfy_speed_east,amplfy_speed_north; //Verstaerkungsfaktoren fuer D-Anteil |
static signed int int_east,int_north; //Integrierer |
long int speed_east,speed_north; //Aktuelle Geschwindigkeit |
signed long int_east1,int_north1; |
int dist_east,dist_north; |
int diff_p; //Vom Modus abhaengige zusaetzliche Verstaerkung |
long ni,ro; // Nick und Roll Zwischenwerte |
switch (cmd) |
{ |
case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. |
if ((gps_state != GPS_CRTL_HOLD_ACTIVE) && (gps_state != GPS_CRTL_HOME_ACTIVE)) |
{ |
cnt++; |
if (cnt > 100) // erst nach Verzoegerung |
{ |
// Erst mal initialisieren |
cnt = 0; |
gps_tick = 0; |
hold_fast = 0; |
hold_reset_int = 0; // Integrator enablen |
int_east = 0, int_north = 0; |
gps_reg_x = 0, gps_reg_y = 0; |
delta_east = 0, delta_north = 0; |
dist_flown = 0; |
gps_g2t_act_v = 0; |
gps_sub_state = GPS_CRTL_IDLE; |
// aktuelle positionsdaten abspeichern |
if (gps_rel_act_position.status > 0) |
{ |
gps_rel_start_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_start_position.utm_north= gps_rel_act_position.utm_north; |
gps_rel_start_position.status = 1; // gueltige Positionsdaten |
gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
//Richtung zur Home Position bezogen auf Nordpol bestimmen |
hdng_2home = arctan_i(-gps_rel_start_position.utm_east,-gps_rel_start_position.utm_north); |
// in Winkel 0...360 Grad umrechnen |
if (( gps_rel_start_position.utm_east < 0)) hdng_2home = ( 90-hdng_2home); |
else hdng_2home = (270 - hdng_2home); |
dist_2home = (int) get_dist(gps_rel_start_position.utm_east,gps_rel_start_position.utm_north,hdng_2home); //Entfernung zur Home Position bestimmen |
gps_state = GPS_CRTL_HOME_ACTIVE; |
return (GPS_STST_OK); |
} |
else |
{ |
gps_rel_start_position.status = 0; //Keine Daten verfuegbar |
gps_state = GPS_CRTL_IDLE; |
return(GPS_STST_ERR); // Keine Daten da |
} |
} |
else return(GPS_STST_PEND); // noch warten |
} |
break; |
// ****************************** |
case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden. |
if (gps_state != GPS_CRTL_HOLD_ACTIVE) |
{ |
cnt++; |
if (cnt > 600) // erst nach Verzoegerung |
{ |
cnt = 0; |
// aktuelle positionsdaten abspeichern |
if (gps_rel_act_position.status > 0) |
{ |
hold_fast = 0; |
hold_reset_int = 0; // Integrator enablen |
int_east = 0, int_north = 0; |
gps_reg_x = 0, gps_reg_y = 0; |
delta_east = 0, delta_north = 0; |
speed_east = 0; speed_north= 0; |
// int_ovfl_cnt = 0; |
gps_quiet_cnt = 0; |
gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
gps_state = GPS_CRTL_HOLD_ACTIVE; |
return (GPS_STST_OK); |
} |
else |
{ |
gps_rel_hold_position.status = 0; //Keine Daten verfuegbar |
gps_state = GPS_CRTL_IDLE; |
return(GPS_STST_ERR); // Keine Daten da |
} |
} |
else return(GPS_STST_PEND); // noch warten |
} |
break; |
case GPS_CMD_STOP: // Lageregelung beenden |
cnt = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
gps_sub_state = GPS_CRTL_IDLE; |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_OK); |
break; |
default: |
return (GPS_STST_ERR); |
break; |
} |
switch (gps_state) |
{ |
case GPS_CRTL_IDLE: |
cnt = 0; |
return (GPS_STST_OK); |
break; |
case GPS_CRTL_HOME_ACTIVE: // Rueckflug zur Basis |
//Der Sollwert des Lagereglers wird der Homeposition angenaehert |
if (gps_rel_start_position.status >0) |
{ |
if ((gps_updte_flag > 0) && (gps_sub_state !=GPS_HOME_FINISHED)) // nur wenn neue GPS Daten vorliegen und nicht schon alles fertig ist |
{ |
gps_tick++; |
int d1,d2,d3; |
d1 = abs (gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east ); |
d2 = abs (gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north ); |
d3 = (dist_2home - dist_flown); // Restdistanz zum Ziel |
if (d3 > GPS_G2T_DIST_MAX_STOP) // Schneller Rueckflug, noch weit weg vom Ziel |
{ |
if ((d1 < (GPS_G2T_FAST_TOL/2)) && (d2 < (GPS_G2T_FAST_TOL/2))) //voll Stoff weiter wenn Lage gut innerhalb der Toleranz |
{ |
if (gps_g2t_act_v < GPS_G2T_V_MAX-3) gps_g2t_act_v += 4; //Geschwindigkeit erhoehen |
dist_flown +=gps_g2t_act_v; // Vorgabe der Strecke anhand der Geschwindigkeit |
gps_sub_state = GPS_HOME_FAST_IN_TOL; |
} |
else if ((d1 < GPS_G2T_FAST_TOL) && (d2 < GPS_G2T_FAST_TOL)) //nur weiter wenn Lage innerhalb der Toleranz |
{ |
if (gps_g2t_act_v > (GPS_G2T_V_MAX/2)) gps_g2t_act_v -= 1; //Geschwindigkeit auf Haelfte runter oder rauffahren |
else if (gps_g2t_act_v < (GPS_G2T_V_MAX/2)) gps_g2t_act_v += 1; |
dist_flown +=gps_g2t_act_v; // Vorgabe der Strecke anhand der Geschwindigkeit |
gps_sub_state = GPS_HOME_FAST_IN_TOL; |
} |
else //Den Lageregler in Ruhe arbeiten lassen weil ausserhalb der Toleranz |
{ |
if (gps_g2t_act_v > 1) gps_g2t_act_v--; // Geschwindigkeit reduzieren |
// dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen |
gps_sub_state = GPS_HOME_FAST_OUTOF_TOL; |
} |
hold_reset_int = 0; // Integrator einsschalten |
hold_fast = 1; // Regler fuer schnellen Flug |
dist_frm_start_east = (int)(((long)dist_flown * (long)sin_i(hdng_2home))/1000); |
dist_frm_start_north = (int)(((long)dist_flown * (long)cos_i(hdng_2home))/1000); |
gps_rel_hold_position.utm_east = gps_rel_start_position.utm_east + dist_frm_start_east; //naechster Zielpunkt |
gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt |
} |
else if (d3 > GPS_G2T_DIST_HOLD) //Das Ziel naehert sich, deswegen abbremsen |
{ |
if ((d1 < GPS_G2T_NRML_TOL) && (d2 < GPS_G2T_NRML_TOL)) |
{ |
dist_flown += GPS_G2T_V_RAMP_DWN; // Vorgabe der Strecke anhand der Geschwindigkeit |
gps_sub_state = GPS_HOME_RMPDWN_IN_TOL; |
} |
else |
{ |
dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen |
gps_sub_state = GPS_HOME_RMPDWN_OUTOF_TOL; |
} |
hold_reset_int = 0; // Integrator einsschalten |
hold_fast = 1; // Regler fuer schnellen Flug |
dist_frm_start_east = (int)(((long)dist_flown * (long)sin_i(hdng_2home))/1000); |
dist_frm_start_north = (int)(((long)dist_flown * (long)cos_i(hdng_2home))/1000); |
gps_rel_hold_position.utm_east = gps_rel_start_position.utm_east + dist_frm_start_east; //naechster Zielpunkt |
gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt |
} |
else //Soll-Ziel fast erreicht, Jetzt noch Reste ausgleichen, weil Zielpunkt nicht exakt bestimmt werden konnte (Fehler in Winkelfkt) |
{ |
if ((d1 < GPS_G2T_NRML_TOL) && (d2 < GPS_G2T_NRML_TOL)) // Jetzt bis zum Zielpunkt regeln |
{ |
gps_sub_state = GPS_HOME_IN_TOL; |
hold_fast = 0; // Wieder normal regeln |
hold_reset_int = 0; // Integrator einsschalten |
if (gps_rel_hold_position.utm_east >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_east -= GPS_G2T_V_MIN; |
else if (gps_rel_hold_position.utm_east <= -GPS_G2T_V_MIN ) gps_rel_hold_position.utm_east += GPS_G2T_V_MIN; |
if (gps_rel_hold_position.utm_north >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_north -= GPS_G2T_V_MIN; |
else if (gps_rel_hold_position.utm_north <= - GPS_G2T_V_MIN ) gps_rel_hold_position.utm_north += GPS_G2T_V_MIN; |
if ((abs(gps_rel_hold_position.utm_east) <= GPS_G2T_V_MIN) && (abs(gps_rel_hold_position.utm_north) <=GPS_G2T_V_MIN)) |
{ |
gps_rel_hold_position.utm_east = 0; |
gps_rel_hold_position.utm_north = 0; |
gps_sub_state = GPS_HOME_FINISHED; |
} |
} |
else gps_sub_state = GPS_HOME_OUTOF_TOL; |
} |
} |
gps_state = GPS_CRTL_HOLD_ACTIVE; //Zwischensprung |
return (GPS_STST_OK); |
} |
else // Keine GPS Daten verfuegbar, deswegen Abbruch |
{ |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
} |
break; |
case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet |
if (gps_updte_flag >0) // nur wenn neue GPS Daten vorliegen |
{ |
gps_quiet_cnt++; |
// ab hier wird geregelt |
delta_east = (long) (gps_rel_act_position.utm_east - gps_rel_hold_position.utm_east); |
delta_north = (long) (gps_rel_act_position.utm_north - gps_rel_hold_position.utm_north); |
int_east += (int)delta_east; |
int_north += (int)delta_north; |
speed_east = actual_speed.speed_e; |
speed_north = actual_speed.speed_n; |
gps_updte_flag = 0; // Neue Werte koennen vom GPS geholt werden |
dist_east = (int)delta_east; //merken |
dist_north = (int)delta_north; |
// #define GPSINT_MAX 3000 // Neues Verfahren ab 30.12.2007 bei Integratoroverflow |
long int gpsintmax; |
if (Parameter_NaviGpsI > 0) |
{ |
gpsintmax = (GPS_NICKROLL_MAX * gps_gain * GPS_USR_PAR_FKT * ((32*3)/10))/(long)Parameter_NaviGpsI; //auf ungefeahren Maximalwert begrenzen |
if ((abs(int_east) > (int)gpsintmax) || (abs(int_north)> (int)gpsintmax)) |
{ |
// // = 1; // Zahl der Overflows zaehlen |
// int_ovfl_cnt -= 1; |
int_east = (int_east * 6)/8; // Wert reduzieren |
int_north = (int_north* 6)/8; |
} |
if (hold_reset_int > 0) //Im Schnellen Mode Integrator abschalten |
{ |
int_east = 0; |
int_north = 0; |
} |
} |
else // Integrator deaktiviert |
{ |
int_east = 0; |
int_north = 0; |
} |
debug_gp_4 = (int)int_east; // zum Debuggen |
debug_gp_5 = (int)int_north; // zum Debuggen |
//I Werte begrenzen |
#define INT1_MAX (GPS_NICKROLL_MAX * gps_gain*3)/10// auf 30 Prozent des maximalen Nick/Rollwert begrenzen |
int_east1 = ((((long)int_east) * Parameter_NaviGpsI)/32)/GPS_USR_PAR_FKT; |
int_north1 = ((((long)int_north) * Parameter_NaviGpsI)/32)/GPS_USR_PAR_FKT; |
if (int_east1 > INT1_MAX) int_east1 = INT1_MAX; //begrenzen |
else if (int_east1 < -INT1_MAX) int_east1 = -INT1_MAX; |
if (int_north1 > INT1_MAX) int_north1 = INT1_MAX; //begrenzen |
else if (int_north1 < -INT1_MAX) int_north1 = -INT1_MAX; |
if (hold_fast > 0) //schneller Coming Home Modus |
{ |
amplfy_speed_east = DIFF_Y_F_MAX; |
amplfy_speed_north = DIFF_Y_F_MAX; |
amplfy_speed_east *= (Parameter_NaviGpsD/GPS_USR_PAR_FKT); |
amplfy_speed_north *= (Parameter_NaviGpsD/GPS_USR_PAR_FKT); |
speed_east = (speed_east * (long)amplfy_speed_east) /50; |
speed_north = (speed_north * (long)amplfy_speed_north)/50; |
// D Werte begrenzen |
#define D_F_MAX (GPS_NICKROLL_MAX * gps_gain*7)/10 // auf 70 Prozent des Maximalen Nick/Rollwert begrenzen |
if (speed_east > D_F_MAX) speed_east = D_F_MAX; |
else if (speed_east < -D_F_MAX) speed_east = -D_F_MAX; |
if (speed_north > D_F_MAX) speed_north = D_F_MAX; |
else if (speed_north < -D_F_MAX) speed_north = -D_F_MAX; |
diff_p = (Parameter_NaviGpsP * GPS_PROP_FAST_V)/GPS_USR_PAR_FKT; //Verstaerkung fuer P-Anteil |
} |
else //langsamer Holdmodus |
{ |
amplfy_speed_east = DIFF_Y_N_MAX; |
amplfy_speed_north = DIFF_Y_N_MAX; |
amplfy_speed_east *= (Parameter_NaviGpsD/GPS_USR_PAR_FKT); |
amplfy_speed_north *= (Parameter_NaviGpsD/GPS_USR_PAR_FKT); |
speed_east = (speed_east * (long)amplfy_speed_east) /25; |
speed_north = (speed_north * (long)amplfy_speed_north)/25; |
// D Werte begrenzen |
#define D_N_MAX (GPS_NICKROLL_MAX * gps_gain*8)/10 // auf 80 Prozent des Maximalen Nick/Rollwert begrenzen |
if (speed_east > D_N_MAX) speed_east = D_N_MAX; |
else if (speed_east < -D_N_MAX) speed_east = -D_N_MAX; |
if (speed_north > D_N_MAX) speed_north = D_N_MAX; |
else if (speed_north < -D_N_MAX) speed_north = -D_N_MAX; |
diff_p = (Parameter_NaviGpsP * GPS_PROP_NRML_V)/GPS_USR_PAR_FKT; //Verstaerkung fuer P-Anteil |
} |
// debug_gp_4 = (int)speed_east; // zum Debuggen |
// debug_gp_5 = (int)speed_north; // zum Debuggen |
//P-Werte verstaerken |
delta_east = (delta_east * (long)diff_p)/(40); |
delta_north = (delta_north * (long)diff_p)/(40); |
if (hold_fast > 0) //schneller Coming Home Modus |
{ |
// P Werte begrenzen |
#define P1_F_MAX (GPS_NICKROLL_MAX * gps_gain*7)/10 // auf 70 Prozent des Maximalen Nick/Rollwert begrenzen |
if (delta_east > P1_F_MAX) delta_east = P1_F_MAX; |
else if (delta_east < -P1_F_MAX) delta_east = -P1_F_MAX; |
if (delta_north > P1_F_MAX) delta_north = P1_F_MAX; |
else if (delta_north < -P1_F_MAX) delta_north = -P1_F_MAX; |
} |
else // Hold modus |
{ |
// P Werte begrenzen |
#define P1_N_MAX (GPS_NICKROLL_MAX * gps_gain*7)/10 // auf 70 Prozent des Maximalen Nick/Rollwert begrenzen |
if (delta_east > P1_N_MAX) delta_east = P1_N_MAX; |
else if (delta_east < -P1_N_MAX) delta_east = -P1_N_MAX; |
if (delta_north > P1_N_MAX) delta_north = P1_N_MAX; |
else if (delta_north < -P1_N_MAX) delta_north = -P1_N_MAX; |
} |
debug_gp_2 = (int)delta_east; // zum Debuggen |
debug_gp_3 = (int)delta_north; // zum Debuggen |
//PID Regler Werte aufsummieren |
gps_reg_x = -(int_east1 + delta_east + speed_east); // I + P +D Anteil X Achse |
gps_reg_y = -(int_north1 + delta_north + speed_north); // I + P +D Anteil Y Achse |
debug_gp_0 = (int)gps_reg_x; // zum Debuggen |
debug_gp_1 = (int)gps_reg_y; // zum Debuggen |
// Werte fuer Nick und Roll direkt aus gps_reg_x und gps_reg_y bestimmen |
n = GyroKomp_Int/GIER_GRAD_FAKTOR; //Ausrichtung Kopter |
ni = -((gps_reg_y * (long)cos_i(n)) + (gps_reg_x * (long)sin_i(n)))/(1000*gps_gain); |
ro = ((gps_reg_x * (long)cos_i(n)) - (gps_reg_y * (long)sin_i(n)))/(1000*gps_gain); |
if (ni > (GPS_NICKROLL_MAX )) ni = (GPS_NICKROLL_MAX); |
else if (ni < -(GPS_NICKROLL_MAX )) ni = -(GPS_NICKROLL_MAX ); |
if (ro > (GPS_NICKROLL_MAX )) ro = (GPS_NICKROLL_MAX ); |
else if (ro < -(GPS_NICKROLL_MAX)) ro = -(GPS_NICKROLL_MAX ); |
if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX)) // bei zu grossem Abstand abbrechen |
{ |
GPS_Roll = 0; |
GPS_Nick = 0; |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
break; |
} |
else if ((PPM_in[7] > 100) && (CAM_GPS_QUIET > 0) && (gps_quiet_cnt <=4) ) // Wenn Fotoausloeser gedruckt wird, GPS Stellwerte kurzzeitig auf 0 setzen |
{ |
gps_quiet_cnt++; |
GPS_Roll = 0; |
GPS_Nick = 0; |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
else if ((PPM_in[7] < 50) && (CAM_GPS_QUIET > 0) && (gps_quiet_cnt >= 4)) |
{ |
gps_quiet_cnt = 0; |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
else |
{ |
GPS_Roll = (int)ro; |
GPS_Nick = (int)ni; |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
} |
else |
{ |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
break; |
default: |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
break; |
} |
return (GPS_STST_ERR); |
} |
/branches/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/License_LPGL.txt |
---|
0,0 → 1,165 |
GNU LESSER GENERAL PUBLIC LICENSE |
Version 3, 29 June 2007 |
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
This version of the GNU Lesser General Public License incorporates |
the terms and conditions of version 3 of the GNU General Public |
License, supplemented by the additional permissions listed below. |
0. Additional Definitions. |
As used herein, "this License" refers to version 3 of the GNU Lesser |
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
General Public License. |
"The Library" refers to a covered work governed by this License, |
other than an Application or a Combined Work as defined below. |
An "Application" is any work that makes use of an interface provided |
by the Library, but which is not otherwise based on the Library. |
Defining a subclass of a class defined by the Library is deemed a mode |
of using an interface provided by the Library. |
A "Combined Work" is a work produced by combining or linking an |
Application with the Library. The particular version of the Library |
with which the Combined Work was made is also called the "Linked |
Version". |
The "Minimal Corresponding Source" for a Combined Work means the |
Corresponding Source for the Combined Work, excluding any source code |
for portions of the Combined Work that, considered in isolation, are |
based on the Application, and not on the Linked Version. |
The "Corresponding Application Code" for a Combined Work means the |
object code and/or source code for the Application, including any data |
and utility programs needed for reproducing the Combined Work from the |
Application, but excluding the System Libraries of the Combined Work. |
1. Exception to Section 3 of the GNU GPL. |
You may convey a covered work under sections 3 and 4 of this License |
without being bound by section 3 of the GNU GPL. |
2. Conveying Modified Versions. |
If you modify a copy of the Library, and, in your modifications, a |
facility refers to a function or data to be supplied by an Application |
that uses the facility (other than as an argument passed when the |
facility is invoked), then you may convey a copy of the modified |
version: |
a) under this License, provided that you make a good faith effort to |
ensure that, in the event an Application does not supply the |
function or data, the facility still operates, and performs |
whatever part of its purpose remains meaningful, or |
b) under the GNU GPL, with none of the additional permissions of |
this License applicable to that copy. |
3. Object Code Incorporating Material from Library Header Files. |
The object code form of an Application may incorporate material from |
a header file that is part of the Library. You may convey such object |
code under terms of your choice, provided that, if the incorporated |
material is not limited to numerical parameters, data structure |
layouts and accessors, or small macros, inline functions and templates |
(ten or fewer lines in length), you do both of the following: |
a) Give prominent notice with each copy of the object code that the |
Library is used in it and that the Library and its use are |
covered by this License. |
b) Accompany the object code with a copy of the GNU GPL and this license |
document. |
4. Combined Works. |
You may convey a Combined Work under terms of your choice that, |
taken together, effectively do not restrict modification of the |
portions of the Library contained in the Combined Work and reverse |
engineering for debugging such modifications, if you also do each of |
the following: |
a) Give prominent notice with each copy of the Combined Work that |
the Library is used in it and that the Library and its use are |
covered by this License. |
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
document. |
c) For a Combined Work that displays copyright notices during |
execution, include the copyright notice for the Library among |
these notices, as well as a reference directing the user to the |
copies of the GNU GPL and this license document. |
d) Do one of the following: |
0) Convey the Minimal Corresponding Source under the terms of this |
License, and the Corresponding Application Code in a form |
suitable for, and under terms that permit, the user to |
recombine or relink the Application with a modified version of |
the Linked Version to produce a modified Combined Work, in the |
manner specified by section 6 of the GNU GPL for conveying |
Corresponding Source. |
1) Use a suitable shared library mechanism for linking with the |
Library. A suitable mechanism is one that (a) uses at run time |
a copy of the Library already present on the user's computer |
system, and (b) will operate properly with a modified version |
of the Library that is interface-compatible with the Linked |
Version. |
e) Provide Installation Information, but only if you would otherwise |
be required to provide such information under section 6 of the |
GNU GPL, and only to the extent that such information is |
necessary to install and execute a modified version of the |
Combined Work produced by recombining or relinking the |
Application with a modified version of the Linked Version. (If |
you use option 4d0, the Installation Information must accompany |
the Minimal Corresponding Source and Corresponding Application |
Code. If you use option 4d1, you must provide the Installation |
Information in the manner specified by section 6 of the GNU GPL |
for conveying Corresponding Source.) |
5. Combined Libraries. |
You may place library facilities that are a work based on the |
Library side by side in a single library together with other library |
facilities that are not Applications and are not covered by this |
License, and convey such a combined library under terms of your |
choice, if you do both of the following: |
a) Accompany the combined library with a copy of the same work based |
on the Library, uncombined with any other library facilities, |
conveyed under the terms of this License. |
b) Give prominent notice with the combined library that part of it |
is a work based on the Library, and explaining where to find the |
accompanying uncombined form of the same work. |
6. Revised Versions of the GNU Lesser General Public License. |
The Free Software Foundation may publish revised and/or new versions |
of the GNU Lesser General Public License from time to time. Such new |
versions will be similar in spirit to the present version, but may |
differ in detail to address new problems or concerns. |
Each version is given a distinguishing version number. If the |
Library as you received it specifies that a certain numbered version |
of the GNU Lesser General Public License "or any later version" |
applies to it, you have the option of following the terms and |
conditions either of that published version or of any later version |
published by the Free Software Foundation. If the Library as you |
received it does not specify a version number of the GNU Lesser |
General Public License, you may choose any version of the GNU Lesser |
General Public License ever published by the Free Software Foundation. |
If the Library as you received it specifies that a proxy can decide |
whether future versions of the GNU Lesser General Public License shall |
apply, that proxy's public statement of acceptance of any version is |
permanent authorization for you to choose that version for the |
Library. |
/branches/salvo_gps/Basis_v0070d/tags/README_Gps_Deutsch.txt |
---|
0,0 → 1,87 |
********************************************************************* |
GPS Implementierung von Peter Muehlenbrock ("Salvo") für Mikrokopter/FlightCrtl |
Stand 29.10.2008 |
Verwendung der SW ohne Gewaehr. Siehe auch die Lizenzbedingungen in File Licensce_LPGL.txt und Licensce_GPL.txt |
Die Version basiert auf Holgers V00.70d. |
********************************************************************* |
Hardware-Voraussetzungen: |
Kalibrierter Kompass vom Typ CMPS03, waagrecht eingebaut |
GPS Modul vom Typ ublox, Die Meldungungen "NAV_STATUS", "NAV_POSUTM" und "NAV_VELNED" |
mussen mit 4 HZ Updaterate aktiviert sein. Alle Meldungen im NMEA Format muessen deaktivert sein. |
Anschluss an RX Port der FlightCRtl. Baudrate ist 57600 wie beim Kopter Tool. |
Software-Voraussetzungen: |
In timer0.h muss die Ausrichtung des Kompasses bezogen auf die Nordachse des Kopters |
eingetragen sein. Wenn KOMPASS_OFFSET > 0 wird dieser Wert genommen |
Wenn KOMPASS_OFFSET = 0 ist wird der UserParameter4 verwendet (=hexfile). Da die Userparameter nur ein Byte lang sind werden |
Offsets von 0...358 Grad durch einen Wert von 0...179 dargestellt. |
Betriebs-Voraussetzungen: |
Damit der Kompass sauber funktioniert, muss die waagrechte Lage (Gashebel Vollanschlag und Gier rechts) |
im Eeprom abgespeichert worden sein. |
Parametrierung: |
Der GPS Hold Regler ist ein PID Regler, der ueber die NaviCrtl Parameter gesteuert wird. |
GPS_P beschreibt den P(roportional)-Anteil, GPS_I den I(ntegral)-Anteil und GPS_D den D(ifferential)-Anteil. Mit GPS Gain kann die |
Gesamtverstaerkung eingestellt worden |
Hier kann und muss gespielt werden.Alle Parameter koennen direkt im Mikrokoptertool in den Settings eingestellt werden. |
Der P-Anteil wirkt einer Lageänderung entgegen. Je größer er ist, desto geringer die Regelabweichung, desto höher aber auch die Schwingneigung. |
Der D-Anteil wirkt einer Geschwindigkeitsänderung entgegen und dient zur Reduzierung von Schwingungen, darf aber auch nicht zu gross sein. |
Der I-Anteil dient nur dazu die Lageabweichung auf Null zu bringen. |
P und D Anteil mussen gut aufeinander abgestimmt sein, damit die Einschwingzeit bei gleichzeitig geringer Schwingneigung klein ist. |
Standarddwerte für P,I,D sind 60,8,100 bzw 100 für GPS Gain |
Wenn alle 0 sind, ist der Regler deaktiviert. |
Voraussetzungen für GPS_Hold: |
Neben den genannten HW und SW Voraussetzungen muß beim Kalibrieren das GPS MOdul bereits Positionsdaten liefern. |
Nur dann wird die Home Position abgespeichert und nur dann wird GPS_Hold aktiviert. |
Kenntlich gemacht wird dies durch einen etwas längeren Piepser nach dem Kalibrieren. Die Rote Led auf der FlightCrtl blitzt bei jedem Empfang eines kompletten |
und korrekten Meldungsset ( "NAV_STATUS", "NAV_POSUTM" und "NAV_VELNED"). |
Zur Aktivierung von GPS Hold muessen die GPS und Kompass Flags im Setting enbaled sein. |
Eine Ausrichtung des Kopters nach Nord etc. ist nicht erforderlich. |
Aktivierung GPS_Hold im Flug: |
Wenn alle genannten Voraussetzungen erfüllt sind, wird GPS Hold im Flug automatisch aktiviert, sobald der Nick und Roll Stick |
für ca. 500msec in Neutrallage sind. Weicht einer der Sticks davon ab (Parameter GPS Threshold) oder liefert das GPS Modul keine Daten oder fällt der |
Kompass aus wird GPS_Hold sofort deaktiviert. |
Damit kann jederzeit die manuelle Kontrolle wieder übernommen werden. |
GPS_Hold regelt nur horizontale Abweichungen, keine Hoehe. |
Der Magnetkompass wird nur in waagrechter Lage dazu benutzt einen internen aus dem Giergyro ermittelten "Ersatz"kompasswert |
nach zu kalibrieren. Daher funktioniert die Bstimmung der Kopterausrichtung in jeder Lebenslage, sofern nur ab und zu |
der Magnetkompass in die waagrechte Lage kommt. Da der Giergyro per Kompass automatisch offsetkorrigiert wird, ist er spätestens nach |
einigen wenigen Minuten auch bei Temperatursprüngen ausreichend stabil. |
Ein 3D Kompass ist damit überflüssig. |
Die GPS Regelung benötigt zwar pro Durchlauf eine erhebliche Rechenzeit. Da sie aber nur einmal je neuem Meldungsblock vom |
GPS Modul (also alle 250ms) aufgerufen wird, wird die Gesamtbelastung der CPU nur minimal erhöht. |
Ein externes Naviboard ist daher nicht notwendig. |
GPS Rücksturz zur Basis (GPS Home) Funktion |
Voraussetzungen wie bei GPS Hold. |
GPS Mode Control hat einen Wert > 170 |
Weitere Änderungen: |
-Der Ausgang PC6 kann benutzt werden um einen Externen Multiplexer zu schalten. Dieser schaltet entweder die GPS Daten |
(Wenn Motoren eingeschaltet sind) oder den Ausgang des Bluetoothmoduls (wenn Motoren ausgeschaltet sind) auf den RX |
Eingang der FlightCrtl. Damit kann eine zweite UART Schnittstelle bzw. die manuelle Umschaltung entfallen |
-Bei vorhandenem Kompass wird eine automatische Kompensation der Giergyrodrift durchgeführt. |
/branches/salvo_gps/Basis_v0070d/tags/README_Gps_English.txt |
---|
0,0 → 1,66 |
********************************************************************* |
GPS Implementation by Peter Muehlenbrock ("Salvo") for Mikrokopter/FlightCrtl |
As of October 28th, 2008 |
Please note the files Licensce_LPGL.txt and Licensce_GPL.txt |
This SW is based on Holgers V00.70d. |
********************************************************************* |
Hardware-requirements: |
Calibrated compass of type CMPS03, horizontally adjusted |
GPS module of type ublox, The messages "NAV_STATUS", "NAV_POSUTM" and "NAV_VELNED" |
must be activated with 4 HZ update rate. All messages of type NMEA should be disabled. |
The TX port of the GPS module must be connected to the RX input of the Flight Crtl. Baudrate is 57600 (like Kopter Tool). |
UserParameter 4 tells the software the orientation for the compass. The difference between the "north" direction |
( = Motor "vorne" or 1 as described in Holgers Flight Crtl manual) of the kopter |
and the north direction of the compass is represented as follows: 0...360 degree offset corresponds to a value of 0...180. |
(A userparameter ist only 1 byte long and therefore can not directly represent 0..360 degree). Please check the |
correct value via the Koptertool. The "Kompass" debug value has to show the correct orientation: |
kopter Motor vorne orientated to north => value approx 0 Degree) |
Other requirements: |
Please calibrate the ACC Sensor values (pitch full, yaw full right) in horizontal orientation of the kopter |
as exactly as possible. |
Parameters: |
The GPS Hold regulator is of type PID: GPS-P =P(proportional), GPS-I = I(ntegral), |
GPS-D = D(ifferential). Standardvalues for P,I and D are 60,8,100. GPS Gain is the overall gain and set to 100 as default |
The I-Part may be set to 0 if a small deviation from hold position is acceptable. The D-Part is important to avoid |
oscillating. |
Please find out the best values yourself. |
It might be useful to put the P and D Part on potis and test the behaviour in flight. |
Requirements for GPS_Hold: |
The gps module has do provide a 3D-fix. If succesfull, you can hear a longer beep when performing a gyro calibration. |
Without a succesfull position fix at calibration the GPS functionality ist completely disabled. |
The red led on the FlightCrtl flashes with a 4 Hz rate if the gps module delivers a position fix. |
The GPS flag and Compass flag in the setting must be enabled |
Enabling GPS_Hold in flight: |
GPS Hold is automatically activated if the sticks for roll and nick are in neutral position for about 400ms. |
Moving the stick immediately disables the Hold mode. The GPS Hold function doesn not change height, pitch or yaw. |
GPS Coming-Home function |
Enabled when the GPS and compass flag in the setting are enabled and the GPS Mode Control Switch is set to a value > 170 |
Other changes: |
- Output PC6 can be used to switch TX data between a Bluetooth and the GPS Module (further hardware required) to the RX input of the FlightCrtl |
- automatic Yaw gyro compensation if compass is available. |
/branches/salvo_gps/Basis_v0070d/tags/Settings.h |
---|
--- salvo_gps/Basis_v0070d/tags/_Settings.h (nonexistent) |
+++ salvo_gps/Basis_v0070d/tags/_Settings.h (revision 1018) |
@@ -0,0 +1,44 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// 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 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/salvo_gps/Basis_v0070d/tags/analog.c |
---|
0,0 → 1,181 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 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); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state); |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
// AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
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 = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(StartLuftdruck - tmpLuftdruck - HoehenWert))/8; // 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/salvo_gps/Basis_v0070d/tags/analog.h |
---|
0,0 → 1,26 |
/*####################################################################################### |
#######################################################################################*/ |
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; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(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/salvo_gps/Basis_v0070d/tags/eeprom.c |
---|
0,0 → 1,222 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "fc.h" |
#include "_settings.h" |
#include "main.h" |
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_KOMPASS_AKTIV | CFG_GPS_AKTIV;//CFG_HOEHEN_SCHALTER |
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 = 15; // Wert : 1-6 |
EE_Parameter.Stick_D = 30; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // 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 = 100; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // 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 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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 = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 60; |
EE_Parameter.NaviGpsI = 0; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
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_KOMPASS_AKTIV | CFG_GPS_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 = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 12; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // 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 = 30; // 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 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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 = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 16; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
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_KOMPASS_AKTIV | CFG_GPS_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 = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // 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 = 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 = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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 = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/salvo_gps/Basis_v0070d/tags/fc.c |
---|
0,0 → 1,1479 |
/*####################################################################################### |
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. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Aenderungen von Peter Muehlenbrock ("Salvo") Stand 9.11.2008 |
/* |
Driftkompensation fuer Gyros verbessert |
Linearsensor optional mit fixem Neutralwert |
Ersatzkompass abgeleitet aus Magnetkompass und Giergyro fuer nahezu neigungsunabhaengige Kompassfunktion |
*/ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
volatile int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
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; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
//Salvo 12.10.2007 |
uint8_t magkompass_ok=0; |
uint8_t gps_cmd = GPS_CMD_STOP; |
static int ubat_cnt =0; |
static int gas_actual,gas_mittel; //Parameter fuer Gasreduzierung bei unterspannung |
int w,v; |
//Salvo End |
//Salvo 15.12.2007 Ersatzkompass und Giergyrokompensation |
long GyroKomp_Int; |
long int GyroGier_Comp; |
int GyroKomp_Value; // Der ermittelte Kompasswert aus Gyro und Magnetkompass |
short int cnt_stickgier_zero =0; |
int gyrogier_kompass; |
//Salvo End |
//Salvo 2.1.2008 Allgemeine Debugvariablen |
int debug_gp_0,debug_gp_1,debug_gp_2,debug_gp_3,debug_gp_4,debug_gp_5,debug_gp_6,debug_gp_7; |
//Salvo End |
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; |
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; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviStickThreshold; //salvo 16.10.2008 |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_ExternalControl; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
unsigned char MikroKopterFlags = 0; |
//Salvo 2.1.2008 Allgemeine Debugvariablen |
int debug_gp_0,debug_gp_1,debug_gp_2,debug_gp_3,debug_gp_4,debug_gp_5,debug_gp_6,debug_gp_7; |
//Salvo End |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
// Salvo 9.12.2007 |
RX_SWTCH_ON; //GPS Daten auf RX eingang schalten |
// Salvo End |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 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; |
AdNeutralGierBias = AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
//Salvo 13.10.2007 Ersatzkompass und Gas |
GyroKomp_Int = KompassValue * GIER_GRAD_FAKTOR; //Neu ab 15.10.2008 |
// gas_mittel = 30; |
// gas_actual = gas_mittel; |
// Salvo End |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertGierBias = (signed int) AdNeutralGierBias - 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; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
ErsatzKompass += MesswertGier; |
//Salvo 12.11.2007 |
GyroKomp_Int += (long)MesswertGier; |
GyroGier_Comp += (long)MesswertGier; |
//Salvo End |
Mess_Integral_Gier += MesswertGier; |
// Mess_Integral_Gier2 += MesswertGier; |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 4096L; |
tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
} |
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 - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
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 - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
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) |
//############################################################################ |
{ |
if(PlatinenVersion >= 13) SucheGyroOffset(); |
// 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.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(!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]; |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
} else MikroKopterFlags |= FLAG_MOTOR_RUN; |
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_MM(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;} |
#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; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(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_MM(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); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_NaviGpsModeControl,EE_Parameter.NaviGpsModeControl,0,255); |
CHK_POTI(Parameter_NaviGpsGain,EE_Parameter.NaviGpsGain,0,255); |
CHK_POTI(Parameter_NaviGpsP,EE_Parameter.NaviGpsP,0,255); |
CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255); |
CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255); |
CHK_POTI(Parameter_NaviStickThreshold,EE_Parameter.NaviStickThreshold,0,255); //Salvo 16.10.2008 |
CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,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 int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
//****** GPS Daten holen *************** |
short int n; |
if (gps_alive_cnt > 0) gps_alive_cnt--; //Dekrementieren. Wenn 0 kommen keine ausreichenden GPS Meldungen (Timeout) |
n = Get_Rel_Position(); |
if (n == 0) |
{ |
ROT_ON; //led blitzen lassen |
} |
//******PROVISORISCH*************** |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang 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 > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
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 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_FLY; |
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; |
SetNeutral(); |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
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 |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 20 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
GPS_Save_Home(); //Daten sind jetzt hoffentlich verfuegbar |
if (gps_home_position.status > 0 ) |
{ |
Delay_ms(1000); //akustisch verkuenden dass GPS Home Daten da sind |
beeptime = 1000; |
Delay_ms(500); |
} |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
int n; |
// Salvo 9.12.2007 |
RX_SWTCH_ON; //GPS Daten auf RX eingang schalten |
// Salvo End |
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; |
n= GPS_CRTL(GPS_CMD_STOP); //GPS Lageregelung beenden |
MikroKopterFlags |= FLAG_START; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
// Salvo 9.12.2007 |
RX_SWTCH_OFF; //Bluetooth Daten auf RX eingang schalten |
// Salvo End |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
int tmp_int; |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
// StickNick = stick_nick - (GPS_Nick*(STICK_GAIN/2) + GPS_Nick2); //Salvo 23.10.2008 |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
// StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
// StickRoll = stick_roll - (GPS_Roll*(STICK_GAIN/2) + GPS_Roll2); //Salvo 23.10.2008 |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
// StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
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--; |
*/ |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN); |
IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN); |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Digitale Steuerung per DubWise |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define KEY_VALUE (Parameter_ExternalControl * 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 += (STICK_GAIN * ExternStickNick) / 8; |
StickRoll += (STICK_GAIN * ExternStickRoll) / 8; |
StickGier += STICK_GAIN * ExternStickGier; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 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(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 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 || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = (float) 100 / (256.0 / STICK_GAIN); |
IntegralFaktor = (float) 120 / (44000 / STICK_GAIN); |
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 > 64) || (MaxStickRoll > 64)) |
{ |
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 && !TrichterFlug) |
{ |
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 > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 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; |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
//DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
//Salvo Ersatzkompass Ueberlauf korrigieren |
if (GyroKomp_Int >= ((long)360 * GIER_GRAD_FAKTOR)) GyroKomp_Int = GyroKomp_Int - (GIER_GRAD_FAKTOR *(long)360); //neu ab 3.11.2007 |
if (GyroKomp_Int < 0) GyroKomp_Int = GyroKomp_Int + (GIER_GRAD_FAKTOR *(long)360); //neu ab 3.11.2007 |
ROT_OFF; |
// Salvo End |
/*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; |
//MittelIntegralRoll = MittelIntegralRoll; |
//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; |
KompassSignalSchlecht = 1000; |
} |
w = (abs(Mittelwert_AccNick)); |
v = (abs(Mittelwert_AccRoll)); |
//Salvo 16.10.2008 |
if ((w < ACC_WAAGRECHT_LIMIT*2) && (v < ACC_WAAGRECHT_LIMIT*2)) // Gyro nur in annaehernd waagrechter Lage nachtrimmen |
{ |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
} |
//Salvo End |
// 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; |
KompassSignalSchlecht = 1000; |
} |
//Salvo 26.12.2007 |
if ((w < ACC_WAAGRECHT_LIMIT*2) && (v < ACC_WAAGRECHT_LIMIT*2)) // Gyro nur in annaehernd waagrechter Lage nachtrimmen |
{ |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
//Salvo End |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 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); |
// Salvo Ersatzkompass und Giergyrokompensation 15.12.2007 ********************** |
if ((Kompass_Neuer_Wert > 0)) //nur wenn Kompass einen neuen Wert geliefert hat |
{ |
Kompass_Neuer_Wert = 0; |
w = (abs(Mittelwert_AccNick)); |
v = (abs(Mittelwert_AccRoll)); |
if ((w < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) //Ersatzkompass und Giergyro nur mit Magnetkompass aktualisieren wenn alles ok |
{ |
if ((abs(KompassValue - Kompass_Value_Old)) <= 5) // Aufeinanderfolgende Werte duerfen nur minimal abweichen |
{ |
if ((abs(StickGier) < 20)) //Giergyroabgleich mit Kompass |
{ |
if (cnt_stickgier_zero < 255) cnt_stickgier_zero += 1; |
if (cnt_stickgier_zero > 2) // nur Abgleichen wenn keine Stickbewegung da |
{ |
w = (int) (GyroGier_Comp/(long)GIER_GRAD_FAKTOR); |
v = KompassValue - gyrogier_kompass; // realen Drehwinkel seit letztem Ruecksetzen von GyroGier_Comp bestimmen |
if (v <-180) v +=360; // Uberlaufkorrektur |
if (v > 180) v -=360; // Uberlaufkorrektur |
v = w-v; //Differenz Gyro zu Kompass ist der Driftfehler |
#define GIER_COMP_MAX 2 |
if (v > GIER_COMP_MAX) v= GIER_COMP_MAX; |
if (v < -GIER_COMP_MAX) v= - GIER_COMP_MAX; |
if (abs(w) > 1) |
{ |
GyroGier_Comp = 0; |
gyrogier_kompass = KompassValue; // Kompasswert merken |
AdNeutralGier -= v; |
} |
} |
} |
else |
{ |
gyrogier_kompass = KompassValue; // Kompasswert merken |
cnt_stickgier_zero = 0; |
GyroGier_Comp = 0; |
} |
magkompass_ok = 1; // Flag dass Magnetkompass stabil arbeitet |
GyroKomp_Int = (GyroKomp_Int )/(long)GIER_GRAD_FAKTOR; |
w = KompassValue - GyroKomp_Int; |
if ((w > 0) && (w < 180)) |
{ |
++GyroKomp_Int; |
} |
else if ((w > 0) && (w >= 180)) |
{ |
--GyroKomp_Int; |
} |
else if ((w < 0) && (w >= -180)) |
{ |
--GyroKomp_Int; |
} |
else if ((w < 0) && (w < -180)) |
{ |
++GyroKomp_Int; |
} |
if (GyroKomp_Int < 0) GyroKomp_Int = GyroKomp_Int + 360L; |
GyroKomp_Int = (GyroKomp_Int%360L) * (long)GIER_GRAD_FAKTOR; // An Magnetkompasswert annaehern |
} |
} |
else //Kompassfehler |
{ |
magkompass_ok = 0; |
GyroGier_Comp = 0; |
} |
Kompass_Value_Old = KompassValue; |
} |
// Salvo End ************************* |
// Salvo 6.10.2007 |
// GPS Home aktivieren wenn Knueppel in Ruhelage und Hoehenschalter aktiviert ist |
//GPS Hold Aktiveren wenn Knueppel in Ruhelage sind |
if ((abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) < Parameter_NaviStickThreshold) |
&& (abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < Parameter_NaviStickThreshold) && (gps_alive_cnt > 0)) |
{ |
if ((Parameter_NaviGpsModeControl > 170) && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) //Hoehenschalter und GPS Flag aktiv |
{ |
if ( gps_cmd == GPS_CMD_REQ_HOLD) gps_cmd = GPS_CMD_STOP; // erst mal stoppen, denn altes Kommando wurde noch nicht beendet |
else gps_cmd = GPS_CMD_REQ_HOME; |
n = GPS_CRTL(gps_cmd); |
} |
else if ((Parameter_NaviGpsModeControl < 170) && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) //Hoehenschalter Mittelstellung und GPS Flag aktiv |
{ |
if ( gps_cmd == GPS_CMD_REQ_HOME) gps_cmd = GPS_CMD_STOP; // erst mal stoppen, denn altes Kommando wurde noch nicht beendet |
else gps_cmd = GPS_CMD_REQ_HOLD; |
n= GPS_CRTL(gps_cmd); |
} |
else // GPS komplett aus |
{ |
if (gps_cmd != GPS_CMD_STOP) |
{ |
gps_cmd = GPS_CMD_STOP; |
n= GPS_CRTL(gps_cmd); //GPS Lageregelung beenden |
} |
} |
} |
else |
{ |
if (gps_cmd != GPS_CMD_STOP) |
{ |
gps_cmd = GPS_CMD_STOP; |
n= GPS_CRTL(gps_cmd); //GPS Lageregelung beenden |
} |
} |
if (gps_state != GPS_CRTL_IDLE) if (TimerWerteausgabe == 12) LED_J16_OFF; //led im GPS Mode schnell blinken lassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // 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 > GIER_INTEGRAL_MAX) Mess_Integral_Gier = GIER_INTEGRAL_MAX; // begrenzen Salvo 18.10.2008 |
if(Mess_Integral_Gier <-GIER_INTEGRAL_MAX) Mess_Integral_Gier =-GIER_INTEGRAL_MAX; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) && (Kompass_present > 0)) |
{ |
if(v > w) w = v; // grösste Neigung ermitteln |
// Salvo 13.9.2007 Nur wenn Magnetkompass ordentliche Werte liefert |
if ((magkompass_ok > 0) && NeueKompassRichtungMerken) |
{ |
KompassStartwert = KompassValue; |
NeueKompassRichtungMerken = 0; |
} |
// Salvo 13.9.2007 |
w=0; |
// Salvo End |
w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w > 0) |
{ |
// Salvo Kompasssteuerung ********************** |
if (magkompass_ok > 0) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
// Salvo End |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
// Salvo 13.12.2007 Beleuchtung steuern |
if (!(beeptime & BeepMuster)) LED_J16_FLASH; |
else if (MotorenEin) LED_J16_ON; |
else LED_J16_OFF; |
// Salvo End |
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] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[11] = GyroKomp_Int / GIER_GRAD_FAKTOR; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
// DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
// DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
// DebugOut.Analog[19] = WinkelOut.CalcState; |
// DebugOut.Analog[20] = ServoValue; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
DebugOut.Analog[23] = debug_gp_0; |
DebugOut.Analog[24] = debug_gp_1; |
DebugOut.Analog[25] = debug_gp_2; |
DebugOut.Analog[26] = gps_rel_act_position.utm_east; //in 10cm ausgeben |
DebugOut.Analog[27] = gps_rel_act_position.utm_north; |
DebugOut.Analog[28] = gps_rel_act_position.utm_alt; |
DebugOut.Analog[29] = gps_state + (gps_sub_state*10)+(50*gps_cmd); |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
DebugOut.Analog[21] = MesswertNick; |
DebugOut.Analog[22] = MesswertRoll; |
// Maximalwerte abfangen |
#define MAX_SENSOR (4096*STICK_GAIN) |
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; |
GasMischanteil *= STICK_GAIN; |
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 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
// h -= (HoeheD * Parameter_Luftdruck_D)/(8/STICK_GAIN); // D-Anteil |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
DebugOut.Analog[6] = GierMischanteil; //Salvo 19.10.2008 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
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 |
motorwert /= STICK_GAIN; |
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; |
motorwert /= STICK_GAIN; |
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; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
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; |
motorwert /= STICK_GAIN; |
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; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/salvo_gps/Basis_v0070d/tags/fc.h |
---|
0,0 → 1,194 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
#define GIER_GRAD_FAKTOR 1450L // Abhängigkeit wzischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1550L // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
//Salvo 9.12.2007 Neutralwerte fuer ACC Sensor nur verwendet wenn ACC_FIXED >0 |
#define ACC_FIXED 0 // wenn > 0werden diese Werte beim ACC Kalbibrieren ins Eeprom geschrieben |
#define ACC_WAAGRECHT_LIMIT 100 // Nick und Roll kleiner als dieser Wert gelten als Kriterium fuer waagrechte Lage |
//Salvo 2.9.2007 Ersatzkompass: Gyroincrements/Grad als Defaultwert ***** |
// Laut Datenblatt sind die Werte ueber Zeit und Temperatur sehr stabil. |
#define CAM_GPS_QUIET 0 // wenn dieses Flag gesetzt ist, wird GPS beim Ausloesen kurzzeitig deaktiviert um eine ruhige Lage zu bekommen |
// Salvo End |
#define GIER_INTEGRAL_MAX 50000 //Salvo 18.10.2008 Gier Integrierer macht Probleme (links /rechts unterschiedlich) Liegt an schraeg stehenden |
//Motoren und dann in die begrenzung laufenden Giergyro |
#define FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
extern unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
//Salvo 2.1.2008 Debugvariablens |
extern int debug_gp_0,debug_gp_1,debug_gp_2,debug_gp_3,debug_gp_4,debug_gp_5,debug_gp_6,debug_gp_7; //Allgemeine Debugvariablen |
//Salvo End |
//Salvo 2.9.2007 Ersatzkompass |
extern long GyroKomp_Int; |
extern long int GyroGier_Comp; |
extern int GyroKomp_Inc_Grad; |
extern int GyroKomp_Value; // Der ermittelte Kompasswert aus Gyro und Magnetkompass |
// Salvo End |
#define STRUCT_PARAM_LAENGE 83 |
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 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
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; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
extern unsigned char Parameter_NaviGpsGain; |
extern unsigned char Parameter_NaviGpsP; |
extern unsigned char Parameter_NaviGpsI; |
extern unsigned char Parameter_NaviGpsD; |
extern unsigned char Parameter_NaviGpsACC; |
#endif //_FC_H |
/branches/salvo_gps/Basis_v0070d/tags/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="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File></Project> |
/branches/salvo_gps/Basis_v0070d/tags/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/salvo_gps/Basis_v0070d/tags/gps.h |
---|
0,0 → 1,132 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock alias Salvo |
// Definitionen fuer Modul GPS |
// Stand 20.1.2008 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
extern void GPS_Neutral(void); |
extern void Get_Ublox_Msg(uint8_t rx) ; |
extern short int Get_GPS_data(void); |
extern short int Get_Rel_Position(void); |
extern void GPS_Save_Home(void); |
extern short int GPS_CRTL(short int cmd); |
typedef struct { |
unsigned long utm_itow; // time of week |
long utm_east; // UTM Ost in cm |
long utm_north; // UTM Nord in cm |
long utm_alt; // hoehe in cm |
uint8_t utm_zone; // |
uint8_t utm_hem; // Hemisphere Indicator |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_POSUTM_t; |
typedef struct { |
unsigned long itow; // time of week |
uint8_t gpsfix_type;// 3=3D Fix |
uint8_t nav_status_flag; |
uint8_t nav_diff_status; |
uint8_t nav_resevd; |
long nav_tff; // Time to First Fix in ms |
long nav_msss; // ms since startup |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_STATUS_t; |
typedef struct { |
unsigned long itow; |
long speed_n; // in cm/s |
long speed_e; // in cm/s |
long speed_alt; // in cm/s |
unsigned long speed_3d; // in cm/s |
unsigned long speed_gnd; // V ueber Grund in cm/s |
long heading; // Richtung in deg/10000 |
unsigned long sacc; // Speed Genauigkeit in cm/s |
unsigned long cacc; // Richtungsgenauigkeit in deg |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_VELNED_t; |
typedef struct { |
long utm_east; // UTM Ost in 10 cm |
long utm_north; // UTM Nord in 10 cm |
long utm_alt; // hoehe in 10 cm |
unsigned long speed_gnd; // V ueber Grund in 10cm/s |
unsigned heading; // Richtung in Grad |
uint8_t status; // 0: keine gueltigen Daten 1: alles ok |
} GPS_ABS_POSITION_t; |
typedef struct { // Struktur fuer Relative GPS Daten (bezogen z.B. auf Home Position) |
int utm_east; // UTM Ost in 10 cm |
int utm_north; // UTM Nord in 10 cm |
int utm_alt ; // UTM Altitude in 10 cm |
uint8_t status; // 0: keine gueltigen Daten 1: alles ok |
} GPS_REL_POSITION_t; |
extern GPS_ABS_POSITION_t gps_act_position; |
extern GPS_ABS_POSITION_t gps_home_position; |
extern GPS_REL_POSITION_t gps_rel_act_position; |
extern GPS_REL_POSITION_t gps_rel_hold_position; |
extern short int gps_state,gps_sub_state; |
extern unsigned int gps_alive_cnt; |
// Zustaende der zentralen GPS statemachine |
#define GPS_CRTL_IDLE 0 // Inaktiv |
#define GPS_CRTL_HOLD_ACTIVE 1 // Lageregelung aktiv |
#define GPS_CRTL_HOME_ACTIVE 2 // Rueckflug zur Basis Aktiv |
#define GPS_HOME_FAST_IN_TOL 3 // Rueckflug: Aktuelle Position innerhalb der Toleranz |
#define GPS_HOME_FAST_OUTOF_TOL 4 // Rueckflug: Aktuelle Position ausserhalb der Toleranz |
#define GPS_HOME_RMPDWN_IN_TOL 5 // Rueckflug: beim Abbremsen Position innerhalb der Toleranz |
#define GPS_HOME_RMPDWN_OUTOF_TOL 6 // Rueckflug: beim Abbremsen Position ausserhalb der Toleranz |
#define GPS_HOME_IN_TOL 7 // Rueckflug: Nahe am Ziel innerhalb der Toleranz |
#define GPS_HOME_OUTOF_TOL 8 // Rueckflug: Nahe am Ziel ausserhalb der Toleranz |
#define GPS_HOME_FINISHED 9 // Rueckflug zur Basis abgeschlossen |
// Kommandokonstanten fuer die zentrale GPS Statemachine |
#define GPS_CMD_STOP 0 // Lageregelung soll deaktiviert werden |
#define GPS_CMD_REQ_INIT 1 // Initialisierung |
#define GPS_CMD_REQ_HOLD 3 // Lageregelung soll aktiviert werden |
#define GPS_CMD_REQ_HOME 4 // Das Heimfliegen soll aktiviert werden |
// Statusmeldungen der zentralen GPS statemachine |
#define GPS_STST_OK 0 // Kommando erfolgreich und abgeschlossen |
#define GPS_STST_PEND 1 // Kommando noch nicht komplett durchgefuehrt |
#define GPS_STST_ERR 2 // Fehler |
// GPS Lageregler |
#define GPS_USR_PAR_FKT 4 //Faktor durch den die Userparameter geteilt werden |
#define GPS_NICKROLL_MAX 40 // Maximaler Einfluss des GPS Lagereglers auf Nick und Roll |
#define GPS_DIST_MAX 400 // Maximal zulaessige Distanz bevor Regelung gestoppt wird (in 10cm) |
//#define GPS_V 8 // Teilerfaktor Regelabweichung zu Ausgabewert |
// Konstanten fuer Verstaerkung fuer Speed Werte in Abhaengigkeit vom SpeedWert (cm/sek) |
// um eine exponentielle Verstaerkung zu erreichen |
#define DIFF_Y_N_MAX 1 // Verstaerkung bei Eingangswert = DIFF_X_N_MAX im Normal (Hold) Mode |
//#define DIFF_X_N_MAX 200 // bei diesem Eingangswert ist die Verstaerkung = DIFF_Y_N_MAX |
#define DIFF_Y_F_MAX 1 // Verstaerkung bei Eingangswert = DIFF_X_F_MAX im Fast (Coming Home) Mode |
//#define DIFF_X_F_MAX 500 // bei diesem Eingangswert ist die Verstaerkung = DIFF_Y_F_MAX |
// P-Regler Verstaerkung |
#define GPS_PROP_NRML_V 2 //maximale Verstaerkung im Normalen Holdmode |
#define GPS_PROP_FAST_V 6 //maximale Verstaerkung im Fast mode |
// GPS G2T /Go to Target Regler |
#define GPS_G2T_DIST_MAX_STOP 80 // Ab dieser Entfernung vom Zielpunkt soll die Geschwindigkeit runtergeregelt werden( in 10 cm) |
#define GPS_G2T_DIST_HOLD 50 // Ab dieser Entfernung vom Zielpunkt wird mit Minimaler Geschwindigkeit eingeregelt |
#define GPS_G2T_FAST_TOL 200 // Bei grosser Entfernung vom Ziel: Der Sollwert wird nur geaendert wenn die aktuelle Position nicht mehr als diesem Wert vom Sollwert abweicht |
#define GPS_G2T_NRML_TOL 100 // Bei kleiner Entfernung vom Ziel: Der Sollwert wird nur geaendert wenn die aktuelle Position nicht mehr als diesem Wert vom Sollwert abweicht |
#define GPS_G2T_V_MAX 20 // Maximale Geschwindigkeit (in 10cm/0.25 Sekunden) mit der der Sollpunkt geaendert wird. |
#define GPS_G2T_V_RAMP_DWN 10 // Geschwindigkeit (in 10cm/0.25ekunden) in der Naehe der Home Position um abzubremsen |
#define GPS_G2T_V_MIN 3 // Minimale (in 10cm/0.25 Sekunden) ganz nahe an Homeposition. |
/branches/salvo_gps/Basis_v0070d/tags/led.c |
---|
0,0 → 1,49 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing > 230)) {if(EE_Parameter.J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing < 10)) {if(EE_Parameter.J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.J16Bitmask) J16_ON; else J16_OFF; |
} |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing > 230)) {if(EE_Parameter.J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing < 10)) {if(EE_Parameter.J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/branches/salvo_gps/Basis_v0070d/tags/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/salvo_gps/Basis_v0070d/tags/main.c |
---|
0,0 → 1,292 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
LED_Init(); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
LED_Init(); |
} |
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); |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
//############################################################################ |
//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) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else PlatinenVersion = 10; |
// Salvo 9.12.2007 PC6 als Ausgang |
DDRC = 0xCD; // SCL und PC2,PC3, PC6 als Ausgang |
// Salvo End |
// DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
SPI_MasterInit(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
VersionInfo.Hardware = 1; // FlightCtrl |
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 71 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
printf("\n\rACC nicht abgeglichen!"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else 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 || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
/* if(SendVersionToNavi) |
{ |
SPI_StartTransmitPacket(SPI_CMD_VERSION);//# |
SendVersionToNavi = 0; |
} |
else SPI_StartTransmitPacket(SPI_CMD_VALUE);//# |
*/ |
SPI_StartTransmitPacket();//# |
SendSPI = 4; |
timer = SetDelay(20); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/salvo_gps/Basis_v0070d/tags/main.h |
---|
0,0 → 1,112 |
#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 {if(PlatinenVersion < 12) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if(PlatinenVersion < 12) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
//Salvo 9.12.2007 Umschaltsignal fuer Bluetooth bzw. GPS Daten auf PC7 |
#define RX_SWTCH_ON PORTC |= 0x40 |
#define RX_SWTCH_OFF PORTC &= ~0x40 |
#define LED_J16_ON PORTC |= 0x04 |
#define LED_J16_OFF PORTC &= ~0x04 |
#define LED_J16_FLASH PORTC ^= 0x04 |
//Salvo End |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#include "led.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/salvo_gps/Basis_v0070d/tags/makefile |
---|
0,0 → 1,432 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 7 |
VERSION_INDEX = 4 |
VERSION_KOMPATIBEL = 8 # 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 |
ifeq ($(VERSION_INDEX), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)i |
endif |
ifeq ($(VERSION_INDEX), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)j |
endif |
ifeq ($(VERSION_INDEX), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)k |
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 math.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).bak |
$(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/salvo_gps/Basis_v0070d/tags/math.c |
---|
0,0 → 1,127 |
/* |
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 General Public License and GNU Lesser General Public License for more details. |
You should have received a copy of GNU General Public License (License_GPL.txt) and |
GNU Lesser General Public License (License_LGPL.txt) 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 |
*/ |
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Peter Muehlenbrock |
Winkelfunktionen sin, cos und arctan in |
brute-force Art: Sehr Schnell, nicht sonderlich genau, aber ausreichend |
get_dist Funktion fuer Entfernungsermittlung |
Stand 12.10.2007 |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
*/ |
#include "main.h" |
#include "math.h" |
// arctan Funktion: Eingabewert x,y Rueckgabe =arctan(x,y) in grad |
int arctan_i( signed int x, signed int y) |
{ |
short int change_xy = 0; |
signed int i; |
long signed int wert; |
int return_value; |
if ((abs(x)) > (abs(y))) // x,y Werte vertauschen damit arctan <45 grad bleibt |
{ |
change_xy = 1; |
i = x; |
x = y; |
y = i; |
} |
// Quadranten ermitteln |
// Wert durch lineare Interpolation ermitteln |
if ((y == 0) && (x == 0)) wert =1; // Division durch 0 nicht erlaubt |
else wert= abs(((long)x*1000)/((long)y)); |
if (wert <=268) //0...0.0,268 entsprechend 0..15 Grad |
{ |
return_value = (signed int)((wert*100)/(268-0)*(15-0)/100) +0; |
} |
else if (wert <=578) //0,268...0.0,568 entsprechend 15..30 Grad |
{ |
return_value = (signed int)((((wert-268)*100)/(578-268)*(30-15))/100) +15; |
} |
else //0,568...1 entsprechend 30..45 Grad |
{ |
return_value = (signed int)((((wert-578)*50)/(1000-578)*(45-30))/50) +30; |
} |
if (change_xy == 0) return_value = 90-return_value; //Quadrant 45..90 Grad |
if ((x >= 0) && (y <0)) return_value = - return_value; |
else if ((x < 0) && (y >= 0)) return_value = - return_value; |
return return_value; |
} |
// cosinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =cos(winkel)*1000 |
signed int cos_i(signed int winkel) |
{ |
winkel = sin_i(90-winkel); |
return winkel; |
} |
const unsigned int pgm_sinus[91] PROGMEM = {0,17,35,52,70,87,105,122,139,156,174,191,208,225,242,259,276,292,309,326,342,358,375,391,407,423,438,454,469,485,500,515,530,545,559,574,588,602,616,629,643,656,669,682,695,707,719,731,743,755,766,777,788,799,809,819,829,839,848,857,866,875,883,891,899,906,914,921,927,934,940,946,951,956,961,966,970,974,978,982,985,988,990,993,995,996,998,999,999,1000,1000}; |
//von Nick666, Stand 28.9.2007 |
// sinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =sin(winkel)*1000 |
signed int sin_i(signed int winkel) |
{ |
short int m,n; |
if (abs(winkel) >=360) winkel = winkel % 360; |
if (winkel < 0) |
{ |
m = -1; |
winkel = abs(winkel); |
} |
else m = +1; |
n =1; |
// Quadranten auswerten |
if ((winkel > 90 ) && (winkel <= 180)) winkel = 180 - winkel; |
else if ((winkel > 180 ) && (winkel <= 270)) |
{ |
winkel = winkel -180; |
n = -1; |
} |
else if ((winkel > 270) && (winkel <= 360)) |
{ |
winkel = 360 - winkel; |
n = -1; |
} |
// else //0 - 90 Grad |
winkel = pgm_read_word(&pgm_sinus[winkel]); |
return (winkel*m*n); |
} |
// Aus x,y und Winkel Distanz ermitteln |
long get_dist(signed int x, signed int y, signed int phi) |
{ |
long dist; |
if (abs(x) > abs(y) ) |
{ |
dist = (long) x; //Groesseren Wert wegen besserer Genauigkeit nehmen |
dist = abs((dist *1000) / (long) sin_i(phi)); |
} |
else |
{ |
dist = (long) y; |
dist = abs((dist *1000) / (long) cos_i(phi)); |
} |
return dist; |
} |
/branches/salvo_gps/Basis_v0070d/tags/math.h |
---|
0,0 → 1,11 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock |
// Definitionen fuer Modul math |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
extern signed int sin_i(signed int winkel); |
extern signed int cos_i(signed int winkel); |
extern signed int arctan_i(signed int x, signed int y); |
extern long get_dist(signed int x, signed int y, signed int phi); |
/branches/salvo_gps/Basis_v0070d/tags/menu.c |
---|
0,0 → 1,142 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 11,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); RemotePollDisplayLine = -1; } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); RemotePollDisplayLine = -1;} |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
// LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
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)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if(PlatinenVersion == 11) |
{ |
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)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,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/salvo_gps/Basis_v0070d/tags/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/salvo_gps/Basis_v0070d/tags/spi.c |
---|
0,0 → 1,268 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_CAL_COMPASS}; |
unsigned char SPI_CommandCounter = 0; |
#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<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
SPI_RxDataValid = 0; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
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"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
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 = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
static unsigned char i =0; |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / 108); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 108); |
ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc); |
ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc); |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = Parameter_NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = Parameter_NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = Parameter_NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = Parameter_NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = Parameter_NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = 15; // MaxRadius |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_CAL_COMPASS: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
break; |
} |
sei(); |
if (SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_CMD_OSD_DATA: |
// ToFlightCtrl.Param.Byte[0] = OsdBar; |
// ToFlightCtrl.Param.Int[1] = Distance; |
break; |
case SPI_CMD_GPS_POS: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.Longitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.Latitude; |
break; |
case SPI_CMD_GPS_TARGET: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.TargetLongitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.TargetLatitude; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/salvo_gps/Basis_v0070d/tags/spi.h |
---|
0,0 → 1,123 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
//#define USE_SPI_COMMUNICATION //Salvo 17.10.2008 SPI deaktiviert |
#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 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_CAL_COMPASS 12 |
#define SPI_CMD_PARAMETER1 13 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_CMD_OSD_DATA 100 |
#define SPI_CMD_GPS_POS 101 |
#define SPI_CMD_GPS_TARGET 102 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned char BeepTime; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter; |
//#define SPI_CMD_VALUE 0x03 |
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/salvo_gps/Basis_v0070d/tags/timer0.c |
---|
0,0 → 1,226 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0; |
volatile unsigned int ServoState = 40; |
unsigned int BeepMuster = 0xffff; |
unsigned int ServoValue = 0; |
//Salvo 8.9.2007 |
volatile uint8_t Kompass_Neuer_Wert= 0; |
volatile unsigned int Kompass_Value_Old = 0; |
// Salvo End |
//Salvo 21.9.2007 |
short unsigned int Kompass_present= 0; //>0 bedeutet dass der Kompass vorhanden ist |
// Salvo End |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
// Aenderungen von Peter Muehlenbrock ("Salvo") Stand 24.12.2007 |
/* |
Ersatzkompass abgeleitet aus Magnetkompass und Giergyro fuer nahezu neigungsubhaengige Kompassfunktion |
*/ |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(SendSPI) SendSPI--; |
if(!cnt--) |
{ |
if (Kompass_present > 0) Kompass_present--; //Runterzaehlen. Wenn 0 ist der Kompass nicht vorhanden |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) //Salvo 25.10.2008 |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
// Salvo Kompassoffset 23.12.2007 *********** |
Kompass_present = 255; |
// Kompass_Value_Old = KompassValue; |
if (KOMPASS_OFFSET > 0) KompassValue = cntKompass -KOMPASS_OFFSET; |
else KompassValue = cntKompass - ((int) (Parameter_UserParam4*2)); |
if (KompassValue < 0) |
{ |
KompassValue += 360; |
} |
if (KompassValue >= 360) |
{ |
KompassValue -= 360; |
} |
// Salvo End |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
//Salvo 13.9.2007 Ok Erkennung des Magnetkompasses |
Kompass_Neuer_Wert = 1; |
// Salvo End |
cntKompass = 0; |
} |
} |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
// TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); // clk/256 |
TCCR2B=(0<<CS20)|(0<<CS21)|(1<<CS22); // clk/64 |
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_OVERFLOW2) |
{ |
if (ServoState > 0) PORTD |= 0x80; |
else PORTD &= ~0x80; |
TCCR2A =3; |
TIMSK2 &= ~_BV(TOIE2); |
} |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char postPulse = 0x80; |
static int filterServo = 100; |
#define MULTIPLIER 4 |
if(ServoState == 4) |
{ |
ServoValue = 0x0030; // Offset Part1 |
filterServo = (filterServo * 3 + (int) Parameter_ServoNickControl * 2)/4; |
ServoValue += filterServo; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) ((long)EE_Parameter.ServoNickComp * IntegralNick) / 128L )/ (512L/MULTIPLIER); |
else ServoValue -= ((long) ((long)EE_Parameter.ServoNickComp * IntegralNick) / 128L) / (512L/MULTIPLIER); |
if((ServoValue) < ((int)EE_Parameter.ServoNickMin*3)) ServoValue = (int)EE_Parameter.ServoNickMin*3; |
else if((ServoValue) > ((int)EE_Parameter.ServoNickMax*3)) ServoValue = (int)EE_Parameter.ServoNickMax*3; |
DebugOut.Analog[20] = ServoValue; |
if ((ServoValue % 255) < 45) { ServoValue+= 77; postPulse = 0x60 - 77; } else postPulse = 0x60; |
OCR2A = 255-(ServoValue % 256); |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
} |
else if ((ServoState > 0) && (ServoState < 4)) |
{ |
if(ServoValue > 255) |
{ PORTD |= 0x80; |
TCCR2A =3; |
ServoValue -= 255; |
} |
else |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
OCR2A = postPulse; // Offset Part2 |
ServoState = 1; |
} |
} |
else if (ServoState == 0) |
{ |
ServoState = (int) EE_Parameter.ServoNickRefresh * MULTIPLIER; |
PORTD&=~0x80; |
TCCR2A = 3; |
} |
ServoState--; |
} |
/branches/salvo_gps/Basis_v0070d/tags/timer0.h |
---|
0,0 → 1,28 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
// Salvo Kompassoffset 24.12.2007 *********** |
#define KOMPASS_OFFSET 135// Winkel zwischen Nordachse Kopter und Nordachse Kompass |
//#define KOMPASS_OFFSET 0 // Winkel zwischen Nordachse Kopter und Nordachse Kompass |
// Wenn 0 wird der UserParameter4 fuer den Offset verwendet (0..360 Grad entspricht 0 ..180) |
// Salvo End |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI; |
//Salvo 21.9.2007 |
extern volatile uint8_t Kompass_Neuer_Wert; |
extern volatile unsigned int Kompass_Value_Old; |
extern unsigned short int Kompass_present; |
// Salvo End |
/branches/salvo_gps/Basis_v0070d/tags/twimaster.c |
---|
0,0 → 1,204 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
case 8: // Gyro-Offset |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/salvo_gps/Basis_v0070d/tags/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 volatile unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/salvo_gps/Basis_v0070d/tags/uart.c |
---|
0,0 → 1,427 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char RemotePollDisplayLine = 0; |
unsigned char NurKanalAnforderung = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char DubWiseKeys[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
int Debug_Timer,Kompass_Timer; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"Giermischanteil ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Mess_integ_gier ", //10 |
"Ersatzkompass ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
" ", |
" ", |
" ", |
" ", |
" ", //20 |
"Nick ", |
"Roll ", |
"debug_0 ", |
"debug_1 ", |
"debug_2 ", //25 |
"utm_east ", |
"utm_north ", |
"utm_alt ", |
"GPS_State ", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
//Salvo 11.9.2007 GPS Daten holen |
Get_Ublox_Msg(SioTmp); // Daten vom GPS Modul holen |
// Salvo End |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
Decode64((unsigned char *) &tmp_int_arr1[0],sizeof(tmp_int_arr1),3,AnzahlEmpfangsBytes); |
KompassValue = tmp_int_arr1[0]; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
DebugTextAnforderung = tmp_char_arr2[0]; |
PcZugriff = 255; |
break; |
case 'b': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
DebugDataAnforderung = 1; |
PcZugriff = 255; |
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); |
PcZugriff = 255; |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
ConfirmFrame = DubWiseKeys[3]; |
PcZugriff = 255; |
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); |
while(!UebertragungAbgeschlossen); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
Kompass_Timer = SetDelay(220); |
} |
//--------------------------------------------------------------------------------------------- |
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(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / 108); // etwa in 0,1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / 108); // etwa in 0,1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w',MeineSlaveAdresse,(unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
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/salvo_gps/Basis_v0070d/tags/uart.h |
---|
0,0 → 1,117 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
#define DUB_KEY_UP 4 |
#define DUB_KEY_DOWN 8 |
#define DUB_KEY_RIGHT 32 |
#define DUB_KEY_LEFT 16 |
#define DUB_KEY_FIRE 64 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_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]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
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 Hardware; |
unsigned char Rserved[6]; |
}; |
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/salvo_gps/Basis_v0070d/tags/version.txt |
---|
0,0 → 1,158 |
------- |
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 |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
/branches/salvo_gps/Basis_v0070d/tags |
---|
Property changes: |
Added: svn:ignore |
+Flight-Ctrl_MEGA644_V0_7e.eep |
+Flight-Ctrl_MEGA644_V0_7e.elf |
+Flight-Ctrl_MEGA644_V0_7e.lss |
+Flight-Ctrl_MEGA644_V0_7e.map |
+Flight-Ctrl_MEGA644_V0_7e.sym |
+*.bak |
+*.d |
+*.lst |
+set3.mkp |
+set2.mkp |
+set1.mkp |
+*.aws |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |