/branches/salvo_gps/Basis_v0067g/tags/v0007b/Flight-Ctrl_MEGA644_V0_7b.hex |
---|
0,0 → 1,2426 |
:100000000C946C020C9489020C9489020C94890261 |
:100010000C9489020C9489020C9489020C94890234 |
:100020000C9489020C94810C0C9489020C94890222 |
:100030000C949C150C9489020C9489020C948902EE |
:100040000C9489020C9489020C94840B0C94890200 |
:100050000C94A9070C9489020C94C4040C94890292 |
:100060000C94870D0C9489020C94D0140C94890282 |
:100070000A0A0D004E65757472616C004865616412 |
:10008000696E67486F6C64000A0D5374657565721C |
:10009000756E673A20004F4B0A0D000A0D416267EA |
:1000A0006C65696368204C756674647275636B7304 |
:1000B000656E736F722E2E000A0D42656E75747A2E |
:1000C0006520506172616D657465727361747A2028 |
:1000D0002564000A0D414343206E69636874206102 |
:1000E000626765676C696368656E21000A0D496E19 |
:1000F00069742E20454550524F4D3A2047656E6534 |
:1001000072696572652044656661756C742D506115 |
:1001100072616D657465722E2E2E000A0D3D3D3D97 |
:100120003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DFF |
:100130003D3D3D3D3D3D3D3D3D3D3D000A0D466C57 |
:1001400069676874436F6E74726F6C0A0D486172F0 |
:1001500064776172653A25642E25640A0D536F66D3 |
:1001600074776172653A5625642E256425632000F4 |
:100170002E0052616E67653A2533692D253369007B |
:100180005374656C6C756E673A202533690053654E |
:1001900074706F696E742020253369005365727620 |
:1001A0006F202000506F7469343A20202533690095 |
:1001B000506F7469333A202025336900506F746999 |
:1001C000323A202025336900506F7469313A20207B |
:1001D0002533690053746172743A20202020202551 |
:1001E0003569004D657373776572743A2020253543 |
:1001F00069005269636874756E673A202025356915 |
:10020000004B6F6D70617373202020202020200030 |
:10021000456D70662E506567656C3A2535690053EB |
:1002200070616E6E756E673A202025356900486FE3 |
:1002300063682025346920282533692900526F6CB2 |
:100240006C20253469202825336929004E69636BA9 |
:100250002025346920282533692900414343202D76 |
:100260002053656E736F720047696572202534698B |
:1002700020282533692900526F6C6C2025346920B1 |
:100280002825336929004E69636B202534692028AD |
:10029000253369290047696572202534692028259E |
:1002A00033692900526F6C6C20253469202825336E |
:1002B0006929004E69636B2025346920282533693C |
:1002C00029004779726F202D2053656E736F72007D |
:1002D00050333A253469202050343A2534692000BF |
:1002E00050313A253469202050323A2534692000B3 |
:1002F00047733A253469202047693A25346920003C |
:100300004E693A2534692020526F3A25346920001D |
:100310004B373A25346920204B383A253469200080 |
:100320004B353A25346920204B363A253469200074 |
:100330004B333A25346920204B343A253469200068 |
:100340004B313A25346920204B323A25346920005C |
:100350004B6F6D706173733A202020253569005210 |
:100360006F6C6C3A202020202020253569004E69D2 |
:10037000636B3A20202020202025356900616B74B2 |
:100380002E204C6167650048F668656E726567658A |
:100390006C756E67004B65696E6520004F66662060 |
:1003A00020202020203A20253569004C7566746491 |
:1003B0007275636B3A2025356900536F6C6C486F1A |
:1003C0006568653A2025356900486F6568653A209B |
:1003D000202020202535690028632920486F6C677C |
:1003E000657220427573730053657474696E673A61 |
:1003F000202564200048573A5625642E2564205352 |
:10040000573A25642E25642563002B2B204D696BFC |
:10041000726F4B6F70746572202B2B005B25695DCA |
:100420000000001100230034004600570069007AE4 |
:10043000008B009C00AE00BF00D000E100F2000382 |
:100440000114012401350146015601660177018737 |
:10045000019701A701B601C601D501E501F4010329 |
:1004600002120221022F023E024C025A0268027559 |
:1004700002830290029D02AA02B702C302CF02DBEE |
:1004800002E702F302FE02090314031F03290333E8 |
:10049000033D0347035003590362036B0373037B5C |
:1004A0000383038A03920399039F03A603AC03B259 |
:1004B00003B703BC03C103C603CA03CE03D203D6EA |
:1004C00003D903DC03DE03E103E303E403E603E70C |
:1004D00003E703E803E8030011241FBECFEFD0E1D8 |
:1004E000DEBFCDBF14E0A0E0B1E0E4EDF3E902C06F |
:1004F00005900D92A23AB107D9F719E0A2EAB4E04B |
:1005000001C01D92A139B107E1F70E94C4020C9409 |
:10051000E9490C94000022E030E0D9010E94D5495D |
:10052000802D863028F082E0D901082E0E94DD4916 |
:1005300090E00895FB01282F863008F025E0429FC7 |
:10054000D0011124AC59BF4F842F90E0019724F0C3 |
:1005500001900E94DD49FACFA2E0B0E0022E0E9495 |
:10056000DD490895FB01863008F085E0489FD00101 |
:100570001124AC59BF4F842F90E0019724F00E94C2 |
:10058000D5490192FACF0895EF92FF921F93CF932E |
:10059000DF9314B815B8189B02C08BE001C08AE045 |
:1005A000809300018DEC87B98FEF88B98BE184B916 |
:1005B00081E085B98EE38AB9579A87EF8BB984B702 |
:1005C000877F84BF80916000886180936000109273 |
:1005D000600080ED97E09093C5048093C40410926E |
:1005E0006405109263051092410810924008109221 |
:1005F0006205109261051092600510925F0580916E |
:1006000000018A3011F4289801C0289A0E94240D14 |
:100610000E94FC050E9487150E94810D0E94B6145D |
:10062000789410923F0787E08093400780934107BA |
:1006300020910001822F6AE00E942E49492F50E04C |
:10064000822F0E942E4990E022E630E03F932F93C4 |
:1006500027E030E03F932F931F921F925F934F93B9 |
:100660009F938F938CE391E09F938F931F920E94AF |
:10067000E0088BE191E09F938F931F920E94E00826 |
:10068000299AA1E0B0E00E94D549802D2DB73EB750 |
:10069000205F3F4F0FB6F8943EBF0FBE2DBF84348E |
:1006A000A9F18CEE90E09F938F931F920E94E00837 |
:1006B0000E94B023C0E0D0E00F900F900F908AE628 |
:1006C000E82E88E0F82E1C2FC23039F0C33019F420 |
:1006D0000E948D2204C0C43010F00E941E2347E403 |
:1006E000B701812F0E949A022196C630D10559F791 |
:1006F00083E022E030E0D901082E0E94DD4984E445 |
:1007000021503040D901082E0E94DD49C4E0D0E0DC |
:10071000DE010E94D549802D853050F083ED90E0B8 |
:100720009F938F931F920E94E0080F900F900F905D |
:100730002297DE010E94D549802D863028F082E084 |
:10074000DE01082E0E94DD4947E46AE678E00E9457 |
:10075000B202DE010E94D549802D863028F082E069 |
:10076000DE01082E0E94DD4990E09F938F9388EB75 |
:1007700090E09F938F931F920E94E00880917208EF |
:100780000F900F900F900F900F9080FD03C0C8EE58 |
:10079000D3E020C08BE990E09F938F931F920E943B |
:1007A000E00888EE93E00E946C0CEC010E941F10A0 |
:1007B0000F900F900F90CE010E94750C8823D9F3F3 |
:1007C00086E990E09F938F931F920E94E0080F901C |
:1007D0000F900F900E94FF20809100018A3011F449 |
:1007E000289801C0289A469880ED97E09093C50418 |
:1007F0008093C40488EE93E090933A07809339077E |
:1008000085E58093340788E890E09F938F931F924B |
:100810000E94E008809172080F900F900F9082FF65 |
:1008200003C08CE790E002C084E790E09F938F9331 |
:100830001F920E94E0080F900F900F9080E790E0C9 |
:100840009F938F931F920E94E0080E94681088E88F |
:1008500093E190938603809385030F900F900F9000 |
:100860008091C104882309F462C01092C1040E94DF |
:1008700043240E94D420209100012A3011F42898AA |
:1008800001C0289A80910301882321F08150809330 |
:10089000030110C01092B2041092B30410927F05AD |
:1008A00010927E05109281051092800510928305AA |
:1008B0001092820580915E05882329F080915E0563 |
:1008C000815080935E058091850390918603892BEA |
:1008D00001F585E090E090938603809385030E9464 |
:1008E000611580910403909105038F5F9F4FF9F488 |
:1008F000809165058823D9F080E197E29093C50443 |
:100900008093C40480E890E09093050380930403EF |
:100910000EC0809185039091860301979093860382 |
:10092000809385032A3011F4289801C0289A0E94E8 |
:1009300017060E94B006CE010E94750C882309F4A8 |
:100940008FCF20910803309109038091820890E0B5 |
:10095000281739079CF480910403909105038F5F59 |
:100960009F4F61F480E797E19093C5048093C4049E |
:1009700080E093E0909305038093040384E690E085 |
:100980000E946C0CEC016CCF1F920F920FB60F926D |
:1009900011248F939F93EF93FF93809101018823FC |
:1009A000E1F48091BD049091BE0401969093BE0441 |
:1009B0008093BD04FC01EA5FF94FE081ED3019F04E |
:1009C0008639910539F41092BE041092BD0481E07D |
:1009D00080930101E093C60004C01092BE041092FF |
:1009E000BD04FF91EF919F918F910F900FBE0F90DB |
:1009F0001F901895DC0120E030E040E050E008C096 |
:100A0000FA01EA5FF94F8081280F311D4F5F5F4F78 |
:100A10004A175B07A9F73F70C90136E0969587959D |
:100A20003A95E1F7835CFD01EA5FF94F8083119607 |
:100A30002F73235CFD01EA5FF94F2083A95FB94F53 |
:100A40008DE08C9310920101809106068093C60080 |
:100A500008951F93CF93DF93EA01722F93E290934F |
:100A600006066093070680930806A3E0B0E060E006 |
:100A70004FC0FE01E60FF11D90816F5F715019F4B8 |
:100A800010E040E00FC0FE01E60FF11D40816F5FF6 |
:100A9000715011F410E006C0FE01E60FF11D108147 |
:100AA0006F5F7150892F86958695835CFD01EA5FA3 |
:100AB000F94F808350E09A0184E0369527958A9516 |
:100AC000E1F7892F90E083709070F4E0880F991F10 |
:100AD000FA95E1F7282B235CFD01E95FF94F2083AC |
:100AE000812F82958695869583704F705070440F44 |
:100AF000551F440F551F842B835CFD01E85FF94FA0 |
:100B000080831F73135CFD01E75FF94F1083149618 |
:100B1000772309F0AECFCD010E94FA04DF91CF9187 |
:100B20001F9108951F93CF93DF93EC0170E0A22FE4 |
:100B3000B0E0129748C0E42FF0E0E75BF84F308157 |
:100B40004F5FE42FF0E0E75BF84F50814F5FE42FF9 |
:100B5000F0E0E75BF84F10814F5FE42FF0E0E75BD8 |
:100B6000F84F20814F5F842F90E0A817B90774F1E8 |
:100B70005D53FE01E70FF11D852F82958F703D5368 |
:100B8000330F330F382B3083613001F1912F9D5398 |
:100B90007F5FFE01E70FF11D71505295507F892F45 |
:100BA00086958695582B508363506F3F79F07E5F12 |
:100BB000FE01E70FF11D9295990F990F907C2D532F |
:100BC000922B90837F5F662309F0B5CFDF91CF91A1 |
:100BD0001F9108951F93182F8A3019F48DE00E94F9 |
:100BE000EA058091C00085FFFCCF1093C60080E02D |
:100BF00090E01F9108950895E1ECF0E088E1808392 |
:100C0000A0ECB0E08C9182608C93808180688083BE |
:100C10008081806480838AE28093C40088EC90E0C5 |
:100C20000E946C0C90933307809332070895809153 |
:100C30000101882309F493C08091A204882371F0F4 |
:100C400080910101882351F0609105062BE044E377 |
:100C500057E087E40E9429051092A2048091320790 |
:100C6000909133070E94750C882321F48091A4048D |
:100C70008823F9F0809101018823D9F0609105065D |
:100C800022E44FED57E084E40E9429051092A40469 |
:100C90008091B5049091B60401969093B604809328 |
:100CA000B5048AEF90E00E946C0C90933307809318 |
:100CB0003207609102016F3F89F0462F50E094E0C7 |
:100CC000440F551F9A95E1F74C5F5E4F605D20E140 |
:100CD00081E40E9429058FEF809302018091A30493 |
:100CE000882359F180910101882339F10E94711004 |
:100CF0001092A3043091AC04932F9F5F9093AC04A7 |
:100D0000943021F08091AD04882359F026E14CE322 |
:100D100058E060E084E30E9429058FEF8093AC04E3 |
:100D20000CC044E1949FA0011124465E5C4F24E175 |
:100D300060E0832F8F5C0E9429058091A5048823A1 |
:100D400071F080910101882351F0609105062AE03D |
:100D50004FE357E086E50E9429051092A504089507 |
:100D60001F93CF93DF93CDB7DEB722970FB6F894DA |
:100D7000DEBF0FBECDBF8091A704882309F4DFC07A |
:100D80008FEF8093030180914B078B3609F45EC08F |
:100D90008C3678F4833629F1843620F4813609F0D4 |
:100DA000CCC013C0873609F45EC0883609F0C5C0D0 |
:100DB0002BC0813709F45BC0813708F480C08437C9 |
:100DC000F1F1863709F0B9C04AC02091AA0443E086 |
:100DD00062E0CE0101960E94920589818093020112 |
:100DE000ACC02091AA0443E06BE084E397E00E944A |
:100DF00092058091F10490913607892B8093F1043C |
:100E000081E08093A40499C02091AA0443E062E0A9 |
:100E1000CE0101960E9492058091F1049981892B5F |
:100E20008093F1048A818F3F21F481E08093AD04A7 |
:100E300002C01092AD0481E08093A3047EC0209193 |
:100E4000AA0443E064E08EEA94E006C02091AA047C |
:100E500043E063E082EB94E00E9492056EC081E083 |
:100E60008093A5046AC081E08093A20466C02091AB |
:100E7000AA0443E062E0CE0101960E9492058981B6 |
:100E80008F3F89F0863010F085E0898347E46AE679 |
:100E900078E089810E94B20260910506898127E489 |
:100EA0004AE658E008C0109105060E948B0227E42C |
:100EB0004AE658E0612F855B0E9429053EC02091DB |
:100EC000AA0443E067E48AE698E00E9492058091D4 |
:100ED0004B0747E46AE678E08B560E949A028091BD |
:100EE0004B078B56A2E0B0E0082E0E94DD496091CE |
:100EF000950870E080E090E024EC39E040E050E0BC |
:100F00000E940F496093870370938803809389033D |
:100F100090938A036091960870E080E090E00E94D0 |
:100F20000F4960938B0370938C0380938D03909390 |
:100F30008E030E948B020E94BF201092A70422966B |
:100F40000FB6F894DEBF0FBECDBFDF91CF911F91DA |
:100F500008951F920F920FB60F9211242F933F9373 |
:100F60004F935F936F937F938F939F93AF93BF93B1 |
:100F7000CF93DF93EF93FF938091C6008093A604F5 |
:100F80008091A6040E94013C4091B804463910F0BB |
:100F90001092B7048091A6048D3009F05DC0809155 |
:100FA000B704823009F058C01092B704A42FB0E003 |
:100FB000FD01E95BF84F3081ED01C85BD84F288116 |
:100FC0008091BB049091BC04831B9109821B910901 |
:100FD0009F709093BC048093BB049C01689415F8A7 |
:100FE000369527951694E1F7235C2093BA04982F41 |
:100FF0009F73935C9093B9048081281729F48881AA |
:10100000981711F491E006C08091A9048F5F809336 |
:10101000A90490E08091A704882309F065C0992372 |
:1010200009F462C081E08093A7044093AA04A75BFF |
:10103000B84F8DE08C9380914B07823509F054C0F6 |
:1010400088E190E02CE00FB6F894A89580936000BA |
:101050000FBE2093600048C08091B7048130D9F062 |
:10106000813018F08230F1F521C08091A6048332DE |
:1010700039F48091A704882319F481E08093B704A0 |
:101080008091A6048093490781E08093B804809101 |
:10109000A60490E022C082E08093B704E42FF0E041 |
:1010A0008091A604E75BF84F808309C0E42FF0E04D |
:1010B0008091A604E75BF84F8083463920F44F5FA8 |
:1010C0004093B80402C01092B7042091A604809106 |
:1010D000BB049091BC04820F911D9093BC0480933B |
:1010E000BB0402C01092B704FF91EF91DF91CF9142 |
:1010F000BF91AF919F918F917F916F915F914F9130 |
:101100003F912F910F900FBE0F901F901895982F21 |
:1011100080912108813069F48091F004E82FF0E09B |
:10112000E65EFC4F90838F5F8093F00421E030E017 |
:1011300005C0892F0E94EA05282F30E0C9010895D3 |
:101140001F93182F04C080E30E94870811501116C6 |
:10115000D4F31F9108951F93182F04C080E20E94BA |
:10116000870811501116D4F31F9108950F931F9300 |
:10117000CF93DF938C01EB0108C0F8010F5F1F4F85 |
:10118000E4918E2F0E94870821972097B1F7DF9175 |
:10119000CF911F910F9108950F931F93CF93DF93DA |
:1011A0008C01EB0106C0F80181918F010E94870834 |
:1011B00021972097C1F7DF91CF911F910F9108954B |
:1011C0002F923F924F925F926F927F928F929F9257 |
:1011D000AF92BF92CF92DF92EF92FF920F931F9345 |
:1011E000CF93DF93CDB7DEB7E5970FB6F894DEBFA8 |
:1011F0000FBECDBF2B968FAD2B9780932108CE01CC |
:10120000835B9F4F9B838A832D964EAC5FAC2D975B |
:101210001EA61FA618AA19AA9E01225D3F4F3DAB2C |
:101220002CAB820102C00F5F1F4FF801F490FF202A |
:1012300019F0F5E2FF16B9F7B8016419750919F04C |
:10124000C2010E94B608FF2009F445C22801089493 |
:10125000411C511C1982AA81BB8133241BAA2FEF88 |
:101260002AABF2010894411C511CB490632D70E02C |
:101270006170707035E7B31621F08B2D806288376E |
:10128000C9F46115710559F02D913D914D915C9115 |
:1012900013972EA73FA748AB59AB14960BC08D915F |
:1012A0009C9111979C0140E050E02EA73FA748ABCE |
:1012B00059AB129630E2B31621F48981882389F65E |
:1012C0001CC043E2B41611F458E055C08AE2B816C7 |
:1012D00021F09DE2B91671F408C0FD011296E0817B |
:1012E000EBABE7FFBECFE195EBABE0E13E2AFFEDD4 |
:1012F0003F22B7CF2BE2B21611F4B982B2CF3EE251 |
:10130000B31699F5F2010894411C511C84918A325C |
:1013100021F0B82E20E030E01DC0FD011296408182 |
:10132000518157FF02C04FEF5FEF4AAB9ACFC9011F |
:1013300053E0880F991F5A95E1F7220F331F280FAA |
:10134000391F2B0D311D20533040F2010894411CF0 |
:10135000511CB4908B2D80538A3048F3A90137FF7C |
:1013600002C04FEF5FEF4AAB85CF40E3B41629F4DC |
:1013700034FC77CF50E2352A74CF8B2D81538930DE |
:10138000D8F420E030E0C90103E0880F991F0A95E6 |
:10139000E1F7220F331F280F391F2B0D311D20536A |
:1013A0003040F2010894411C511CB4908B2D8053A5 |
:1013B0008A3048F32BAB5ECF88E6B81619F494E078 |
:1013C000392A4FCFECE6BE1619F4F1E03F2A49CF97 |
:1013D000BB83AA8323E6B21639F41296BB83AA8391 |
:1013E00012978C918E8322C134E4B31639F044E60F |
:1013F000B41631F059E6B516A9F502C081E0382AD5 |
:1014000030FE08C01496BB83AA835E914E913E9134 |
:101410002E910AC01296BB83AA839E918E919C0145 |
:10142000442737FD4095542F2EA73FA748AB59AB13 |
:101430008EA59FA5A8A9B9A9BB238CF42EA53FA56D |
:1014400048A959A950954095309521953F4F4F4F48 |
:101450005F4F2EA73FA748AB59AB8DE28983BAE017 |
:101460002B2E80C03FE4B31621F04FE6B41631F4C2 |
:1014700002C051E0352AA8E02A2E73C080E7B816D2 |
:1014800089F41296BB83AA839E918E919C0140E0C1 |
:1014900050E02EA73FA748AB59AB30E4332AF8E71A |
:1014A000BF2E5DC043E7B416D1F51296BB83AA8365 |
:1014B000DE90CE90C114D10489F488E28E838EE64A |
:1014C0008F8385E788878CE689878A8789E28B877F |
:1014D0001C86E6E0CE2ED12CCC0EDD1E5AA957FD7F |
:1014E00014C0452F552747FD509560E070E0C601B8 |
:1014F0000E94E746009711F4FAA80EC0F82EFC18D7 |
:101500008AA98F154CF4F82E07C0F601019000202F |
:10151000E9F73197FE2EFC18198240E090C095E55E |
:10152000B91621F0A5E7BA1631F402C0B1E03B2AA2 |
:101530007AE0272E16C0E8E5BE1621F0F8E7BF16C0 |
:1015400009F070C033FE0BC02EA53FA548A959A9CC |
:10155000211531054105510511F030E4332A60E1D0 |
:10156000262E19824AA947FD02C05FED35228EA5BD |
:101570009FA5A8A9B9A90097A105B10549F49AA901 |
:10158000992331F45EE2C52ED12CCC0EDD1E46C06F |
:101590006EA47FA488A899A84EE2C42ED12CCC0EAC |
:1015A000DD1EE22CFF2400E010E06EA57FA588A9D7 |
:1015B00099A9A80197010E9461496A3020F430E39B |
:1015C000A32EA60E08C027E5A22EA60EA8E5BA16E1 |
:1015D00011F4BFEDAB22F601A2926F016EA57FA5BB |
:1015E00088A999A9A80197010E9461492EA73FA740 |
:1015F00048AB59AB6E147F048006910618F0390190 |
:101600004A01D3CFF8E02F1649F433FE07C020E398 |
:10161000A21621F080E3D6018E936D01FCA8FC1880 |
:101620004AA90DC0BB2009F456C0BE82198296E0BB |
:10163000C92ED12CCC0EDD1E40E0FF24F394E42E05 |
:10164000EF18E7FCEE248981882319F08F2D8F5F36 |
:1016500006C036FC02C08F2D02C08F2D8E5FA82ED3 |
:10166000AE0C032D10E080E3882E912C8022912275 |
:101670008114910421F48BA98A190E94AB088981F5 |
:10168000882329F061E070E0CE01019609C006FFD1 |
:1016900009C080E38C83BD8262E070E0CE010496D5 |
:1016A0000E94CC08B0E28B16910421F48BA98A1910 |
:1016B0000E94A0088E2D0E94A0086F2D772767FD3D |
:1016C0007095C6010E94CC0804FFABCD8BA98A1986 |
:1016D0000E94AB08A6CDE5960FB6F894DEBF0FBE0C |
:1016E000CDBFDF91CF911F910F91FF90EF90DF90D1 |
:1016F000CF90BF90AF909F908F907F906F905F90B2 |
:101700004F903F902F9008951F920F920FB60F9217 |
:1017100011242F933F935F936F937F938F939F93A6 |
:10172000AF93BF938091CD0481508093CD048F3FC0 |
:1017300011F58091CB049091CC04009729F001978A |
:101740009093CC048093CB0489E08093CD04809166 |
:1017500007038F5F817080930703882319F481E06A |
:101760008093C1048091BF049091C004019690932E |
:10177000C0048093BF048091C4049091C504029773 |
:10178000B8F08091C4049091C50401979093C5046A |
:101790008093C4048091C4049091C50420910403F3 |
:1017A0003091050382239323892B09F081C006C061 |
:1017B0008FEF9FEF909305038093040380910001C6 |
:1017C0008A3039F404C05A9A05C0479A03C05A981F |
:1017D00001C04798349B0AC08091C2049091C30411 |
:1017E00001969093C3048093C20468C08091C204A0 |
:1017F0009091C304892B09F43DC08091C20490915B |
:10180000C304805A9F40B0F58FEF90E09093CC04D2 |
:101810008093CB042091C2043091C304809177055A |
:1018200090E0880F991F281B390B30934B052093AC |
:101830004A0580914A0590914B0597FF0AC0809117 |
:101840004A0590914B0588599E4F90934B05809384 |
:101850004A0580914A0590914B058856914054F075 |
:1018600080914A0590914B058856914090934B0585 |
:1018700080934A0580914A0590914B0520914C0533 |
:1018800030914D05845E9D4F821B930B68E671E09D |
:101890000E944E49845B904090934F0580934E0583 |
:1018A00081E08093C8041092C3041092C20406C061 |
:1018B000809100018A3009F088CF85CFBF91AF9128 |
:1018C0009F918F917F916F915F913F912F910F9099 |
:1018D0000FBE0F901F9018952091BF043091C00447 |
:1018E0002F5F3F4F820F931F08952091BF043091C7 |
:1018F000C004821B930B892F99278695807490E0F2 |
:1019000008951F920F920FB60F9211241F932F93D9 |
:101910003F934F935F936F937F938F939F93AF9377 |
:10192000BF93CF93DF93EF93FF9380910603815092 |
:10193000809306038F3F09F06FC083E88093B00067 |
:1019400080919C03C82FD0E0D093C704C093C604F5 |
:1019500080919F0810918C0880FF1FC060910E0538 |
:1019600070910F05809110059091110520E830E0ED |
:1019700040E050E00E948349CA01B901212F30E0C4 |
:1019800040E050E00E940F4920E032E040E050E0AB |
:101990000E948349C20FD31F1EC060910E05709133 |
:1019A0000F05809110059091110520E830E040E08E |
:1019B00050E00E948349CA01B901212F30E040E084 |
:1019C00050E00E940F4920E032E040E050E00E94E9 |
:1019D0008349C21BD30BD093C704C093C604209184 |
:1019E000C6043091C70480918D0890E0281739070C |
:1019F00034F080918E0890E08217930724F490933E |
:101A0000C7048093C6048091C6048093B30080917C |
:101A10008F088093060304C083E08093B0005F9832 |
:101A2000FF91EF91DF91CF91BF91AF919F918F91F6 |
:101A30007F916F915F914F913F912F911F910F90E7 |
:101A40000FBE0F901F9018958091BF049091C00415 |
:101A50000B969093CF048093CE0482E085BD83EAF9 |
:101A600084BD17BC88E788BD96E096BD83EC809363 |
:101A7000B0009093B100E0E7F0E080818260808365 |
:101A8000EEE6F0E08081816080838AE08093B3009D |
:101A90001092B2000895AC012091BF043091C004AF |
:101AA0002F5F3F4F03C08FEE80937A008091BF0479 |
:101AB0009091C004B901681B790BCB01840F951F6D |
:101AC00080709078892F99278695882361F30895EF |
:101AD000AC012091BF043091C0042F5F3F4F809133 |
:101AE000BF049091C004B901681B790BCB01840F2E |
:101AF000951F80709078892F99278695882379F390 |
:101B0000089510927C008FEE80937A0008951F92C2 |
:101B10000F920FB60F921124EF92FF920F931F9323 |
:101B20002F933F934F935F936F937F938F939F93E5 |
:101B3000AF93BF93CF93DF93EF93FF9310927A000D |
:101B40008091EC048F5F8093EC048150853009F420 |
:101B500086C0863090F4823009F440C0833030F47F |
:101B60008823F1F0813009F044C22FC0833009F49A |
:101B700041C0843009F03DC25AC0883009F4C2C067 |
:101B8000893038F4863009F483C0873009F031C2D7 |
:101B90009CC0893009F4D3C08A3009F02AC2B1C18F |
:101BA00080917800909179009093EB048093EA04FF |
:101BB00081E08093ED048091E4049091E504019626 |
:101BC0009093E5048093E40418C28091780090918A |
:101BD00079009093E9048093E80492C080917800A2 |
:101BE000909179009093E7048093E60484E08093D9 |
:101BF000ED0403C2409108035091090380917800DD |
:101C0000909179009A01220F331F240F351F63E052 |
:101C100070E00E943A49260F371F36952795369572 |
:101C20002795309309032093080386E0E0CF809145 |
:101C30000605909107052091780030917900821B6C |
:101C4000930B90932308809322088091220890910F |
:101C500023089093D7048093D60487E0C8CF80915F |
:101C60007800909179002091040530910505821B40 |
:101C7000930B90932E0880932D0880912D089091BE |
:101C80002E089093D9048093D8041092ED04B5C126 |
:101C9000809100012091EA043091EB048A3049F4EC |
:101CA0008091780090917900820F931F9695879587 |
:101CB00006C08091780090917900820F931F9093D5 |
:101CC000D5048093D40481E092CF809100012091CB |
:101CD000E8043091E9048A3049F4809178009091C9 |
:101CE0007900820F931F9695879506C080917800A2 |
:101CF00090917900820F931F9093D3048093D20424 |
:101D000082E075CF809100012091E6043091E704D4 |
:101D10008A3049F48091780090917900820F931F66 |
:101D20009695879506C08091780090917900820FF2 |
:101D3000931F9093D1048093D00485E058CF609195 |
:101D4000780070917900E0900805F0900905009105 |
:101D50000A0510910B05882777FD8095982F0E9422 |
:101D6000F447A80197010E94F4460E94C14770936E |
:101D7000DB046093DA04E091DA04F091DB048091F3 |
:101D8000220890912308C0912D08D0912E0897FF2A |
:101D900003C0909581959F4F64E070E00E944E498A |
:101DA0009B01CE01D7FF03C0909581959F4F64E0C2 |
:101DB00070E00E944E49260F371FE20FF31FF09389 |
:101DC000DB04E093DA048091DA049091DB0402975B |
:101DD00004F1609108057091090580910A059091C0 |
:101DE0000B0520E030E048E454E40E942F488823AB |
:101DF0000CF03CC0609108057091090580910A05BE |
:101E000090910B052AE037ED43EA5CE30E94F5462A |
:101E100025C08091DA049091DB048F5F9F4F34F5E9 |
:101E2000609108057091090580910A0590910B0554 |
:101E300020E030E046E154E40E9433481816B4F440 |
:101E4000609108057091090580910A0590910B0534 |
:101E50002AE037ED43EA5CE30E94F446609308050C |
:101E60007093090580930A0590930B0581E0809398 |
:101E7000E1048091780090917900909325088093F7 |
:101E8000240820914605309147054091480550911E |
:101E900049058091DA049091DB04AA2797FDA0956B |
:101EA000BA2F820F931FA41FB51F809346059093EE |
:101EB0004705A0934805B0934905E0904605F0908A |
:101EC00047050091480510914905609146057091BC |
:101ED0004705809148059091490520E034E040E0B5 |
:101EE00050E00E948349E21AF30A040B150BE092BA |
:101EF0004605F0924705009348051093490583E095 |
:101F000076CE8091320890913308209178003091FC |
:101F10007900820F931F9093330880933208809149 |
:101F20002A088F5F80932A0880912A08853008F458 |
:101F300060C0809178009091790090930F03809316 |
:101F40000E0310922A08809126089091270820916C |
:101F5000320830913308821B930B20916605309133 |
:101F60006705821B930B9093E3048093E204209116 |
:101F7000320830913308E0900A03F0900B0300918F |
:101F80000C0310910D03C801B701660F771F881F5E |
:101F9000991F6E0D7F1D801F911F442737FD4095AF |
:101FA000542F620F731F841F951F24E030E040E020 |
:101FB00050E00E94834920930A0330930B0340931F |
:101FC0000C0350930D03209126083091270880912F |
:101FD0000A0390910B03A0910C03B0910D03281BF1 |
:101FE000390B3093670520936605109233081092E1 |
:101FF00032081092ED041092EC048091ED0480936D |
:102000007C008091EC04882319F08FEE80937A0095 |
:10201000FF91EF91DF91CF91BF91AF919F918F9100 |
:102020007F916F915F914F913F912F911F910F91F0 |
:10203000FF90EF900F900FBE0F901F9018950F9389 |
:102040001F93CF93DF93A3E0B0E00E94D549802D8A |
:10205000C82FD0E0C531D10508F02A97C7BD84E666 |
:1020600090E00E944B0D80910E0390910F038255DA |
:102070009340C8F4C0E0D0E016C0C7BD82E390E052 |
:102080000E944B0D1F930F931F920E94E0088091B6 |
:102090000E0390910F030F900F900F908458934070 |
:1020A00038F0219602C000E711E0CA3FD10528F3BD |
:1020B000A3E0B0E00C2E0E94DD49C0932F088CE213 |
:1020C00091E00E944B0DDF91CF911F910F910895E8 |
:1020D000EAE1F3E080E2819383E0EA36F807D1F7A2 |
:1020E00008950F931F938091F104282F30E0C901C8 |
:1020F00081709070682F8823A9F08091F204882362 |
:1021000011F0815002C080916A038093F204EAE1E9 |
:10211000F3E080E2819383E0EA36F807D1F78FEFAE |
:102120008093AC04A9014270507021FF10C08091CF |
:10213000F2048F5F8093F204EAE1F3E080E281939E |
:1021400093E0EA36F907D1F78FEF8093AC0466236A |
:1021500021F0452B11F01092F20481E18093F004FC |
:102160008091F20490E09F938F938CE194E09F9391 |
:102170008F9301E00F930E94E0081091F2040F90FA |
:102180000F900F900F900F90153009F4FCC116308E |
:1021900090F4123009F4CCC0133030F41123F1F074 |
:1021A000113009F0D9C361C0133009F416C11430DD |
:1021B00009F0D2C365C1183009F416C3193038F4D8 |
:1021C000163009F499C2173009F0C6C3EAC21930B3 |
:1021D00009F447C31A3009F0BFC381C31092F00459 |
:1021E0008AE094E09F938F930F930E94E00884E12C |
:1021F0008093F00420910001822F6AE00E942E4912 |
:10220000492F50E0822F0E942E4990E022E630E0D4 |
:102210003F932F9327E030E03F932F931F921F921D |
:102220005F934F939F938F9385EF93E09F938F934B |
:102230000F930E94E00888E28093F0040E948B02D2 |
:1022400090E09F938F9388EE93E09F938F930F93EB |
:102250000E94E0088CE38093F00488ED93E09F9364 |
:102260008F930F930E94E00898C28091720880FFBC |
:1022700047C01092F00480916605909167059F9386 |
:102280008F9389EC93E09F938F931F930E94E008B4 |
:1022900084E18093F00480916805909169059F9393 |
:1022A0008F938AEB93E09F938F931F930E94E00894 |
:1022B00088E28093F00480910E0390910F039F9326 |
:1022C0008F938BEA93E09F938F931F930E94E00874 |
:1022D0008CE38093F00480912F0890E09F938F937C |
:1022E0008CE993E09F938F931F930E94E0088DB732 |
:1022F0009EB744960FB6F8949EBF0FBE8DBF31C3F4 |
:1023000084E18093F00485E993E09F938F931F937A |
:102310000E94E00888E28093F00487E893E09F93AE |
:102320008F931F930E94E0088DB79EB70696E2CF69 |
:102330001092F0048DE793E09F938F930F930E9488 |
:10234000E00884E18093F00460910E0570910F0520 |
:10235000809110059091110520E034E040E050E0BC |
:102360000E9483495F934F933F932F938EE693E0B0 |
:102370009F938F930F930E94E00888E28093F0046C |
:1023800060911605709117058091180590911905B7 |
:1023900020E034E040E050E00E9483495F934F9397 |
:1023A0003F932F938FE593E09F938F930F930E941A |
:1023B000E0088CE38093F00480914A0590914B05EE |
:1023C0009F938F9380E593E09F938F930F930E9449 |
:1023D000E0088DB79EB746968DCF1092F00480919D |
:1023E00040089091410820913E0830913F089F930A |
:1023F0008F933F932F9380E493E09F938F930F935A |
:102400000E94E00884E18093F00480914408909158 |
:10241000450820914208309143089F938F933F9342 |
:102420002F9380E393E09F938F930F930E94E00894 |
:1024300088E28093F00480914808909149082091A7 |
:102440004608309147089F938F933F932F9380E2E4 |
:1024500093E09F938F930F930E94E0088CE3809307 |
:10246000F00480914C0890914D0820914A083091D9 |
:102470004B089F938F933F932F9380E193E07AC013 |
:102480001092F004E0916B08F0E0EE0FFF1FE45CA7 |
:10249000F74F20813181E0916A08F0E0EE0FFF1FD5 |
:1024A000E45CF74F808191813F932F939F938F93AB |
:1024B00080E093E09F938F930F930E94E00884E164 |
:1024C0008093F004E0916D08F0E0EE0FFF1FE45CF4 |
:1024D000F74F20813181E0916C08F0E0EE0FFF1F93 |
:1024E000E45CF74F808191813F932F939F938F936B |
:1024F00080EF92E09F938F930F930E94E00888E211 |
:102500008093F004E0916F08F0E0EE0FFF1FE45CB1 |
:10251000F74F20813181E0916E08F0E0EE0FFF1F50 |
:10252000E45CF74F808191813F932F939F938F932A |
:1025300080EE92E09F938F930F930E94E0088CE3CC |
:102540008093F004E0917108F0E0EE0FFF1FE45C6F |
:10255000F74F20813181E0917008F0E0EE0FFF1F0E |
:10256000E45CF74F808191813F932F939F938F93EA |
:1025700080ED92E09F938F930F930E94E0088DB7B8 |
:102580009EB74C96B7CE1092F00482EC92E09F93E7 |
:102590008F930F930E94E0080F900F900F908091FF |
:1025A00000018A3009F04AC084E18093F004409130 |
:1025B000FA045091FB048091D0049091D1042091B1 |
:1025C000FA043091FB04821B930B5F934F939F930C |
:1025D0008F9383EB92E09F938F930F930E94E00879 |
:1025E00088E28093F0044091FC045091FD048091B6 |
:1025F000D2049091D3042091FC043091FD04821BFD |
:10260000930B5F934F939F938F9384EA92E09F93F2 |
:102610008F930F930E94E0088CE38093F0048091E5 |
:10262000FE049091FF042091F1083091F2089F93ED |
:102630008F933F932F9385E992E055C084E1809377 |
:10264000F0048091FA049091FB0462E070E00E9433 |
:102650004E498091D0049091D1042091FA04309198 |
:10266000FB04821B930B7F936F939F938F9386E85A |
:1026700092E09F938F930F930E94E00888E28093EB |
:10268000F0048091FC049091FD0462E070E00E94EF |
:102690004E498091D2049091D3042091FC04309152 |
:1026A000FD04821B930B7F936F939F938F9387E718 |
:1026B00092E09F938F930F930E94E0088CE38093A6 |
:1026C000F0048091FE049091FF0462E070E00E94AB |
:1026D0004E498091F1089091F2087F936F939F93F8 |
:1026E0008F9388E692E09F938F930F930E94E00868 |
:1026F0008DB79EB74596FECD1092F0048BE592E023 |
:102700009F938F930F930E94E00884E18093F004DD |
:1027100080910405909105052091D8043091D90449 |
:102720009F938F933F932F938CE492E09F938F938B |
:102730000F930E94E00888E28093F00480910605E0 |
:10274000909107052091D6043091D7049F938F93E1 |
:102750003F932F938DE392E09F938F930F930E946B |
:10276000E0088CE38093F0046091080570910905FE |
:1027700080910A0590910B050E94C1472091C508E0 |
:102780003091C6087F936F933F932F938EE292E030 |
:102790009F938F930F930E94E0088DB79EB7489642 |
:1027A000A9CD84E18093F0048091080390910903FE |
:1027B0009F938F938FE192E09F938F930F930E944B |
:1027C000E00888E28093F00480915E0590E09F939A |
:1027D0008F9380E192E09F938F930F930E94E00884 |
:1027E0008DB79EB70A9686CD1092F00481E092E0F4 |
:1027F0009F938F930F930E94E00884E18093F004ED |
:1028000080914E0590914F059F938F9382EF91E0B9 |
:102810009F938F930F930E94E00888E28093F004C7 |
:1028200080914A0590914B059F938F9383EE91E0A1 |
:102830009F938F930F930E94E0088CE38093F004A2 |
:1028400080914C0590914D059F938F9384ED91E07D |
:102850009F938F930F930E94E0088DB79EB7429687 |
:1028600049CD1092F00480915605909157059F93A1 |
:102870008F9388EC91E09F938F930F930E94E008D1 |
:1028800084E18093F00480915805909159059F93BD |
:102890008F938CEB91E09F938F930F930E94E008AE |
:1028A00088E28093F00480915A0590915B059F9394 |
:1028B0008F9380EB91E09F938F930F930E94E0089A |
:1028C0008CE38093F00480915C0590915D059F936B |
:1028D0008F9384EA91E09F938F930F9306CD10928C |
:1028E000F0048CE991E09F938F930F930E94E0088E |
:1028F00084E18093F00480919C0390E09F938F93F8 |
:102900008EE891E09F938F930F930E94E00888E2F6 |
:102910008093F0048091C6049091C7049F938F9395 |
:1029200080E891E09F938F930F930E94E0088CE3DF |
:102930008093F00420918E0830E080918D0890E023 |
:102940003F932F939F938F9382E791E09F938F9371 |
:102950000F930E94E008CBCC115010936A031092A1 |
:10296000F2041092F1041F910F9108951092B90092 |
:102970008AE28093B800089585EA8093BC0080E0E5 |
:1029800090E0089584E98093BC0008951092B90006 |
:102990008093BB0085E88093BC0080E090E00895C0 |
:1029A0001F920F920FB60F9211248F939F93EF9364 |
:1029B000FF938091F3048F5F8093F3048150833001 |
:1029C000C1F1843028F4813091F0823020F50AC0C2 |
:1029D0008530B9F18530E8F18630D9F1873009F0DA |
:1029E00062C046C08091F404880F8E5A0CC080915A |
:1029F000F4048F5F8093F40481502DC0833009F07C |
:102A000052C08091E9081092B9008093BB0085E81C |
:102A10008093BC0048C084E98093BC008091F4049A |
:102A2000843018F41092F30402C01092F40485EA82 |
:102A3000EFCF8091F504880F8D5AE5CF8230A9F051 |
:102A4000DDCF8091BB00E091F504F0E0EC5CF74F46 |
:102A500080838091F504813029F0813078F780916E |
:102A6000B408D1CF8091B908CECF8091DD08CBCF0B |
:102A70008091F5049091BB00E82FF0E0EC5CF74FFB |
:102A800094838F5F8093F504843010F01092F504E6 |
:102A900084E98093BC008AE090E090938603809361 |
:102AA00085031092F3048091BC0080688093BC0081 |
:102AB000FF91EF919F918F910F900FBE0F901F90FC |
:102AC00018954CEB50E084E9DA018C931092F304F2 |
:102AD0002BEB30E0F90180811092F40480E88C93B4 |
:102AE0001092BD001092BA001082E9EBF0E0108263 |
:102AF000A8EBB0E01C9210828AE28C9385EADA019E |
:102B00008C931082F901108285E88C93089583ECF0 |
:102B100080938100EFE6F0E08081806280831092F4 |
:102B2000FF041092FE041092FD041092FC04109217 |
:102B3000FB041092FA0408951F920F920FB60F92A1 |
:102B400011240F931F932F933F934F935F936F9392 |
:102B50007F938F939F93AF93BF93CF93DF93EF9325 |
:102B6000FF9320918600309187008091F804909126 |
:102B7000F904281B390B809186009091870090936F |
:102B8000F9048093F804C9018D549440C091F6046F |
:102B9000D091F704835F9A4158F4249714F010926F |
:102BA0006B0381E090E09093F7048093F60462C099 |
:102BB000CA30D1050CF05EC0C9018B5F9040845BC8 |
:102BC000914008F040C0A901425D5140FE01EE0F66 |
:102BD000FF1FE45CF74F80819181FA01E81BF90B3C |
:102BE000CF01F7FF03C0909581959F4F06974CF456 |
:102BF00080915E05883C28F480915E05865F809315 |
:102C00005E05FE01EE0FFF1F8F01045C174FD80118 |
:102C10002D913C91C901880F991F820F931F840F3A |
:102C2000951F64E070E00E944E49D8018D919C91FF |
:102C300011979B01281B390BEE5AF74F31832083E4 |
:102C400011967C936E93FE013196F093F704E09316 |
:102C5000F604E530F10511F45D9A06C05D98E630A2 |
:102C6000F10511F45C9A05C05C98379711F45B9AF2 |
:102C700001C05B98FF91EF91DF91CF91BF91AF9130 |
:102C80009F918F917F916F915F914F913F912F9184 |
:102C90001F910F910F900FBE0F901F9018952F92BC |
:102CA0003F924F925F926F927F928F929F92AF92DC |
:102CB000BF92CF92DF92EF92FF920F931F93CF9329 |
:102CC000DF93CDB7DEB722970FB6F894DEBF0FBE05 |
:102CD000CDBF8091FE049091FF042091D4043091E7 |
:102CE000D504821B930B9093F2088093F108809196 |
:102CF000D2049091D3042091FC043091FD04821BF6 |
:102D0000930B9093B3088093B2088091D004909174 |
:102D1000D1042091FA043091FB04821B930B909311 |
:102D2000BB088093BA082091EC083091ED086091BF |
:102D3000D8047091D904882777FD8095982FB4E046 |
:102D4000660F771F881F991FBA95D1F7442737FD63 |
:102D50004095542F620F731F841F951F22E030E0AF |
:102D600040E050E00E9483493093ED082093EC0846 |
:102D70002091F8083091F9086091D6047091D70439 |
:102D8000882777FD8095982FA4E0660F771F881F0E |
:102D9000991FAA95D1F7442737FD4095542F620F0C |
:102DA000731F841F951F22E030E040E050E00E9436 |
:102DB00083493093F9082093F8082091C508309191 |
:102DC000C6086091DA047091DB04882777FD80954E |
:102DD000982F442737FD4095542F620F731F841F8F |
:102DE000951F22E030E040E050E00E94834930939C |
:102DF000C6082093C50820911E0530911F054091FB |
:102E00002005509121058091D8049091D904F4E0D7 |
:102E1000880F991FFA95E1F7AA2797FDA095BA2F79 |
:102E2000820F931FA41FB51F80931E0590931F054B |
:102E3000A0932005B0932105209122053091230510 |
:102E400040912405509125058091D6049091D70496 |
:102E5000E4E0880F991FEA95E1F7AA2797FDA0956E |
:102E6000BA2F820F931FA41FB51F80932205909342 |
:102E70002305A0932405B093250560912605709144 |
:102E800027058091280590912905E0902408F0906D |
:102E90002508A0900805B0900905C0900A05D090BB |
:102EA0000B050E94F4473B014C010027F7FC0095FD |
:102EB000102FC801B7010E94F447A60195010E9496 |
:102EC000F4469B01AC01C401B3010E94F5460E9487 |
:102ED000C14760932605709327058093280590933A |
:102EE00029052091F1083091F208442737FD4095DB |
:102EF000542F8091010990910209A0910309B0918A |
:102F00000409820F931FA41FB51F8093010990939A |
:102F10000209A0930309B09304092091F1083091AC |
:102F2000F208442737FD4095542F8091C9089091AD |
:102F3000CA08A091CB08B091CC08820F931FA41FA0 |
:102F4000B51F8093C9089093CA08A093CB08B0938B |
:102F5000CC0820913E0530913F05409140055091AD |
:102F600041058091F1089091F208AA2797FDA0955C |
:102F7000BA2F820F931FA41FB51F80933E05909315 |
:102F80003F05A0934005B093410520914205309143 |
:102F9000430540914405509145058091F108909179 |
:102FA000F208AA2797FDA095BA2F820F931FA41F9E |
:102FB000B51F8093420590934305A0934405B093B9 |
:102FC000450520916E052A83222309F069C080916E |
:102FD0006F05882309F064C08091720886FF60C085 |
:102FE00060912E0570912F058091300590913105EB |
:102FF000E090F108F090F208A0907C05BB24CC246E |
:10300000DD240027F7FC0095102F20E030E140E0A0 |
:1030100050E00E948349C801B7010E940F49A601F0 |
:1030200095010E940F4920E038E040E050E00E9406 |
:1030300083492093C7053093C8054093C905509331 |
:10304000CA056091360570913705809138059091D9 |
:103050003905E090F108F090F20820E030E140E01E |
:1030600050E00E948349CA01B901A60195010E945E |
:103070000F490027F7FC0095102FA80197010E9427 |
:103080000F4920E038E040E050E00E94834920935F |
:10309000C3053093C4054093C5055093C60510C0C1 |
:1030A0001092C3051092C4051092C5051092C60572 |
:1030B0001092C7051092C8051092C9051092CA0552 |
:1030C0008091B2089091B3082090C7053090C80550 |
:1030D0004090C9055090CA05820D931D9093B30886 |
:1030E0008093B2080091B2081091B308A090C30574 |
:1030F000B090C405C090C505D090C60580917D05EF |
:10310000682E772488249924C401B301A60195016F |
:103110000E940F4920E032E040E050E00E948349E5 |
:10312000020F131F1093B3080093B20820913A05C1 |
:1031300030913B0540913C0550913D058091B2088E |
:103140009091B308AA2797FDA095BA2F820F931FDD |
:10315000A41FB51F80933A0590933B05A0933C05AF |
:10316000B0933D0540913605509137056091380583 |
:10317000709139058091B2089091B30820916A0549 |
:1031800030916B05821B930BAA2797FDA095BA2F50 |
:10319000840F951FA61FB71F8093360590933705A0 |
:1031A000A0933805B0933905809136059091370585 |
:1031B000A0913805B0913905E0908B03F0908C0315 |
:1031C00000918D0310918E03E816F9060A071B077C |
:1031D00004F580E197E2A0E0B0E08E199F09A00B12 |
:1031E000B10B8093360590933705A0933805B093C3 |
:1031F00039058091360590913705A0913805B09139 |
:10320000390580933A0590933B05A0933C05B09314 |
:103210003D05209136053091370540913805509194 |
:10322000390588279927DC018E199F09A00BB10B5E |
:10323000281739074A075B0704F580EF98EDAFEFD1 |
:10324000BFEFE80EF91E0A1F1B1FE0923605F09231 |
:103250003705009338051093390580913605909114 |
:103260003705A0913805B091390580933A059093C0 |
:103270003B05A0933C05B0933D058091D20490910D |
:10328000D3040F9734F488E19CEF9093B3088093B4 |
:10329000B2088091D2049091D304079734F480E36C |
:1032A00098EF9093B3088093B208909100019983AE |
:1032B0009A30A9F48091D2049091D304835F934013 |
:1032C00034F088EE93E09093B3088093B208809135 |
:1032D000D2049091D3048A5F9340DCF014C08091B3 |
:1032E000D2049091D304855E974034F088EE93E049 |
:1032F0009093B3088093B2088091D2049091D30444 |
:10330000835F974034F080ED97E09093B30880930B |
:10331000B2088091BA089091BB088A199B099093D2 |
:10332000BB088093BA080091BA081091BB08C40189 |
:10333000B301A20191010E940F4920E032E040E078 |
:1033400050E00E948349021B130B1093BB080093AB |
:10335000BA082091320530913305409134055091DF |
:1033600035058091BA089091BB08AA2797FDA095D2 |
:10337000BA2F820F931FA41FB51F8093320590931D |
:103380003305A0933405B093350540912E05509137 |
:103390002F0560913005709131058091BA089091A8 |
:1033A000BB0820916C0530916D05821B930BAA27F9 |
:1033B00097FDA095BA2F840F951FA61FB71F809366 |
:1033C0002E0590932F05A0933005B0933105809181 |
:1033D0002E0590912F05A0913005B0913105E09018 |
:1033E0008703F09088030091890310918A03E816FF |
:1033F000F9060A071B0704F580E197E2A0E0B0E0B8 |
:103400008E199F09A00BB10B80932E0590932F0569 |
:10341000A0933005B093310580912E0590912F0532 |
:10342000A0913005B091310580933205909333051A |
:10343000A0933405B093350520912E0530912F05CA |
:10344000409130055091310588279927DC018E196C |
:103450009F09A00BB10B281739074A075B0704F532 |
:1034600080EF98EDAFEFBFEFE80EF91E0A1F1B1FAC |
:10347000E0922E05F0922F05009330051093310550 |
:1034800080912E0590912F05A0913005B0913105C6 |
:103490008093320590933305A0933405B09335059E |
:1034A0008091D0049091D1040F9734F488E19CEF7F |
:1034B0009093BB088093BA088091D0049091D10476 |
:1034C000079734F480E398EF9093BB088093BA0891 |
:1034D00099819A30A9F48091D0049091D104835FAE |
:1034E000934034F088EE93E09093BB088093BA0841 |
:1034F0008091D0049091D1048A5F9340DCF014C095 |
:103500008091D0049091D104855E974034F088EE8C |
:1035100093E09093BB088093BA088091D004909177 |
:10352000D104835F974034F080ED97E09093BB081F |
:103530008093BA088FEE80937A0080913E05909137 |
:103540003F05A0914005B091410580932A059093D5 |
:103550002B05A0932C05B0932D0580912E059091FD |
:103560002F05A0913005B091310580930E05909301 |
:103570000F05A0931005B093110580913605909129 |
:103580003705A0913805B0913905809316059093C1 |
:103590001705A0931805B0931905809132059091F5 |
:1035A0003305A0913405B0913505809312059093B1 |
:1035B0001305A0931405B093150580913A059091D9 |
:1035C0003B05A0913C05B0913D0580931A05909371 |
:1035D0001B05A0931C05B0931D058091720887FF01 |
:1035E00063C02A81222309F05FC080916F05882380 |
:1035F00009F05AC08091BA089091BB08893C9105A6 |
:103600005CF02091BA083091BB088091BA08909183 |
:10361000BB082052334011C08091BA089091BB087A |
:1036200088539F4FA4F42091BA083091BB08809131 |
:10363000BA089091BB08205E3C4F880F991F880FF5 |
:10364000991F280F391F3093BB082093BA08809127 |
:10365000B2089091B308893C91055CF02091B208C2 |
:103660003091B3088091B2089091B3082052334052 |
:1036700011C08091B2089091B30888539F4FA4F471 |
:103680002091B2083091B3088091B2089091B308AC |
:10369000205E3C4F880F991F880F991F280F391FF4 |
:1036A0003093B3082093B208209156053091570506 |
:1036B00080916E08E82FF0E0EE0FFF1FE45CF74FFB |
:1036C0008081918182599F4F281739071CF42F5F01 |
:1036D0003F4F0CC08081918182599F4F8217930781 |
:1036E0004CF42115310531F021503040309357050D |
:1036F00020935605209158053091590580916F0807 |
:10370000E82FF0E0EE0FFF1FE45CF74F808191811E |
:1037100082599F4F281739071CF42F5F3F4F0CC069 |
:103720008081918182599F4F821793074CF4211514 |
:10373000310531F021503040309359052093580520 |
:1037400020915A0530915B0580917008E82FF0E0D8 |
:10375000EE0FFF1FE45CF74F8081918182599F4FEC |
:10376000281739071CF42F5F3F4F0CC080819181CF |
:1037700082599F4F821793074CF42115310531F080 |
:103780002150304030935B0520935A0520915C0511 |
:1037900030915D0580917108E82FF0E0EE0FFF1F7A |
:1037A000E45CF74F8081918182599F4F2817390738 |
:1037B0001CF42F5F3F4F0CC08081918182599F4F35 |
:1037C000821793074CF42115310531F02150304018 |
:1037D00030935D0520935C058091560590915705C7 |
:1037E00097FF05C010925705109256050AC08F3FEB |
:1037F000910539F034F08FEF90E090935705809366 |
:103800005605809158059091590597FF05C0109273 |
:103810005905109258050AC08F3F910539F034F0D0 |
:103820008FEF90E0909359058093580580915A0549 |
:1038300090915B0597FF05C010925B0510925A05A9 |
:103840000AC08F3F910539F034F08FEF90E09093EC |
:103850005B0580935A0580915C0590915D0597FF0B |
:1038600005C010925D0510925C050AC08F3F91055E |
:1038700039F034F08FEF90E090935D0580935C0514 |
:1038800022960FB6F894DEBF0FBECDBFDF91CF9169 |
:103890001F910F91FF90EF90DF90CF90BF90AF906E |
:1038A0009F908F907F906F905F904F903F902F9060 |
:1038B000089510927A008091D0049091D104909351 |
:1038C000BB088093BA088091D2049091D30490935E |
:1038D000B3088093B2088091D4049091D50490935A |
:1038E000F2088093F1088091D8049091D904AA2716 |
:1038F00097FDA095BA2F74E0880F991FAA1FBB1FD0 |
:103900007A95D1F79093ED088093EC088091D604D6 |
:103910009091D704AA2797FDA095BA2F64E0880F4D |
:10392000991FAA1FBB1F6A95D1F79093F90880933E |
:10393000F8088091DA049091DB049093C608809394 |
:10394000C5088FEE80937A00209156053091570577 |
:1039500080916E08E82FF0E0EE0FFF1FE45CF74F58 |
:103960008081918182599F4F281739071CF42F5F5E |
:103970003F4F0CC08081918182599F4F82179307DE |
:103980004CF42115310531F021503040309357056A |
:1039900020935605209158053091590580916F0864 |
:1039A000E82FF0E0EE0FFF1FE45CF74F808191817C |
:1039B00082599F4F281739071CF42F5F3F4F0CC0C7 |
:1039C0008081918182599F4F821793074CF4211572 |
:1039D000310531F02150304030935905209358057E |
:1039E00020915A0530915B0580917008E82FF0E036 |
:1039F000EE0FFF1FE45CF74F8081918182599F4F4A |
:103A0000281739071CF42F5F3F4F0CC0808191812C |
:103A100082599F4F821793074CF42115310531F0DD |
:103A20002150304030935B0520935A0520915C056E |
:103A300030915D0580917108E82FF0E0EE0FFF1FD7 |
:103A4000E45CF74F8081918182599F4F2817390795 |
:103A50001CF42F5F3F4F0CC08081918182599F4F92 |
:103A6000821793074CF42115310531F02150304075 |
:103A700030935D0520935C05809156059091570524 |
:103A800097FF05C010925705109256050AC08F3F48 |
:103A9000910539F034F08FEF90E0909357058093C3 |
:103AA0005605809158059091590597FF05C01092D1 |
:103AB0005905109258050AC08F3F910539F034F02E |
:103AC0008FEF90E0909359058093580580915A05A7 |
:103AD00090915B0597FF05C010925B0510925A0507 |
:103AE0000AC08F3F910539F034F08FEF90E090934A |
:103AF0005B0580935A0580915C0590915D0597FF69 |
:103B000005C010925D0510925C050AC08F3F9105BB |
:103B100039F034F08FEF90E090935D0580935C0571 |
:103B20006091950870E080E090E024EC39E040E09E |
:103B300050E00E940F49609387037093880380933D |
:103B4000890390938A0360938B0370938C03809313 |
:103B50008D0390938E030895809175088B3F98F0A4 |
:103B60008B3F19F4809156050EC08C3F19F480915B |
:103B7000580509C08D3F19F480915A0504C08E3F45 |
:103B800021F480915C0580939403809194038823B1 |
:103B900019F41092940304C08F3F11F4809394039E |
:103BA000809174088B3F98F08B3F19F480915605F3 |
:103BB0000EC08C3F19F48091580509C08D3F19F44F |
:103BC00080915A0504C08E3F21F480915C0580935A |
:103BD000930380919303882319F41092930305C0F3 |
:103BE000843618F084E680939303809176088B3FA7 |
:103BF00098F08B3F19F4809156050EC08C3F19F454 |
:103C00008091580509C08D3F19F480915A0504C070 |
:103C10008E3F21F480915C058093950380919503FC |
:103C2000882319F41092950305C0843618F084E6B1 |
:103C300080939503809178088B3F98F08B3F19F41F |
:103C4000809156050EC08C3F19F48091580509C02B |
:103C50008D3F19F480915A0504C08E3F21F4809164 |
:103C60005C058093960380919603882319F4109243 |
:103C7000960304C08F3F11F48093960380917F08D0 |
:103C80008B3F98F08B3F19F4809156050EC08C3F06 |
:103C900019F48091580509C08D3F19F480915A0597 |
:103CA00004C08E3F21F480915C058093970380913E |
:103CB0009703882319F41092970304C08F3F11F4DF |
:103CC00080939703809180088B3F98F08B3F19F485 |
:103CD000809156050EC08C3F19F48091580509C09B |
:103CE0008D3F19F480915A0504C08E3F21F48091D4 |
:103CF0005C0580939803809198038B3010F48AE0E0 |
:103D000002C08F3F11F480939803809181088B3F0C |
:103D100098F08B3F19F4809156050EC08C3F19F432 |
:103D20008091580509C08D3F19F480915A0504C04F |
:103D30008E3F21F480915C058093990380919903D3 |
:103D4000882319F41092990304C08F3F11F48093D3 |
:103D50009903809186088B3F98F08B3F19F48091EE |
:103D600056050EC08C3F19F48091580509C08D3F4F |
:103D700019F480915A0504C08E3F21F480915C05AE |
:103D800080939B0380919B03882319F410929B03DB |
:103D900004C08F3F11F480939B03809187088B3F71 |
:103DA00098F08B3F19F4809156050EC08C3F19F4A2 |
:103DB0008091580509C08D3F19F480915A0504C0BF |
:103DC0008E3F21F480915C05809374058091740589 |
:103DD000882319F41092740504C08F3F11F4809366 |
:103DE0007405809188088B3F98F08B3F19F480917F |
:103DF00056050EC08C3F19F48091580509C08D3FBF |
:103E000019F480915A0504C08E3F21F480915C051D |
:103E10008093750580917505882319F410927505B6 |
:103E200004C08F3F11F480937505809189088B3F02 |
:103E300098F08B3F19F4809156050EC08C3F19F411 |
:103E40008091580509C08D3F19F480915A0504C02E |
:103E50008E3F21F480915C058093760580917605F4 |
:103E6000882319F41092760504C08F3F11F48093D3 |
:103E7000760580918A088B3F98F08B3F19F48091EA |
:103E800056050EC08C3F19F48091580509C08D3F2E |
:103E900019F480915A0504C08E3F21F480915C058D |
:103EA0008093770580917705882319F41092770520 |
:103EB00004C08F3F11F48093770580919A088B3F5F |
:103EC00098F08B3F19F4809156050EC08C3F19F481 |
:103ED0008091580509C08D3F19F480915A0504C09E |
:103EE0008E3F21F480915C05809378058091780560 |
:103EF000882319F41092780504C08F3F11F4809341 |
:103F0000780580919B088B3F98F08B3F19F4809146 |
:103F100056050EC08C3F19F48091580509C08D3F9D |
:103F200019F480915A0504C08E3F21F480915C05FC |
:103F30008093790580917905882319F41092790589 |
:103F400004C08F3F11F48093790580919C088B3FCA |
:103F500098F08B3F19F4809156050EC08C3F19F4F0 |
:103F60008091580509C08D3F19F480915A0504C00D |
:103F70008E3F21F480915C0580937A0580917A05CB |
:103F8000882319F410927A0504C08F3F11F48093AE |
:103F90007A0580919D088B3F98F08B3F19F48091B2 |
:103FA00056050EC08C3F19F48091580509C08D3F0D |
:103FB00019F480915A0504C08E3F21F480915C056C |
:103FC00080937B0580917B05882319F410927B05F3 |
:103FD00004C08F3F11F480937B0580918B088B3F49 |
:103FE00098F08B3F19F4809156050EC08C3F19F460 |
:103FF0008091580509C08D3F19F480915A0504C07D |
:104000008E3F21F480915C0580939C0380919C03FA |
:10401000882319F410929C0304C08F3F11F48093FD |
:104020009C03809190088B3F98F08B3F19F480910E |
:1040300056050EC08C3F19F48091580509C08D3F7C |
:1040400019F480915A0504C08E3F21F480915C05DB |
:1040500080939D0380919D03882319F410929D0302 |
:1040600004C08F3F11F480939D03809193088B3F90 |
:1040700098F08B3F19F4809156050EC08C3F19F4CF |
:104080008091580509C08D3F19F480915A0504C0EC |
:104090008E3F21F480915C0580937C0580917C05A6 |
:1040A000882319F410927C0504C08F3F11F480938B |
:1040B0007C05809194088B3F98F08B3F19F4809198 |
:1040C00056050EC08C3F19F48091580509C08D3FEC |
:1040D00019F480915A0504C08E3F21F480915C054B |
:1040E00080937D0580917D05882319F410927D05CC |
:1040F00004C08F3F11F480937D05809199088B3F18 |
:1041000098F08B3F19F4809156050EC08C3F19F43E |
:104110008091580509C08D3F19F480915A0504C05B |
:104120008E3F21F480915C0580939E0380919E03D5 |
:10413000882319F410929E0304C08F3F11F48093DA |
:104140009E0360919B0370E080E090E00E944745F1 |
:1041500027E137EB41ED58E30E94AC4860938F03B1 |
:1041600070939003809391039093920380917D08C4 |
:104170008093F00880917C088093BC0808951F9379 |
:10418000182F0EC080916505882361F484E690E0C5 |
:104190009093C5048093C4048AEF90E00E94680D58 |
:1041A000115080F71F91089580916505882301F5CE |
:1041B0001092B9081092B4081092DD081092E90824 |
:1041C0008091AE04882311F08093B4088091AF04ED |
:1041D000882311F08093B9088091B004882311F0EE |
:1041E0008093E9088091B104882311F08093DD0861 |
:1041F0001092F3041092F4040E94BC140895469A9D |
:1042000010920505109204051092070510920605FC |
:1042100080E090E0A0E0B0E080930805909309056D |
:10422000A0930A05B0930B051092FB041092FA04B8 |
:104230001092FD041092FC041092FF041092FE04F0 |
:1042400010927C0510927D050E94591C84E690E036 |
:104250000E944B0D0E94591C8091720880FF10C073 |
:1042600080910E0390910F03875B934038F4809107 |
:104270000E0390910F038E5E924010F40E941F1067 |
:104280008091D0049091D1049093FB048093FA0420 |
:104290008091D2049091D3049093FD048093FC0408 |
:1042A0008091D4049091D5049093FF048093FE04F0 |
:1042B0008091FC049091FD0490930105809300058A |
:1042C0008091FA049091FB0490930305809302057A |
:1042D00044E050E0DA010E94D549802D853038F164 |
:1042E0008091F8089091F90897FF03C09095819507 |
:1042F0009F4F60E170E00E944E4970930705609304 |
:1043000006058091EC089091ED0897FF03C0909509 |
:1043100081959F4F60E170E00E944E4970930505C2 |
:1043200060930405609124087091250839C0DA0172 |
:104330000E94D549802D4F5F5F4FDA010E94D54919 |
:10434000202D90E0982F8827820F911D90930505CE |
:10435000809304054F5F5F4FDA010E94D549802D9D |
:104360004F5F5F4FDA010E94D549202D90E0982FD2 |
:104370008827820F911D90930705809306054F5F54 |
:104380005F4FDA010E94D549602D4F5F5F4FDA0120 |
:104390000E94D549202D70E0762F6627620F711D8F |
:1043A000882777FD8095982F0E94F4476093080531 |
:1043B0007093090580930A0590930B0510922E05C2 |
:1043C00010922F051092300510923105109232058F |
:1043D000109233051092340510923505109236056F |
:1043E00010923705109238051092390510923A054F |
:1043F00010923B0510923C0510923D0510923E052F |
:1044000010923F0510924005109241051092BB0892 |
:104410001092BA081092B3081092B2081092F208E3 |
:104420001092F1081092C9081092CA081092CB0895 |
:104430001092CC0880910A0390910B03A0910C0379 |
:10444000B0910D0390932708809326081092E304FF |
:104450001092E2041092460510924705109248050A |
:104460001092490580914A0590914B0590934D0516 |
:1044700080934C050E94B23A82E390E09093C50489 |
:104480008093C4046091950870E080E090E024EC93 |
:1044900039E040E050E00E940F4960938703709339 |
:1044A00088038093890390938A036091960870E053 |
:1044B00080E090E00E940F4960938B0370938C031F |
:1044C00080938D0390938E031092A00310929F030C |
:1044D00020914A0530914B0584E195E0AC01249F81 |
:1044E000C001259F900D349F900D1124AA2797FDA0 |
:1044F000A095BA2F8093010990930209A093030914 |
:10450000B09304098EE190E09093CE058093CD05A1 |
:104510009093CC058093CB05089581E080936A0841 |
:1045200052E050936B0843E040936C0874E0709342 |
:104530006D0865E060936E0886E080936F0887E001 |
:104540008093700898E09093710880EC80937208D3 |
:104550008EE1809373088BEF809375083AE0309377 |
:10456000760822E320937408209378085093770804 |
:104570004093790810927A0890937B088FE080939B |
:104580007C088AEF80937D088AE180937E0880E82A |
:1045900080937F0888EC809380088FEA809381085D |
:1045A00082E6809382088FE5809383088CE3809372 |
:1045B0008408109285083093860880E580938708E8 |
:1045C000109288081092890810928A0810929A080E |
:1045D00010929B0810929C0810929D0894E690936C |
:1045E0008B0888E280938C0810929F0820938D0896 |
:1045F00086E980938E0860938F08209390088AE55F |
:10460000809391082093920810929E0890939308AB |
:1046100030939408909395089093960890939708F8 |
:104620007093980820939908A4EAB8E0ECE6F3E0C8 |
:104630008CE001900D928150E1F7089581E0809324 |
:104640006A0892E090936B0883E080936C0844E0E2 |
:1046500040936D0855E050936E0886E080936F0894 |
:1046600087E08093700888E08093710880E48093ED |
:1046700072088EE1809373088BEF809375083AE09F |
:104680003093760822E3209374082093780890935F |
:1046900077084093790810927A0830937B088FE06E |
:1046A00080937C088AEF80937D088AE180937E085E |
:1046B00080E880937F088FEA809380088093810848 |
:1046C00082E6809382088FE5809383088CE3809351 |
:1046D00084081092850880E28093860880E58093A4 |
:1046E0008708109288081092890810928A08109200 |
:1046F0009A0810929B0810929C0810929D0894E6CC |
:1047000090938B0888E280938C0810929F082093E6 |
:104710008D0886E980938E0850938F082093900827 |
:104720008AE5809391082093920810929E089093B6 |
:1047300093083093940890939508909396089093DB |
:104740009708409398088BE480939908A4EAB8E00E |
:10475000E6E7F3E08CE001900D928150E1F70895D7 |
:1047600081E080936A0882E080936B0893E09093E5 |
:104770006C0844E040936D0875E070936E0886E025 |
:1047800080936F0887E08093700888E080937108B9 |
:1047900080E4809372088EE1809373088BEF80939E |
:1047A00075086AE06093760822E3209374082093EA |
:1047B0007808409377089093790840937A088EE0C0 |
:1047C00080937B088FE080937C088AEF80937D083C |
:1047D0008AE180937E0880E880937F0888E7809351 |
:1047E000800856E95093810882E6809382088FE51D |
:1047F000809383088CE3809384081092850880E27C |
:10480000809386083AE53093870888E1809388088A |
:1048100082E88093890810928A0810929A08109270 |
:104820009B0810929C0810929D0894E690938B0828 |
:1048300088E280938C0810929F0820938D085093F3 |
:104840008E0870938F0820939008309391082093DE |
:10485000920810929E089093930860939408909306 |
:104860009508909396082093970840939808909302 |
:104870009908A4EAB8E0EEE7F3E08CE001900D922D |
:104880008150E1F708952F923F924F925F926F927D |
:104890007F928F929F92AF92BF92CF92DF92EF92D0 |
:1048A000FF920F931F93CF93DF93CDB7DEB7669739 |
:1048B0000FB6F894DEBF0FBECDBF0E944F16809199 |
:1048C0006C0990916D09009729F0019790936D09FB |
:1048D00080936C090E94763B892B39F4809100010A |
:1048E0008A3011F4289A01C02898299AE0916C081E |
:1048F000F0E0EE0FFF1FE45CF74F00811181809123 |
:10490000F00890E0449708581F4F801791070CF467 |
:104910008C0120910803309109038091820890E076 |
:104920000497409184055091850582179307C4F13F |
:1049300023E0493E520724F1109285051092840528 |
:104940008090CB059090CC052091CD053091CE057F |
:10495000C901880F991F820F931F880F991F880F15 |
:10496000991F6FE070E00E944E496815790574F454 |
:104970000894810891089092CC058092CB0506C0DE |
:104980004F5F5F4F50938505409384058091CB0521 |
:104990009091CC05801791070CF03FC08C013DC071 |
:1049A00033E0493E5307C4F08091CD059091CE0588 |
:1049B0009C0143E0220F331F4A95E1F7280F391F6E |
:1049C000C801820F931F6AE070E00E944E49709305 |
:1049D000CE056093CD0519C0CA0101969093850557 |
:1049E000809384056AE070E00E944E49892B89F427 |
:1049F0008091CB059091CC058017910734F40196F6 |
:104A00009093CC058093CB0504C01093CC05009304 |
:104A1000CB050091CB051091CC051A83098317FFB4 |
:104A200002C01A82198280915E05843608F05DC04A |
:104A300080910301882399F48091040390910503E8 |
:104A40008F5F9F4F61F488E99AE39093C504809348 |
:104A5000C40480E09CE0909305038093040380915C |
:104A6000A5059091A605009731F001979093A605B2 |
:104A70008093A50504C010926505109250058091A1 |
:104A800000018A3011F4289A01C028988091A0056D |
:104A90009091A105815D974028F180918308682F4E |
:104AA00070E07A83698381E080935005E0916A0821 |
:104AB000F0E0EE0FFF1FE45CF74F11821082E091EF |
:104AC0006B08F0E0EE0FFF1FE45CF74F11821082DD |
:104AD000E0916D08F0E0EE0FFF1FE45CF74F1182EC |
:104AE00010826EC2109265056BC280915E058D3892 |
:104AF00008F466C2109250058091840822E3829FD8 |
:104B0000C00111249093A6058093A50589819A81FF |
:104B100089976CF08091A0059091A105AFEF8F3F30 |
:104B20009A0729F001969093A1058093A0058091A2 |
:104B3000A0059091A105883C910520F0E981FA81BA |
:104B4000B89704F51092BF051092C0051092C105E8 |
:104B50001092C2051092BB051092BC051092BD05C3 |
:104B60001092BE0510923E0510923F05109240052E |
:104B7000109241051092420510924305109244058F |
:104B80001092450529813A81293C31050CF472C106 |
:104B900080916505882309F013C280916D08E82F84 |
:104BA000F0E0EE0FFF1FE45CF74F808191818C34C1 |
:104BB00091050CF4D5C08091A4058F5F8093A40566 |
:104BC000893C08F4FDC129980E94FF2010926505D8 |
:104BD0001092A4051092A1051092A00580916A0878 |
:104BE000282F30E0F901EE0FFF1FE45CF74F8081C2 |
:104BF0009181873491059CF4E0916B08F0E0EE0F11 |
:104C0000FF1FE45CF74F0190F081E02DF7FF03C038 |
:104C1000F095E195FF4FE734F1050CF46CC08091FD |
:104C20006B08682F70E0DB01AA0FBB1FA45CB74FB5 |
:104C30008D919C911197873491053CF0F901EE0F0D |
:104C4000FF1FE45CF74F808191818D919C918734A7 |
:104C5000910564F0F901EE0FFF1FE45CF74F8081CE |
:104C600091818734910514F042E001C041E0FB01DD |
:104C7000EE0FFF1FE45CF74F808191818634910530 |
:104C80005CF4F901EE0FFF1FE45CF74F8081918126 |
:104C9000873491050CF043E0FB01EE0FFF1FE45C4D |
:104CA000F74F808191818A5B9F4F5CF4F901EE0F91 |
:104CB000FF1FE45CF74F80819181873491050CF0F0 |
:104CC00044E0660F771F645C774FDB018D919C9108 |
:104CD0008A5B9F4F5CF4220F331F245C374FF9012E |
:104CE00080819181863491050CF445E0A2E0B0E02A |
:104CF000042E0E94DD490E948B0247E46AE678E0B8 |
:104D00000E94B2020E948B020E94BF208091720812 |
:104D100080FF10C080910E0390910F03875B93403A |
:104D200038F480910E0390910F038E5E924010F440 |
:104D30000E941F100E94C93B80915609882309F4E4 |
:104D40003FC188EE93E00E94680D88EE93E0909357 |
:104D5000C5048093C40484EF91E00E94680D30C1C3 |
:104D600080819181855B9F4F0CF081C08091A4056B |
:104D70008F5F8093A405893C08F422C129988FEFA6 |
:104D800004E010E0D801082E0E94DD49109265056C |
:104D90001092A4051092A1051092A0050E94FF2078 |
:104DA000809104059091050560E071E00E944E49F4 |
:104DB000D801062E0E94DD498091040590910505D9 |
:104DC00060E071E00E944E490F5F1F4FD801082E2E |
:104DD0000E94DD49809106059091070560E071E031 |
:104DE0000E944E490F5F1F4FD801062E0E94DD49D9 |
:104DF000809106059091070560E071E00E944E49A0 |
:104E00000F5F1F4FD801082E0E94DD4960910805F1 |
:104E10007091090580910A0590910B050E94C14788 |
:104E2000DC01CB0160E071E00E944E490F5F1F4F33 |
:104E3000D801062E0E94DD49609108057091090590 |
:104E400080910A0590910B050E94C147DC01CB01BE |
:104E500060E071E00E944E490F5F1F4FD801082E9D |
:104E60000E94DD490E948B020E94BF20A9C01092BF |
:104E7000A405A6C0E981FA81B3970CF0A1C0E09126 |
:104E80006D08F0E0EE0FFF1FE45CF74F8081918129 |
:104E9000855B9F4F0CF072C08091A3058F5F80935C |
:104EA000A305893C08F46CC0469A88EC8093A3055E |
:104EB00081E090E09093A1058093A00581E080932C |
:104EC00065051092B7051092B8051092B9051092B9 |
:104ED000BA0510923E0510923F05109240051092BF |
:104EE000410510924205109243051092440510921C |
:104EF000450510922E0510922F0510923005109244 |
:104F0000310510923605109237051092380510922F |
:104F1000390580910E0590910F05A0911005B09173 |
:104F200011058093320590933305A0933405B09317 |
:104F300035058091160590911705A0911805B0913F |
:104F4000190580933A0590933B05A0933C05B093D7 |
:104F50003D051092BF051092C0051092C105109238 |
:104F6000C2051092BB051092BC051092BD051092AF |
:104F7000BE0580E090E00E941E3D02C01092A30595 |
:104F8000E0916D08F0E0EE0FFF1FE45CF74F8081C9 |
:104F900091818C34910594F08091A2058F5F80936C |
:104FA000A205893C68F046981092650588EC8093CC |
:104FB000A2051092A1051092A00502C01092A205B0 |
:104FC00080916B03815080936B0380916B038F3FC3 |
:104FD00029F080915005882309F429C30E94AC1D53 |
:104FE00080916A08882E9924D401AA0FBB1FCD0195 |
:104FF000845C974FFC01808191819A8B898B809191 |
:105000007908E82EFF24AE5AB74F0D90BC91A02D21 |
:10501000BC8BAB8B80917A08282E332480916B084F |
:10502000C82EDD24C601880F991FDC01A45CB74F90 |
:105030000D90BC91A02DB88BAF878E5A974FDC0195 |
:10504000AD90BC90E0916D08AE2FB0E0AA0FBB1FF1 |
:10505000A45CB74F0D90BC91A02DBE87AD87609129 |
:10506000980370E080E090E00E94474520E030E047 |
:1050700040E251E40E94F54620E030E040E85BE386 |
:105080000E94AC482B013C016093F3087093F40834 |
:105090008093F5089093F6086091990370E080E0A2 |
:1050A00090E00E94474520E030EE4BE257E40E943A |
:1050B00059476093D9087093DA088093DB0890937E |
:1050C000DC082091B304222331F08AE090E0909331 |
:1050D000C5048093C404E22F22FF09C080917405A7 |
:1050E000482F50E0440F551F440F551F10C023FD9B |
:1050F00003C040E050E00BC08091740590E0880F41 |
:10510000991F880F991F44275527481B590B209139 |
:105110007E0530917F05C90113E0880F991F1A950C |
:10512000E1F7821B930B840F951F68E070E00E94EB |
:105130004E498B0170937F0560937E05E4FF09C0A3 |
:1051400080917405482F50E0440F551F440F551FA0 |
:1051500010C0E5FD03C040E050E00BC08091740535 |
:1051600090E0880F991F880F991F44275527481BE7 |
:10517000590B80918005909181059C01F3E0220FED |
:10518000331FFA95E1F7281B390BCA01820F931FD1 |
:1051900068E070E00E944E497E8B6D8B70938105B4 |
:1051A000609380058091B204282F83FF03C082E3BF |
:1051B00090E004C082FF07C08EEC9FEF90938305C0 |
:1051C0008093820504C0109283051092820521FF0E |
:1051D00009C080919F039091A00301969093A00332 |
:1051E00080939F0324FF09C080919F039091A003A7 |
:1051F00001979093A00380939F032B893C89229D64 |
:10520000F001239DF00D329DF00D112449895A893A |
:105210004E9DC0014F9D900D5E9D900D1124E80F95 |
:10522000F91FC80168E070E00E944E49E60FF71FC1 |
:10523000FC8BEB8BF0936005E0935F05A29C8001F3 |
:10524000A39C100DB29C100D11246F8578896E9D62 |
:10525000C0016F9D900D7E9D900D1124080F191FA8 |
:105260008D899E8968E070E00E944E49060F171FE5 |
:1052700010936205009361058091820590918305EA |
:10528000AD85BE858A1B9B0B909364058093630557 |
:105290008091720882FF0CC080E090E0A0E0B0E056 |
:1052A0008093D9089093DA08A093DB08B093DC08C8 |
:1052B00020E030E040E050E0C301B2010E942F48FE |
:1052C000882364F480E090E0A0E0B0E08093F308ED |
:1052D0009093F408A093F508B093F60820E030E02E |
:1052E00040E050E06091D9087091DA088091DB08C5 |
:1052F0009091DC080E942F48882364F480E090E0BD |
:10530000A0E0B0E08093D9089093DA08A093DB087E |
:10531000B093DC0880919E08682F70E0E4E06E2E68 |
:10532000712C6622772282FDC4C083FDC2C08091A9 |
:105330000E0590910F05A0911005B09111058156B1 |
:105340009A4EA040B040E4F0C70173E0880F991F67 |
:105350007A95E1F72B893C89281B390B309360053E |
:1053600020935F0580910E0590910F05A091100587 |
:10537000B091110581589843A140B040ACF128C0CC |
:1053800080910E0590910F05A0911005B091110527 |
:10539000805A9541AF4FBF4F3CF5970153E0220F24 |
:1053A000331F5A95E1F74B895C89240F351F3093E1 |
:1053B000600520935F0580910E0590910F05A091E7 |
:1053C0001005B091110581589843A140B04064F098 |
:1053D000C70144E0880F991F4A95E1F7281B390B54 |
:1053E0003093600520935F05809116059091170515 |
:1053F000A0911805B091190581569A4EA040B04071 |
:105400003CF1C701B3E0880F991FBA95E1F7F801A5 |
:10541000E81BF90BF0936205E09361058091160596 |
:1054200090911705A0911805B091190581589843DE |
:10543000A140B0400CF43DC0A4E0EE0CFF1CAA95C6 |
:10544000E1F7EE19FF09F0936205E093610531C0C1 |
:105450008091160590911705A0911805B091190536 |
:10546000805A9541AF4FBF4F24F5970173E0220F4B |
:10547000331F7A95E1F7200F311F30936205209397 |
:1054800061058091160590911705A0911805B091BE |
:10549000190581589843A140B0405CF054E0EE0CEF |
:1054A000FF1C5A95E1F72E193F09309362052093AE |
:1054B0006105F601EE0FFF1FE45CF74F208131819B |
:1054C00080919108482F50E04217530734F4672821 |
:1054D00021F081E08093700511C0F601EE0FFF1FEF |
:1054E000E45CF74F2081318180919208DA01A81B9A |
:1054F000B1092A173B0714F410927005F601EE0F5C |
:10550000FF1FE45CF74F80819181AA27BB27A41B72 |
:10551000B50B8A179B0734F463FF04C081E08093C6 |
:10552000710517C080917105882399F0CC0CDD1CA2 |
:10553000ECE3F8E0CE0EDF1EF60120813181809190 |
:10554000920890E0841B950B8217930714F4109235 |
:105550007105F401EE0FFF1FE45CF74F808191812C |
:105560004817590734F460FF04C081E08093730545 |
:1055700015C080917305882389F0F401EE0FFF1F99 |
:10558000E45CF74F2081318180919208FA01E81B99 |
:10559000F1092E173F0714F410927305F401EE0F72 |
:1055A000FF1FE45CF74F808191818A179B0734F4D9 |
:1055B00061FF04C081E08093720517C0809172057D |
:1055C000882399F0880C991C2CE338E0820E931EF6 |
:1055D000D4012D913C918091920890E0841B950B11 |
:1055E0008217930714F41092720580917005882336 |
:1055F00021F480917105882321F081E080936F056B |
:1056000002C010926F0580917305882321F4809168 |
:105610007205882351F081E080936E0510926F052A |
:10562000109270051092710502C010926E05809163 |
:105630006F05882311F40C948F3A84E690E09093E0 |
:10564000C5048093C4048091900890E0E981FA81B8 |
:105650008E179F0714F49A838983809150058823BD |
:1056600041F110926405109263051092600510924A |
:105670005F0510926205109261058DEC9CECACEC1C |
:10568000BDE38093F3089093F408A093F508B093DA |
:10569000F6088AE097EDA3EABBE38093D9089093DC |
:1056A000DA08A093DB08B093DC0810926F05109223 |
:1056B0006E052091CF083091D0084091D1085091CB |
:1056C000D20880910E0590910F05A0911005B09120 |
:1056D0001105820F931FA41FB51F8093CF089093CD |
:1056E000D008A093D108B093D2082091D30830916C |
:1056F000D4084091D5085091D60880911605909114 |
:105700001705A0911805B0911905820F931FA41FCA |
:10571000B51F8093D3089093D408A093D508B09375 |
:10572000D6082091C1083091C2084091C308509119 |
:10573000C4088091120590911305A0911405B091B1 |
:105740001505820F931FA41FB51F8093C108909366 |
:10575000C208A093C308B093C4082091B508309143 |
:10576000B6084091B7085091B80880911A059091F9 |
:105770001B05A0911C05B0911D05820F931FA41F4E |
:10578000B51F8093B5089093B608A093B708B0935F |
:10579000B80850906E05552029F480916F05882334 |
:1057A00009F45FC010921E0510921F05109220058B |
:1057B00010922105109222051092230510922405C3 |
:1057C000109225051092CF081092D0081092D1089F |
:1057D0001092D2081092D3081092D4081092D508D3 |
:1057E0001092D6081092C1081092C2081092C308F5 |
:1057F0001092C4081092B5081092B6081092B7081B |
:105800001092B80880912E0590912F05A091300537 |
:10581000B09131058093320590933305A093340500 |
:10582000B09335058091360590913705A0913805E4 |
:10583000B091390580933A0590933B05A0933C05C0 |
:10584000B0933D051092E5041092E40410926D05AA |
:1058500010926C0510926B0510926A05552009F0A4 |
:10586000A7C080916F05882309F0A2C060910E0542 |
:1058700070910F058091100590911105A0907E0800 |
:10588000BB24CC24DD24E090EC08F090ED08A601C8 |
:1058900095010E9483490027F7FC0095102F2E19CF |
:1058A0003F09400B510BCA01B90120E130E040E053 |
:1058B00050E00E94834939014A01609116057091B8 |
:1058C00017058091180590911905E090F808F0905F |
:1058D000F908A60195010E9483490027F7FC00956D |
:1058E000102F2E193F09400B510BCA01B90120E1BD |
:1058F00030E040E050E00E948349F1E26F1671040D |
:105900008104910434F0F0E26F2E712C812C912CE3 |
:1059100011C060EE66166FEF76066FEF86066FEFCA |
:10592000960644F4E0EE6E2EEFEF7E2EEFEF8E2E15 |
:10593000EFEF9E2E21323105410551052CF020E27A |
:1059400030E040E050E00CC0203E7FEF37077FEFB3 |
:1059500047077FEF570724F420EE3FEF4FEF5FEF4D |
:1059600080912E0590912F05A0913005B0913105C1 |
:1059700086199709A809B90980932E0590932F05D8 |
:10598000A0933005B093310580913605909137058D |
:10599000A0913805B0913905821B930BA40BB50B70 |
:1059A0008093360590933705A0933805B093390559 |
:1059B0008091E4049091E5048F3F910509F008F48B |
:1059C000A9C4552009F02AC480916F05882309F0E5 |
:1059D00025C46091CF087091D0088091D108909132 |
:1059E000D20820E031E040E050E00E94834920935B |
:1059F000CF083093D0084093D1085093D2086091DB |
:105A0000D3087091D4088091D5089091D60820E0F1 |
:105A100031E040E050E00E9483492093D308309366 |
:105A2000D4084093D5085093D608E0907E08FF2410 |
:105A300000E010E020911E0530911F0540912005E7 |
:105A400050912105C801B7010E940F4920E031E0C3 |
:105A500040E050E00E94834920931E0530931F05CB |
:105A60004093200550932105209122053091230574 |
:105A70004091240550912505C801B7010E940F49A6 |
:105A800020E031E040E050E00E948349209322056D |
:105A900030932305409324055093250560912605F6 |
:105AA00070912705809128059091290520E031E02B |
:105AB00040E050E00E94834920932605309327055B |
:105AC00040932805509329056091CF087091D00824 |
:105AD0008091D1089091D20820911E0530911F0528 |
:105AE0004091200550912105E0909708FF2400E0A7 |
:105AF00010E0621B730B840B950BA80197010E94A9 |
:105B00008349209398053093990540939A055093C3 |
:105B10009B05CA01B90120E031E040E050E00E945D |
:105B20008349690130936D0520936C056091D3081A |
:105B30007091D4088091D5089091D60820912205C3 |
:105B4000309123054091240550912505621B730B6C |
:105B5000840B950BA80197010E948349CA01B901E2 |
:105B600020E031E040E050E00E9483492901309379 |
:105B70006B0520936A056091C1087091C2088091FD |
:105B8000C3089091C40820E031E040E050E00E945A |
:105B900083492093C1083093C2084093C3085093AF |
:105BA000C4086091B5087091B6088091B7089091CB |
:105BB000B80820E031E040E050E00E9483492093A3 |
:105BC000B5083093B6084093B7085093B808609072 |
:105BD0001205709013058090140590901505809122 |
:105BE0000E0590910F05A0911005B0911105681A4E |
:105BF000790A8A0A9B0A6092B3057092B405809272 |
:105C0000B5059092B605E0901A05F0901B0500913D |
:105C10001C0510911D058091160590911705A09106 |
:105C20001805B0911905E81AF90A0A0B1B0BE09246 |
:105C3000AF05F092B0050093B1051093B2056092E4 |
:105C4000AB057092AC058092AD059092AE05E092E6 |
:105C5000A705F092A8050093A9051093AA058091C5 |
:105C6000320590913305A0913405B0913505861920 |
:105C70009709A809B9098093320590933305A09339 |
:105C80003405B093350580913A0590913B05A0917C |
:105C90003C05B0913D058E199F09A00BB10B809377 |
:105CA0003A0590933B05A0933C05B0933D05809148 |
:105CB000010990910209A0910309B0910409803271 |
:105CC000E4E29E07E7E0AE07E0E0BE0764F0805242 |
:105CD0009442A740B0408093010990930209A09399 |
:105CE0000309B09304098091010990910209A091E0 |
:105CF0000309B0910409B7FF0CC0805E9B4DA84F0B |
:105D0000BF4F8093010990930209A0930309B093B8 |
:105D10000409809100018A3011F4289801C0289A62 |
:105D200081E090E090939305809392058091CF0855 |
:105D30009091D008A091D108B091D20820918A0505 |
:105D400030918B0540918C0550918D05281B390BA6 |
:105D50004A0B5B0B57FF07C0509540953095219536 |
:105D60003F4F4F4F5F4F20523E44404050400CF059 |
:105D7000B9C021E0621620E1720620E0820620E030 |
:105D800092060CF44EC080919105882309F445C019 |
:105D9000D401C3017CE0B595A795979587957A9531 |
:105DA000D1F701969093930580939205D401C30196 |
:105DB00063E0B595A795979587956A95D1F78093F8 |
:105DC000980590939905A0939A05B0939B058958DF |
:105DD0009341A040B04064F088E893E1A0E0B0E0D7 |
:105DE0008093980590939905A0939A05B0939B058D |
:105DF000609198057091990580919A0590919B0505 |
:105E000020E031E040E050E00E948349C20ED31E02 |
:105E1000D0926D05C0926C0562C081E080939105BF |
:105E20005EC01092910540E0641640EF74064FEF9B |
:105E300084064FEF94060CF052C0809190058823A1 |
:105E400009F449C088279927DC0186199709A80910 |
:105E5000B9095CE0B595A795979587955A95D1F7BF |
:105E600001969093930580939205C401B30128E0B5 |
:105E700030E040E050E00E94834920939805309341 |
:105E8000990540939A0550939B0528573C4E4F4FD8 |
:105E90005F4F64F488E79CEEAFEFBFEF8093980507 |
:105EA00090939905A0939A05B0939B0560919805EE |
:105EB0007091990580919A0590919B0520E031E0C1 |
:105EC00040E050E00E948349C20ED31ED0926D057F |
:105ED000C0926C050BC081E08093900507C01092C2 |
:105EE000900504C01092930510929205C090EC08A2 |
:105EF000D090ED08D7FE04C0D094C194D108D394BB |
:105F0000D092BE08C092BD08A090F808B090F908E1 |
:105F1000B7FE04C0B094A194B108B394B092E40861 |
:105F2000A092E30874E6C716D1040CF041C084E6E1 |
:105F3000A816B104ECF580919808282F30E08091E4 |
:105F40009205909193052817390724F4309393050F |
:105F50002093920591E0691694E0790690E0890615 |
:105F600090E0990674F08091FA049091FB042091DE |
:105F7000920530919305820F931F9093FB048093B9 |
:105F8000FA04A0E06A16ACEF7A06AFEF8A06AFEF2C |
:105F90009A0674F48091FA049091FB042091920582 |
:105FA00030919305821B930B9093FB048093FA042A |
:105FB00081E090E090939305809392051092940570 |
:105FC0001092950510929605109297058091D3082E |
:105FD0009091D408A091D508B091D608209186055B |
:105FE000309187054091880550918905281B390B10 |
:105FF0004A0B5B0B57FF07C0509540953095219594 |
:106000003F4F4F4F5F4F20523E44404050400CF0B6 |
:10601000B9C0E1E0EE16E0E1FE06E0E00E07E0E0E8 |
:106020001E070CF44EC080918F05882309F445C0EB |
:10603000D801C7014CE0B595A795979587954A95E6 |
:10604000D1F701969093930580939205D801C701EB |
:1060500033E0B595A795979587953A95D1F78093B5 |
:10606000940590939505A0939605B093970589584C |
:106070009341A040B04064F088E893E1A0E0B0E034 |
:106080008093940590939505A0939605B0939705FA |
:106090006091940570919505809196059091970572 |
:1060A00020E031E040E050E00E948349420E531E60 |
:1060B00050926B0540926A0562C081E080938F0523 |
:1060C0005EC010928F0520E0E21620EFF2062FEF5F |
:1060D00002072FEF12070CF052C080918E05882323 |
:1060E00009F449C088279927DC018E199F09A00B64 |
:1060F000B10B2CE0B595A795979587952A95D1F783 |
:1061000001969093930580939205C801B70128E00A |
:1061100030E040E050E00E948349209394053093A2 |
:106120009505409396055093970528573C4E4F4F41 |
:106130005F4F64F488E79CEEAFEFBFEF8093940568 |
:1061400090939505A0939605B0939705609194055B |
:1061500070919505809196059091970520E031E02A |
:1061600040E050E00E948349420E531E50926B055E |
:1061700040926A050BC081E080938E0507C01092A3 |
:106180008E0504C0109293051092920578ECC71604 |
:10619000D1040CF04BC088ECA816B1040CF046C03A |
:1061A00080919808282F30E0809192059091930576 |
:1061B0002817390724F4309393052093920591E032 |
:1061C000E91694E0F90690E0090790E0190774F0E9 |
:1061D0008091FC049091FD042091920530919305EB |
:1061E000820F931F9093FD048093FC04A0E0EA16B5 |
:1061F000ACEFFA06AFEF0A07AFEF1A07BCF48091D5 |
:10620000FC049091FD042091920530919305821B2E |
:10621000930B9093FD048093FC0408C010926B05CF |
:1062200010926A0510926D0510926C0520E030E026 |
:1062300040E050E06091D9087091DA088091DB0865 |
:106240009091DC080E942F48882341F410926B053E |
:1062500010926A0510926D0510926C058091CF081E |
:106260009091D008A091D108B091D20880938A056E |
:1062700090938B05A0938C05B0938D058091D308E6 |
:106280009091D408A091D508B091D6088093860546 |
:1062900090938705A0938805B093890510921E05F9 |
:1062A00010921F05109220051092210510922205D0 |
:1062B00010922305109224051092250510922605B0 |
:1062C0001092270510922805109229051092CF08E8 |
:1062D0001092D0081092D1081092D2081092D308D0 |
:1062E0001092D4081092D5081092D6081092C108C6 |
:1062F0001092C2081092C3081092C4081092B508F8 |
:106300001092B6081092B7081092B8081092E504DF |
:106310001092E4048091C804882309F46EC110929D |
:10632000C8042091EC083091ED0837FF03C0309588 |
:1063300021953F4F3093BE082093BD088091F80807 |
:106340009091F90897FF03C0909581959F4F909386 |
:10635000E4088093E308243631050CF03CC1843610 |
:1063600091050CF038C120914A0530914B05809180 |
:10637000C9049091CA04281B390B37FF03C030951C |
:1063800021953F4F263031050CF02FC180916305D8 |
:10639000909164054396879708F091C080915405C9 |
:1063A000909155058F3F91052CF4019690935505DA |
:1063B00080935405809154059091550503970CF4F2 |
:1063C00092C06091C9087091CA088091CB089091E1 |
:1063D000CC0824E135E040E050E00E948349F90117 |
:1063E0003093BE082093BD0860914A0570914B051B |
:1063F0008091680890916908681B790B7093E40894 |
:106400006093E308BFEF6C347B0734F468597E4F28 |
:106410007093E4086093E3088091E3089091E408A6 |
:10642000853B910534F0885691409093E408809321 |
:10643000E3088091E3089091E408E81BF90BF093DE |
:10644000E408E093E308399734F088E090E0909313 |
:10645000E4088093E3088091E3089091E408885F62 |
:106460009F4F34F488EF9FEF9093E4088093E30804 |
:10647000C90137FF03C0909581959F4F02979CF10A |
:106480001092C9081092CA081092CB081092CC083A |
:1064900080914A0590914B05909369088093680814 |
:1064A0008091FE049091FF042091E3083091E4086C |
:1064B000821B930B9093FF048093FE0414C0809181 |
:1064C0004A0590914B059093690880936808109253 |
:1064D0005505109254051092C9081092CA081092DE |
:1064E000CB081092CC0881E080935205609101099D |
:1064F00070910209809103099091040924E135E02B |
:1065000040E050E00E948349209301093093020942 |
:10651000409303095093040960914A0570914B051B |
:10652000621B730B7093BE086093BD08CB0101978B |
:10653000833B910588F0643B710534F4CB018C54A6 |
:106540009F4F843B910528F42150304040405040FB |
:1065500007C06C547F4F64F42F5F3F4F4F4F5F4F26 |
:1065600020930109309302094093030950930409D1 |
:106570008091010990910209A0910309B091040949 |
:10658000B7FF0CC088599E4FAF4FBF4F8093010992 |
:1065900090930209A0930309B09304096091010943 |
:1065A00070910209809103099091040928E631E075 |
:1065B00040E050E00E94834924E135E040E050E0B3 |
:1065C0000E940F49609301097093020980930309A7 |
:1065D000909304090AC0109252051092C9081092B3 |
:1065E000CA081092CB081092CC0880914A0590916D |
:1065F0004B059093CA048093C904E0916A08F0E0C7 |
:10660000EE0FFF1FE45CF74F0190F081E02DF7FFE4 |
:1066100003C0F095E195FF4F70970CF047C0E091F3 |
:106620006B08F0E0EE0FFF1FE45CF74F0190F08184 |
:10663000E02DF7FF03C0F095E195FF4F7097B4F59B |
:1066400080916C0990916D09892B81F120919403BF |
:106650002B3A20F08091720885FD08C09091780552 |
:106660009B3A50F08091720885FD06C080915305D9 |
:10667000833091F084E014C02A3A20F480917208AB |
:1066800085FD06C09C3490F08091720885FD0EC097 |
:1066900080915305843019F41092530503C083E0B0 |
:1066A000809353058091530590E008C08091530575 |
:1066B000882331F01092530580E090E00E941E3D47 |
:1066C000A0905709B0905809A114B10429F0809105 |
:1066D0009D058C3009F44298C0906305D090640504 |
:1066E0008601D7FE04C0002711270C191D090531AA |
:1066F00011053CF08091720884FD03C081E0809315 |
:106700009C05E0907B08B601882777FD8095982F3F |
:106710002E2D30E040E050E00E940F4998014427C0 |
:1067200037FD4095542F0E940F4920E032E040E0B1 |
:1067300050E00E94834989019A01FF24EC9CC0012A |
:10674000ED9C900DFC9C900D112464E070E00E9483 |
:106750004E49600F711F1B01442437FC4094542C98 |
:106760002092B7053092B8054092B9055092BA050B |
:1067700080913E0590913F05A0914005B091410563 |
:1067800082199309A409B50980933E0590933F05AA |
:10679000A0934005B093410580913E0590913F053F |
:1067A000A0914005B09141058155934CA040B04067 |
:1067B00064F080E593ECA0E0B0E080933E05909318 |
:1067C0003F05A0934005B093410580913E0590910F |
:1067D0003F05A0914005B0914105805B9C43AF4FC0 |
:1067E000BF4F64F480EB9CE3AFEFBFEF80933E05B7 |
:1067F00090933F05A0934005B093410580914A05D1 |
:1068000090914B05892B09F460C08091720883FF39 |
:106810005CC08091CB049091CC04892B09F455C0C5 |
:106820002091E3083091E4088091BD089091BE0862 |
:106830008217930724F43093BE082093BD0820915B |
:106840005205222371F080919C05882351F080919C |
:106850004A0590914B0590934D0580934C051092FD |
:106860009C0580919703482F50E05093BE084093B9 |
:10687000BD08882351F1222341F100913E0510917A |
:106880003F05209140053091410580914E05909142 |
:106890004F05BC01469FC001479F900D569F900D2C |
:1068A000112460E270E00E944E49882777FD8095B0 |
:1068B000982F600F711F821F931F60933E05709386 |
:1068C0003F05809340059093410580919D0581503F |
:1068D00080939D058F3F09F04AC188E180939D0513 |
:1068E0008091C4049091C504209104033091050364 |
:1068F00082239323892B29F488B194E0892788B9CE |
:1069000007C080916505882311F0429A01C0429822 |
:1069100060910E0570910F05809110059091110501 |
:10692000E0907E08FF2400E010E0A80197010E949B |
:1069300083493093E2072093E10760911605709137 |
:1069400017058091180590911905A80197010E94DB |
:1069500083493093E4072093E3078091EC089091FA |
:10696000ED089093E6078093E5078091F8089091F1 |
:10697000F9089093E8078093E7078091F1089091D8 |
:10698000F2089093EA078093E90780916605909159 |
:1069900067059093EC078093EB0760914605709133 |
:1069A0004705809148059091490520E032E040E09C |
:1069B00050E00E9483493093EE072093ED078091C9 |
:1069C0004A0590914B059093F2078093F1076091EF |
:1069D000010970910209809103099091040924E151 |
:1069E00035E040E050E00E9483493093F407209363 |
:1069F000F3078091B5049091B604909302088093B8 |
:106A000001088091080390910903909304088093F2 |
:106A100003088091BA089091BB0890930608809370 |
:106A200005088091B2089091B3089093080880936C |
:106A300007088091F1089091F20890930A088093DA |
:106A4000090880915F059091600590930C088093F0 |
:106A50000B08809161059091620590930E088093D8 |
:106A60000D08D0921008C0920F088091740590E034 |
:106A70009093F6078093F5078091760590E09093C8 |
:106A8000F8078093F7078091CF059091D0059093F8 |
:106A90001208809311088091D1059091D2059093AE |
:106AA000140880931308809175099091760990934A |
:106AB0001608809315088091770990917809909332 |
:106AC0001808809317088091790990917A0990931A |
:106AD0001A088093190880917E0990917F099C0182 |
:106AE00063E0220F331F6A95E1F7880F991F820F29 |
:106AF000931F8A0D9B1D2091530542E3249F900113 |
:106B00001124820F931F90931C0880931B0880917F |
:106B1000E1089091E20890931E0880931D088091EF |
:106B2000E5089091E6089093200880931F088091D3 |
:106B3000BF089091C0089093FA078093F90780915D |
:106B4000FF08909100099093FC078093FB078091C8 |
:106B5000C7089091C8089093FE078093FD07809125 |
:106B6000DE089091DF08909300088093FF078091E2 |
:106B70006E058823A9F06091BA087091BB08882738 |
:106B800077FD8095982F0E94F4472091F30830916B |
:106B9000F4084091F5085091F6080E94AC4832C0C4 |
:106BA00060910E0570910F0580911005909111056F |
:106BB000E090BA08F090BB080E94F4472091D908F1 |
:106BC0003091DA084091DB085091DC080E94AC4813 |
:106BD0005B016C010027F7FC0095102FC801B7017D |
:106BE0000E94F4472091F3083091F4084091F50891 |
:106BF0005091F6080E94AC489B01AC01C601B5015A |
:106C00000E94F5460E94C1477093BB086093BA0882 |
:106C100080916F058823A9F06091B2087091B30844 |
:106C2000882777FD8095982F0E94F4472091F308DC |
:106C30003091F4084091F5085091F6080E94AC4854 |
:106C400032C06091160570911705809118059091DA |
:106C50001905E090B208F090B3080E94F447209123 |
:106C6000D9083091DA084091DB085091DC080E9485 |
:106C7000AC485B016C010027F7FC0095102FC801A0 |
:106C8000B7010E94F4472091F3083091F408409135 |
:106C9000F5085091F6080E94AC489B01AC01C60172 |
:106CA000B5010E94F5460E94C1477093B3086093F6 |
:106CB000B2086091F1087091F208E0902A05F09016 |
:106CC0002B0500912C0510912D058091D9089091EC |
:106CD000DA08A091DB08B091DC088B839C83AD833C |
:106CE000BE83882777FD8095982F0E94F4472091D6 |
:106CF000F3083091F4084091F5085091F6080E948D |
:106D0000AC485B016C01C801B7010E94F4472B81BC |
:106D10003C814D815E810E94AC4820E030E040E043 |
:106D20005FE30E94AC489B01AC01C601B5010E9423 |
:106D3000F5460E94C1477093F2086093F108809174 |
:106D4000BA089091BB088150984034F080E098E0F8 |
:106D50009093BB088093BA088091BA089091BB08C1 |
:106D60008050984F34F480E098EF9093BB08809364 |
:106D7000BA088091B2089091B3088150984034F0DD |
:106D800080E098E09093B3088093B2088091B208B5 |
:106D90009091B3088050984F34F480E098EF90932E |
:106DA000B3088093B2088091F1089091F208815065 |
:106DB000984034F080E098E09093F2088093F108D6 |
:106DC0008091F1089091F2088050984F34F480E05F |
:106DD00098EF9093F2088093F1088091720880FFF9 |
:106DE000D8C04091940381FF0EC0423310F58091CA |
:106DF00066059091670544979093690580936805AF |
:106E00001092510519C020919F033091A003240FC7 |
:106E1000311D8091770890E0AC01249FC001259F2F |
:106E2000900D349F900D11244497909369058093A1 |
:106E3000680581E08093510580915005882321F0F9 |
:106E400010926905109268052091660530916705DA |
:106E50004091680550916905421753070CF099C09D |
:106E600080915105882309F494C08091950390E0A6 |
:106E7000241B350BBC01629FC001639F900D729F64 |
:106E8000900D112460E170E00E944E496B01A090CA |
:106E9000E204B090E304609146057091470580914B |
:106EA000480590914905E0909603FF2400E010E02A |
:106EB00020E032E040E050E00E948349C801B70181 |
:106EC0000E940F4920E230E040E050E00E948349F8 |
:106ED0007FEF2E3C370714F42EEC3FEF80919E0598 |
:106EE00090919F058C0144E0000F111F4A95E1F736 |
:106EF000081B190B8091930390E0DC01AA9DC0014F |
:106F0000AB9D900DBA9D900D112468E070E00E9439 |
:106F10004E49061B170B2333310514F022E330E0F2 |
:106F2000021B130B89819A818C199D09800F911F77 |
:106F300060E170E00E944E4970939F0560939E054A |
:106F40008091730890E06817790784F4E981FA81E9 |
:106F5000E817F9072CF090939F0580939E0506C0D3 |
:106F600029813A8130939F0520939E0580919E054B |
:106F700090919F0549815A814817590724F45093ED |
:106F80009F0540939E0560919E0570919F057A83B1 |
:106F9000698389819A819093F0078093EF0720910C |
:106FA000F1083091F2088091F008682E7724A981C9 |
:106FB000BA8154971CF418861F822DC0B90162193A |
:106FC000730929813A8135952795621773070CF467 |
:106FD0009B0189819A8162E070E00E944E49709520 |
:106FE00061957F4FC901261737070CF4CB01930138 |
:106FF000E981FA812E1B3F0B281739070CF4C901D0 |
:1070000029813A812619370998878F838217930738 |
:1070100014F438872F832091BA083091BB088090F0 |
:107020005F05909060058091CF059091D005881AFA |
:10703000990A281939093093CE082093CD0820E009 |
:1070400030E040E050E06B817C818D819E810E9428 |
:107050002F488823F1F1E0900E05F0900F05009184 |
:107060001005109111056091BF057091C0058091C8 |
:10707000C1059091C2050E94F4475B016C01C801F3 |
:10708000B7010E94F4472B813C814D815E810E94B3 |
:10709000AC487B018C01B401882777FD8095982F3F |
:1070A0000E94F4479B01AC01C801B7010E94F4465D |
:1070B0009B01AC01C601B5010E94F5460E94C14783 |
:1070C0006093BF057093C0058093C1059093C2057E |
:1070D0001CC02091CD083091CE08442737FD409543 |
:1070E000542F8091BF059091C005A091C105B0912A |
:1070F000C205820F931FA41FB51F8093BF059093F5 |
:10710000C005A093C105B093C2058091BF059091C1 |
:10711000C005A091C105B091C205181619061A063E |
:107120001B0624F40297A109B10903C00296A11D10 |
:10713000B11D8093BF059093C005A093C105B09386 |
:10714000C2058091BF059091C005A091C105B09185 |
:10715000C20581589E43A040B04064F080E89EE3A1 |
:10716000A0E0B0E08093BF059093C005A093C10557 |
:10717000B093C2058091BF059091C005A091C10553 |
:10718000B091C2058058914CAF4FBF4F64F480E876 |
:1071900091ECAFEFBFEF8093BF059093C005A09334 |
:1071A000C105B093C2056091CD087091CE08809161 |
:1071B0008F0390919003A0919103B09192038987DE |
:1071C0009A87AB87BC87882777FD8095982F0E9488 |
:1071D000F4477B018C016091BF057091C0058091DF |
:1071E000C1059091C2050E94F4479B01AC016985DD |
:1071F0007A858B859C850E94AC489B01AC01C801B7 |
:10720000B7010E94F5460E94C1477B018C016B01CA |
:107210008F81988597FF03C0909581959F4F62E07D |
:1072200070E00E944E49A981BA816A0F7B1F8827AE |
:1072300077FD8095982F20919E0330E040E050E04C |
:107240000E940F4920E430E040E050E00E94834972 |
:107250001901C216D3060CF4970144245524421890 |
:107260005308241535050CF492014F815885E981A6 |
:10727000FA814E0F5F1FCA01820F931F97FF03C051 |
:1072800060E070E005C0BC01681679060CF4B3013B |
:107290008091BC08882E9924CB01681579050CF4DF |
:1072A000C4018093B408421B530B9A0157FF03C0DB |
:1072B00020E030E004C0641675060CF49301281534 |
:1072C00039050CF494012093B9082091B20830914B |
:1072D000B30840916105509162058091D10590916C |
:1072E000D205481B590B5C8B4B8B241B350B309301 |
:1072F000B1082093B00820E030E040E050E06B811E |
:107300007C818D819E810E942F48882309F440C092 |
:10731000E0901605F09017050091180510911905D9 |
:107320006091BB057091BC058091BD059091BE0533 |
:107330000E94F4475B016C01C801B7010E94F44749 |
:107340002B813C814D815E810E94AC487B018C0188 |
:10735000AB89BC89BD01882777FD8095982F0E9455 |
:10736000F4479B01AC01C801B7010E94F4469B01A0 |
:10737000AC01C601B5010E94F5460E94C147609369 |
:10738000BB057093BC058093BD059093BE051CC0E2 |
:107390002091B0083091B108442737FD4095542F13 |
:1073A0008091BB059091BC05A091BD05B091BE0533 |
:1073B000820F931FA41FB51F8093BB059093BC053C |
:1073C000A093BD05B093BE058091BB059091BC050F |
:1073D000A091BD05B091BE05181619061A061B0628 |
:1073E00024F40297A109B10903C00296A11DB11DA1 |
:1073F0008093BB059093BC05A093BD05B093BE05DB |
:107400008091BB059091BC05A091BD05B091BE05D2 |
:1074100081589E43A040B04064F080E89EE3A0E025 |
:10742000B0E08093BB059093BC05A093BD05B093DD |
:10743000BE058091BB059091BC05A091BD05B091A2 |
:10744000BE058058914CAF4FBF4F64F480E891EC7B |
:10745000AFEFBFEF8093BB059093BC05A093BD0534 |
:10746000B093BE056091B0087091B108882777FD90 |
:107470008095982F0E94F4477B018C016091BB0599 |
:107480007091BC058091BD059091BE050E94F447A6 |
:107490009B01AC0169857A858B859C850E94AC48EF |
:1074A0009B01AC01C801B7010E94F5460E94C1478B |
:1074B0009101621573050CF49B01241535050CF43C |
:1074C000920169817A814F815885641B750B620F27 |
:1074D000731F77FF03C060E070E004C06616770694 |
:1074E0000CF4B301681579050CF4B4016093E90854 |
:1074F00069817A81621B730B9B018F819885281BA0 |
:10750000390B37FF03C020E030E004C06216730679 |
:107510000CF493012815390554F4940108C08091A6 |
:107520006E05882311F00C94232B0C942D2B2093A3 |
:10753000DD0866960FB6F894DEBF0FBECDBFDF91B3 |
:10754000CF911F910F91FF90EF90DF90CF90BF9060 |
:10755000AF909F908F907F906F905F904F903F90F3 |
:107560002F9008951092D4051092D30510925809C7 |
:107570001092570910927F0910927E0910924309C8 |
:1075800010922909109290091092560910926B09D5 |
:1075900010927B091092D0051092CF051092D2055F |
:1075A0001092D10510927D0910927C0910926D09FC |
:1075B00010926C09089580914309882319F481E0A1 |
:1075C00090E0089580919009882309F48CC08091FF |
:1075D0002909882309F487C08091840990E0837089 |
:1075E000907002970CF474C08091850980FF70C080 |
:1075F0001092900960913509709136098091370990 |
:10760000909138092AE030E040E050E00E94834940 |
:107610002093590930935A0940935B0950935C09B0 |
:107620006091390970913A0980913B0990913C0928 |
:107630002AE030E040E050E00E94834920935D0959 |
:1076400030935E0940935F095093600960913D0952 |
:1076500070913E0980913F09909140092AE030E005 |
:1076600040E050E00E948349209361093093620911 |
:10767000409363095093640910924309809119095A |
:1076800090911A09A0911B09B0911C09809365097A |
:1076900090936609A0936709B093680960911D09EA |
:1076A00070911E0980911F099091200920EA36E807 |
:1076B00041E050E00E94834930936A0920936909B0 |
:1076C0001092290981E080936B0980E090E0089591 |
:1076D00010926B0910922909109290091092430997 |
:1076E00082E090E0089581E090E008950E94DB3A06 |
:1076F000181619060CF44CC080916C0990916D0914 |
:1077000023E0883E920730F4885A9D4F90936D098C |
:1077100080936C09809156098823B1F180915909B1 |
:1077200090915A092091440930914509821B930B8D |
:10773000909376098093750980915D0990915E0917 |
:107740002091480930914909821B930B9093780945 |
:1077500080937709809161099091620920914C0989 |
:1077600030914D09821B930B90937A09809379098C |
:1077700081E080937B0981E090E090937D09809384 |
:107780007C0980E090E0089510927B0982E090E00F |
:1077900008950E94DB3A892B99F5809159099091BF |
:1077A0005A09A0915B09B0915C09809344099093B8 |
:1077B0004509A0934609B093470980915D099091CE |
:1077C0005E09A0915F09B091600980934809909388 |
:1077D0004909A0934A09B0934B098091610990919E |
:1077E0006209A0916309B091640980934C09909358 |
:1077F0004D09A0934E09B0934F0981E0809356093B |
:107800000895482F2091D3053091D40525303105B6 |
:1078100009F49AC0263031058CF42130310529F164 |
:10782000223031051CF4232BD1F003C12230310565 |
:1078300071F12330310509F0FCC02FC0273031052C |
:1078400009F4E2C0273031050CF490C0283031052E |
:1078500009F4E5C02930310509F0EBC0A2C0853B31 |
:1078600009F0E7C081E090E0D5C0823639F482E0CB |
:1078700090E09093D4058093D30504C01092D40572 |
:107880001092D3051092E5051092E6050895813017 |
:1078900009F0CFC083E090E0BDC0883031F0823184 |
:1078A00051F1833009F044C013C023E439E0309330 |
:1078B00000062093FF05809143098823C9F52251D2 |
:1078C00030403093FE052093FD052E5E3F4F25C0CE |
:1078D00020E939E0309300062093FF05809190095C |
:1078E000882331F5205130403093FE052093FD056B |
:1078F000205F3F4F12C029E239E030930006209309 |
:10790000FF0580912909882399F42452304030934F |
:10791000FE052093FD052C5D3F4F3093F20520932B |
:10792000F10585E090E09093D4058093D30504C0E1 |
:107930001092D4051092D305842F8F5F8093E505B4 |
:107940008F5F8093E605089590E09093F005809313 |
:10795000EF059091E505940F9093E5058091E6057C |
:10796000890F8093E60586E090E054C0282F30E030 |
:10797000322F22278091EF059091F005820F931FFF |
:107980009093F0058093EF059091E505940F909307 |
:10799000E5058091E605890F8093E60589E090E092 |
:1079A00039C06091EF057091F0056115710509F41A |
:1079B00040C0E091FD05F091FE0580838091E505D2 |
:1079C000840F8093E5059091E605980F9093E60566 |
:1079D000CB0101979093F0058093EF05892B89F0F7 |
:1079E0008091F1059091F2058E179F0750F0319626 |
:1079F000F093FE05E093FD053093D4052093D30565 |
:107A0000089587E090E006C08091E505481789F465 |
:107A100088E090E09093D4058093D30508958091F9 |
:107A2000E605481731F4E091FF05F091000681E08A |
:107A300080831092D4051092D30508952F923F921F |
:107A40004F925F926F927F928F929F92AF92BF926E |
:107A5000CF92DF92EF92FF920F931F93CF93DF931A |
:107A6000CDB7DEB76A970FB6F894DEBF0FBECDBFB5 |
:107A7000988F8F8B8330910509F4B3C084309105C2 |
:107A800021F0892B09F415C154C6809157099091B2 |
:107A900058090197029708F421C18091E30590915C |
:107AA000E40501969093E4058093E30585369105FE |
:107AB00008F442C61092E4051092E3051092F8050E |
:107AC0001092F7051092FA051092F9051092FC0534 |
:107AD0001092FB051092D8051092D7051092D6058A |
:107AE0001092D5051092E7051092E8051092E9056D |
:107AF0001092EA051092EB051092EC051092ED053C |
:107B00001092EE051092DB051092DC051092DD0557 |
:107B10001092DE051092DF051092E0051092E1054B |
:107B20001092E20510920206109201061092DA05F8 |
:107B30001092D90510927F0910927E0980917B09DD |
:107B4000882309F44BC08091750990917609909330 |
:107B50006F0980936E09609177097091780970932D |
:107B600071096093700921E02093740990932B09A7 |
:107B700080932A0970932D0960932C092093300972 |
:107B8000709561957F4F909581959F4F0E94BA4364 |
:107B90009C019093F4058093F305E0916E09F091B8 |
:107BA0006F09F7FF03C08AE590E002C08EE091E024 |
:107BB000821B930B9093F4058093F3054091F3059A |
:107BC0005091F4056091700970917109CF010E9484 |
:107BD000F4447093F6056093F505A0C510927409FE |
:107BE000A4C58091570990915809019709F476C06E |
:107BF0008091E3059091E40501969093E4058093CC |
:107C0000E3058955924008F497C51092E405109257 |
:107C1000E30580917B09882309F448C01092FA0596 |
:107C20001092F9051092FC051092FB051092D805F0 |
:107C30001092D7051092D6051092D5051092E7053F |
:107C40001092E8051092E9051092EA051092EB05F2 |
:107C50001092EC051092ED051092EE051092DB05E6 |
:107C60001092DC051092DD051092DE051092DF0502 |
:107C70001092E0051092E1051092E20510920406C0 |
:107C800010920306809175099091760990932B09C3 |
:107C900080932A09809177099091780990932D0912 |
:107CA00080932C0981E08093300984C110923009BF |
:107CB0003CC51092E4051092E3051092D005109295 |
:107CC000CF051092D2051092D10510927F09109223 |
:107CD0007E09109258091092570931C580915709B1 |
:107CE000909158098130910509F467C1823091055E |
:107CF00041F0892B09F019C51092E4051092E305B3 |
:107D00001EC580917409882309F40FC580917C09F0 |
:107D100090917D09181619060CF04CC180917E09CE |
:107D200090917F09099709F445C18091F7059091D9 |
:107D3000F80501969093F8058093F70560912A095C |
:107D400070912B098091750990917609AB01481BC0 |
:107D5000590B57FF03C0509541955F4FE0912C0997 |
:107D6000F0912D0980917709909178099F01281B46 |
:107D7000390B37FF03C0309521953F4FA091010685 |
:107D8000B09102068091F5059091F6058A1B9B0B38 |
:107D9000853691050CF442C04436510564F424360E |
:107DA00031054CF48091D9059091DA058D3091051B |
:107DB000CCF4049613C0483C51050CF5283C310521 |
:107DC000F4F48091D9059091DA058930910514F089 |
:107DD000019704C08830910529F001969093DA0547 |
:107DE0008093D9058091D9059091DA058A0F9B1F60 |
:107DF000909302068093010683E090E027C0809173 |
:107E0000D9059091DA05823091052CF00197909375 |
:107E1000DA058093D90584E090E018C0C3970CF48C |
:107E200076C0443651055CF42436310544F41A9684 |
:107E3000B0930206A093010685E090E007C011967A |
:107E4000B0930206A093010686E090E090937F092C |
:107E500080937E091092FC051092FB0581E090E072 |
:107E60009093FA058093F905A0900106B090020660 |
:107E7000CC24B7FCC094DC2C8091F3059091F405E0 |
:107E80000E9496447C012090010630900206442412 |
:107E900037FC4094542C8091F3059091F4050E9496 |
:107EA000EC443C010027F7FC0095102FC801B701F6 |
:107EB000A60195010E940F4928EE33E040E050E012 |
:107EC0000E94834980916E0990916F09820F931FE0 |
:107ED00090932B0980932A09882477FC8094982C0E |
:107EE000C401B301A20191010E940F4928EE33E0C1 |
:107EF00040E050E00E94834980917009909171099F |
:107F0000820F931F90932D0980932C0953C0443600 |
:107F100051050CF049C0243631050CF045C087E00E |
:107F200090E090937F0980937E091092FA05109259 |
:107F3000F9051092FC051092FB05633071051CF0E9 |
:107F40006350704006C03FEF6E3F730734F46D5FBF |
:107F50007F4F70932B0960932A09E330F10514F0E9 |
:107F6000339705C06FEFEE3FF6072CF43396F0938E |
:107F70002D09E0932C0980912A0990912B090396F1 |
:107F80000797C0F480912C0990912D0903960797CB |
:107F900088F410922B0910922A0910922D09109240 |
:107FA0002C0989E090E002C088E090E090937F097E |
:107FB00080937E0981E090E0B3C380917C09909129 |
:107FC0007D09181619060CF0A5C38091030690913F |
:107FD0000406019690930406809303068091750928 |
:107FE000909176099E8B8D8B80912A0990912B0917 |
:107FF000AD89BE89A81BB90BBE8BAD8BE09177090B |
:10800000F091780980912C0990912D09E81BF90BCA |
:10801000FC8BEB8BC090D705D090D805CA0EDB1E29 |
:10802000D092D805C092D705A090D505B090D605BE |
:10803000AE0EBF1EB092D605A092D50560900D0978 |
:1080400070900E0980900F099090100920900909F6 |
:1080500030900A0940900B0950900C0910927D094C |
:1080600010927C0910917505112309F443C0212F4A |
:1080700030E040E050E060EC71E280E090E00E948F |
:108080008349C601D7FE04C0882799278C199D090A |
:108090002817390754F0C501B7FE04C0882799276F |
:1080A0008A199B0928173907F4F4C601880F991F0C |
:1080B0008C0D9D1D880F991F68E070E00E944E494D |
:1080C0007093D8056093D705C501880F991F8A0D55 |
:1080D0009B1D880F991F68E070E00E944E497093C5 |
:1080E000D6056093D5058091FB059091FC05181687 |
:1080F000190644F41092D8051092D7051092D605AF |
:108100001092D5052091D7053091D8053A8329835F |
:108110003093C8082093C7088091D5059091D60563 |
:108120009C838B839093DF088093DE08812F90E0FF |
:10813000A0E0B0E08D839E83AF83B887A091F9055E |
:10814000B091FA05BA8FA98FE09076051A161B0632 |
:108150000CF05CC0E694E694FF240027F7FC009541 |
:10816000102FC801B701A40193010E940F4922E317 |
:1081700030E040E050E00E94834959016A01C801A3 |
:10818000B701A20191010E940F4922E330E040E0D3 |
:1081900050E00E948349D601C5018835EFEF9E0764 |
:1081A000EFEFAE07EFEFBE0724F488E59FEFAFEFE8 |
:1081B000BFEF3C014D01893A9105A105B1052CF0B5 |
:1081C000E8EA6E2E712C812C912C28356FEF360742 |
:1081D0006FEF46076FEF560724F428E53FEF4FEFA8 |
:1081E0005FEF19012A01293A3105410551052CF0AB |
:1081F00078EA272E312C412C512C9091740586E081 |
:10820000989FC001112464E070E058C0E694E694A1 |
:10821000FF240027F7FC0095102FC801B701A40127 |
:1082200093010E940F4929E130E040E050E00E94B4 |
:10823000834959016A01C801B701A20191010E9455 |
:108240000F4929E130E040E050E00E948349D60127 |
:10825000C5018034EFEF9E07EFEFAE07EFEFBE07EB |
:1082600024F480E49FEFAFEFBFEF3C014D01813C70 |
:108270009105A105B1052CF060EC662E712C812CC6 |
:10828000912C20346FEF36076FEF46076FEF5607DC |
:1082900024F420E43FEF4FEF5FEF19012A01213C66 |
:1082A0003105410551052CF090EC292E312C412C43 |
:1082B000512C8091740590E062E070E00E944E497C |
:1082C0007B010027F7FC0095102FAD89BE899D0129 |
:1082D000442737FD4095542FC801B7010E940F492C |
:1082E00028E230E040E050E00E94834959016A01F1 |
:1082F0002093DB053093DC054093DD055093DE05CC |
:10830000EB89FC899F01442737FD4095542FC80114 |
:10831000B7010E940F4928E230E040E050E00E949F |
:1083200083492093DF053093E0054093E1055093A6 |
:10833000E205898D9A8D1816190664F599EAA91631 |
:10834000B104C104D1042CF088EA90E0A0E0B0E0D0 |
:108350000DC0A8E5AA16AFEFBA06AFEFCA06AFEF99 |
:10836000DA0664F488E59FEFAFEFBFEF8093DB059B |
:108370009093DC05A093DD05B093DE05293A310525 |
:108380004105510564F528553F4F4F4F5F4F0CF0A5 |
:108390003CC02FC0E9EAAE16B104C104D1042CF0F0 |
:1083A00088EA90E0A0E0B0E00DC0F8E5AF16FFEF7E |
:1083B000BF06FFEFCF06FFEFDF0664F488E59FEF0F |
:1083C000AFEFBFEF8093DB059093DC05A093DD0555 |
:1083D000B093DE05293A3105410551052CF088EAB4 |
:1083E00090E0A0E0B0E009C028553F4F4F4F5F4FED |
:1083F00064F488E59FEFAFEFBFEF8093DF059093C4 |
:10840000E005A093E105B093E205E090DB05F09074 |
:10841000DC050091DD051091DE05F092C008E092C8 |
:10842000BF08A090DF05B090E005C090E105D090B6 |
:10843000E205B0920009A092FF0889819A819C010F |
:10844000442737FD4095542F6D817E818F8198851B |
:108450000E940F4920E830E040E050E00E9483494C |
:10846000203D9FEF39079FEF49079FEF590724F4FD |
:1084700020ED3FEF4FEF5FEF21333105410551050F |
:1084800024F020E330E040E050E02E0D3F1D401F7F |
:10849000511F260D371D481D591DEE24FF2487014D |
:1084A000E21AF30A040B150BE092E705F092E805D7 |
:1084B0000093E9051093EA05AB81BC81BD018827D3 |
:1084C00077FD8095982F2D813E814F8158850E94A0 |
:1084D0000F4920E830E040E050E00E948349203D11 |
:1084E000BFEF3B07BFEF4B07BFEF5B0724F420ED67 |
:1084F0003FEF4FEF5FEF213331054105510524F088 |
:1085000020E330E040E050E02A0D3B1D4C1D5D1D96 |
:10851000220D331D441D551DAA24BB246501A21A3A |
:10852000B30AC40AD50AA092EB05B092EC05C0923A |
:10853000ED05D092EE05F092E208E092E108B092EB |
:10854000E608A092E5086091010970910209809106 |
:1085500003099091040924E135E040E050E00E94D5 |
:10856000834979018A01C9010E94EC449E878D8765 |
:108570008091E7059091E805A091E905B091EA05A1 |
:108580008F87988BA98BBA8BC7010E9496449C87D2 |
:108590008B876090E7057090E8058090E9059090E2 |
:1085A000EA05C7010E94EC449A8F898F2090EB0561 |
:1085B0003090EC054090ED055090EE05C7010E940B |
:1085C00096449A8789872D893E8937FF03C0309565 |
:1085D00021953F4F2159314054F42B893C8937FF75 |
:1085E00003C0309521953F4F215931404CF01092F6 |
:1085F000D2051092D1051092D0051092CF0595C0EA |
:1086000080914A0890914B0880914A0890914B08BC |
:10861000E98DFA8DBF01882777FD8095982FA401F9 |
:1086200093010E940F497B018C0129853A85B9018C |
:10863000882777FD8095982FA20191010E940F490C |
:10864000E61AF70A080B190BC801B70120E43FE14D |
:1086500040E050E00E948349223E6FEF36076FEF03 |
:1086600046076FEF560724F422EE3FEF4FEF5FEF20 |
:108670002F3131054105510524F02EE130E040E075 |
:1086800050E03093D2052093D105AB85BC85BD0168 |
:10869000882777FD8095982F2F85388949895A89B1 |
:1086A0000E940F497B018C01ED85FE85BF01882763 |
:1086B00077FD8095982FA60195010E940F49E60E3F |
:1086C000F71E081F191FC801B70120EC30EE4FEF4D |
:1086D0005FEF0E948349223EFFEF3F07FFEF4F0706 |
:1086E000FFEF5F0724F422EE3FEF4FEF5FEF2F31F4 |
:1086F00031054105510524F02EE130E040E050E025 |
:108700003093D0052093CF052F89388D2430310543 |
:10871000B1F404C08F89988D049789F482E090E0C9 |
:1087200090935809809357090AC0109258091092E3 |
:10873000570982E090E005C081E090E002C080E04F |
:1087400090E06A960FB6F894DEBF0FBECDBFDF9102 |
:10875000CF911F910F91FF90EF90DF90CF90BF903E |
:10876000AF909F908F907F906F905F904F903F90D1 |
:108770002F900895EF92FF920F931F93CF93DF9363 |
:108780008C01EB019C0197FF04C022273327281B93 |
:10879000390BCE01D7FF04C0882799278C1B9D0B6E |
:1087A000821793073CF4CE01E8018C01B1E0EB2E77 |
:1087B000F12C02C0EE24FF24209741F4011511058D |
:1087C00029F461E070E080E090E024C0B8018827DF |
:1087D00077FD8095982F28EE33E040E050E00E942E |
:1087E0000F499E01442737FD4095542F0E9483492D |
:1087F000B90137FF03C0709561957F4F882777FDDA |
:108800008095982F6D3021E0720720E0820720E0EC |
:10881000920704F524E630E040E050E00E940F4962 |
:108820002CE031E040E050E00E948349CA01B901E8 |
:10883000A4E0660F771F881F991FAA95D1F7621BC6 |
:10884000730B840B950B24E630E040E050E00E946F |
:10885000834953C0633422E0720720E0820720E09E |
:10886000920734F524E630E040E050E00E940F49E2 |
:10887000605B78468040904026E331E040E050E085 |
:108880000E948349CA01B901F4E0660F771F881F6F |
:10889000991FFA95D1F7621B730B840B950B24E695 |
:1088A00030E040E050E00E948349215F3F4F25C007 |
:1088B00022E330E040E050E00E940F49645E7047E0 |
:1088C0008040904026EA31E040E050E00E94834939 |
:1088D000CA01B901E4E0660F771F881F991FEA9566 |
:1088E000D1F7621B730B840B950B22E330E040E061 |
:1088F00050E00E948349225E3F4FEF2829F48AE529 |
:1089000090E0821B930B9C0117FD03C0D7FF06C0AC |
:1089100002C0D7FD03C0309521953F4FC901DF91BB |
:10892000CF911F910F91FF90EF900895FC01F7FFF9 |
:1089300004C0882799278E1B9F0B8856914034F0DE |
:10894000CF0168E671E00E944E49FC01F7FD03C0CB |
:1089500041E050E005C0F095E195FF4F4FEF5FEF2C |
:10896000CF018B5590408A35910530F484EB90E02F |
:108970008E1B9F0BFC010FC0CF01855B90408A3599 |
:10898000910518F4E45BF0400EC0CF018F50914088 |
:108990008A35910518F081E090E007C088E691E003 |
:1089A0008E1B9F0BFC018FEF9FEFEE0FFF1FEF5D04 |
:1089B000FB4F25913491BC01649FC001659F900DD0 |
:1089C000749F900D1124AC01429FC001439F900DF4 |
:1089D000529F900D112408952AE530E0281B390B91 |
:1089E000C9010E9496440895EF92FF920F931F933E |
:1089F000CF93DF93EA01AC0197FF04C044275527CA |
:108A0000481B590B9B0177FF04C022273327261BE5 |
:108A1000370B2417350794F49C01B901882777FD9B |
:108A20008095982F28EE33E040E050E00E940F49F7 |
:108A30007B018C01CE010E9496440FC0882777FDF0 |
:108A40008095982F28EE33E040E050E00E940F49D7 |
:108A50007B018C01CE010E94EC449C01442737FD30 |
:108A60004095542FC801B7010E948349B90137FFCF |
:108A700003C0709561957F4F882777FD8095982F6B |
:108A8000DF91CF911F910F91FF90EF900895A8E093 |
:108A9000B0E0EDE4F5E40C94A8497B018C0161158C |
:108AA00071058105910519F482E089835AC083E03C |
:108AB00089838EE1C82ED12CDC82CB82ED82FE82AE |
:108AC0000F831887C801B7010E94BA45BC016150E5 |
:108AD000704077FF33C0EE27FF27E61BF70B20E03F |
:108AE00030E040E050E081E090E0A0E0B0E00E2E09 |
:108AF00004C0880F991FAA1FBB1F0A94D2F70197C1 |
:108B0000A109B1098E219F21A023B1230097A105BE |
:108B1000B10521F021E030E040E050E004C01695BE |
:108B20000795F794E794EA95D2F72E293F29402B31 |
:108B3000512B2D833E834F8358870FC061157105DC |
:108B400081F0062E04C0EE0CFF1C001F111F0A94BA |
:108B5000D2F7ED82FE820F831887C61AD70ADC820D |
:108B6000CB821A82CE0101960E940746E8E0289641 |
:108B70000C94C449EF92FF920F931F939B01AC0199 |
:108B8000203080E0380781E0480780E0580780F413 |
:108B90002F3F31054105510509F020F4EE24FF2453 |
:108BA000870119C068E0E62EF12C012D112D13C0AC |
:108BB000203080E0380780E0480781E0580730F433 |
:108BC00090E1E92EF12C012D112D05C088E1E82E50 |
:108BD000F12C012D112D80E290E0A0E0B0E08E1983 |
:108BE0009F09A00BB10B04C0569547953795279563 |
:108BF000EA94D2F7F901EF55FC4F2081821B9109CD |
:108C0000A109B1091F910F91FF90EF9008959F92D4 |
:108C1000AF92BF92CF92DF92EF92FF920F931F938A |
:108C2000EE24FF248701FC01248135814681578190 |
:108C300091808081823010F44061A2C0843009F4B8 |
:108C40009BC0823029F420E030E040E050E005C0D5 |
:108C5000211531054105510519F4E0E0F0E092C01D |
:108C6000828193816FEF823896070CF05AC062E8D8 |
:108C70007FEF681B790B6A3171052CF020E030E042 |
:108C800040E050E02AC0AA24BB24650181E090E0C6 |
:108C9000A0E0B0E0062E04C0880F991FAA1FBB1FDA |
:108CA0000A94D2F70197A109B10982239323A4233F |
:108CB000B5230097A105B10529F071E0A72EB12CCD |
:108CC000C12CD12C04C056954795379527956A95A8 |
:108CD000D2F72A293B294C295D29DA01C9018F776E |
:108CE0009070A070B07080349105A105B10539F481 |
:108CF00027FF09C0205C3F4F4F4F5F4F04C0215CEE |
:108D00003F4F4F4F5F4F80E090E0203060E03607EC |
:108D100060E0460760E4560710F081E090E0FC0157 |
:108D200023C08038910544F5FC01E158FF4FDA017A |
:108D3000C9018F779070A070B07080349105A10543 |
:108D4000B10539F427FF09C0205C3F4F4F4F5F4FFB |
:108D500004C0215C3F4F4F4F5F4F57FF05C05695F2 |
:108D6000479537952795319687E0569547953795DE |
:108D700027958A95D1F706C020E030E040E050E02A |
:108D8000EFEFF0E0E22EF32E942F9F77802F807884 |
:108D9000892B9E2F9795992797958F77082F092BC9 |
:108DA0009E2F9695812F8078892B9794992497945C |
:108DB0008F77182F1929C801B7011F910F91FF90C4 |
:108DC000EF90DF90CF90BF90AF909F900895FC01FF |
:108DD0004150504030F001900616D1F73197CF0145 |
:108DE00008958827992708955058BB27AA270ED0A1 |
:108DF00079C16AD130F06FD120F031F49F3F11F486 |
:108E00001EF45FC10EF4E095E7FB55C1E92F7BD15D |
:108E100080F3BA17620773078407950718F071F497 |
:108E20009EF593C10EF4E0950B2EBA2FA02D0B01E9 |
:108E3000B90190010C01CA01A0011124FF27591B9F |
:108E400099F0593F50F4503E68F11A16F040A22FA5 |
:108E5000232F342F4427585FF3CF46953795279516 |
:108E6000A795F0405395C9F77EF41F16BA0B620B15 |
:108E7000730B840BBAF09150A1F0FF0FBB1F661F5C |
:108E8000771F881FC2F70EC0BA0F621F731F841F9F |
:108E900048F4879577956795B795F7959E3F08F0C5 |
:108EA000B3CF9395880F08F09927EE0F9795879584 |
:108EB00008950CD017C10FD140F006D130F021F445 |
:108EC0005F3F19F0F8C0511141C1FBC01CD198F3AC |
:108ED0009923C9F35523B1F3951B550BBB27AA273B |
:108EE00062177307840738F09F5F5F4F220F331FAD |
:108EF000441FAA1FA9F333D00E2E3AF0E0E830D079 |
:108F000091505040E695001CCAF729D0FE2F27D07B |
:108F1000660F771F881FBB1F261737074807AB0749 |
:108F2000B0E809F0BB0B802DBF01FF2793585F4FBE |
:108F30002AF09E3F510568F0BEC008C15F3FECF3C8 |
:108F4000983EDCF3869577956795B795F7959F5F83 |
:108F5000C9F7880F911D9695879597F90895E1E0D7 |
:108F6000660F771F881FBB1F621773078407BA0736 |
:108F700020F0621B730B840BBA0BEE1F88F7E09591 |
:108F8000089504D06894B111E1C00895C4D088F068 |
:108F90009F5790F0B92F9927B751A0F0D1F0660FE5 |
:108FA000771F881F991F1AF0BA95C9F712C0B13000 |
:108FB00081F0CBD0B1E00895C8C0672F782F882703 |
:108FC000B85F39F0B93FCCF3869577956795B3953F |
:108FD000D9F73EF490958095709561957F4F8F4FAE |
:108FE0009F4F0895E89409C097FB3EF490958095B3 |
:108FF000709561957F4F8F4F9F4F9923A9F0F92F5F |
:1090000096E9BB279395F695879577956795B795DC |
:10901000F111F8CFFAF4BB0F11F460FF1BC06F5FC2 |
:109020007F4F8F4F9F4F16C0882311F096E911C0D4 |
:10903000772321F09EE8872F762F05C0662371F0F5 |
:1090400096E8862F70E060E02AF09A95660F771F09 |
:10905000881FDAF7880F9695879597F9089507D0B6 |
:1090600008F481E0089503D008F48FEF0895990F74 |
:109070000008550FAA0BE0E8FEEF16161706E807E2 |
:10908000F907C0F012161306E407F50798F0621B03 |
:10909000730B840B950B39F40A2661F0232B242BD8 |
:1090A000252B21F408950A2609F4A140A6958FEFF7 |
:1090B000811D811D089597F99F6780E870E060E049 |
:1090C00008959FEF80EC089500240A941616170661 |
:1090D00018060906089500240A94121613061406A9 |
:1090E00005060895092E0394000C11F4882352F00C |
:1090F000BB0F40F4BF2B11F460FF04C06F5F7F4FC4 |
:109100008F4F9F4F089557FD9058440F551F59F0AA |
:109110005F3F71F04795880F97FB991F61F09F3F64 |
:1091200079F087950895121613061406551FF2CF8D |
:109130004695F1DF08C0161617061806991FF1CFDD |
:1091400086957105610508940895E894BB27662704 |
:109150007727CB0197F908950BD0C4CFB5DF28F05E |
:10916000BADF18F0952309F0A6CFABCF1124EECFCC |
:10917000CADFA0F3959FD1F3950F50E0551F629F72 |
:10918000F001729FBB27F00DB11D639FAA27F00D60 |
:10919000B11DAA1F649F6627B00DA11D661F829F87 |
:1091A0002227B00DA11D621F739FB00DA11D621F6C |
:1091B000839FA00D611D221F749F3327A00D611D89 |
:1091C000231F849F600D211D822F762F6A2F11246B |
:1091D0009F5750408AF0E1F088234AF0EE0FFF1FBE |
:1091E000BB1F661F771F881F91505040A9F79E3FF5 |
:1091F000510570F060CFAACF5F3FECF3983EDCF3EF |
:10920000869577956795B795F795E7959F5FC1F731 |
:10921000FE2B880F911D9695879597F90895629F6B |
:10922000D001739FF001829FE00DF11D649FE00D5E |
:10923000F11D929FF00D839FF00D749FF00D659FBF |
:10924000F00D9927729FB00DE11DF91F639FB00DBE |
:10925000E11DF91FBD01CF0111240895991B79E08B |
:1092600004C0991F961708F0961B881F7A95C9F7B6 |
:1092700080950895AA1BBB1B51E107C0AA1FBB1F05 |
:10928000A617B70710F0A61BB70B881F991F5A9592 |
:10929000A9F780959095BC01CD01089597FB092E03 |
:1092A00007260AD077FD04D0E5DF06D000201AF4A7 |
:1092B000709561957F4F0895F6F7909581959F4F32 |
:1092C0000895A1E21A2EAA1BBB1BFD010DC0AA1F07 |
:1092D000BB1FEE1FFF1FA217B307E407F50720F01F |
:1092E000A21BB30BE40BF50B661F771F881F991F9A |
:1092F0001A9469F760957095809590959B01AC01E3 |
:10930000BD01CF01089597FB092E05260ED057FD0C |
:1093100004D0D7DF0AD0001C38F450954095309522 |
:1093200021953F4F4F4F5F4F0895F6F790958095E9 |
:10933000709561957F4F8F4F9F4F08952F923F9269 |
:109340004F925F926F927F928F929F92AF92BF9255 |
:10935000CF92DF92EF92FF920F931F93CF93DF9301 |
:10936000CDB7DEB7CA1BDB0B0FB6F894DEBF0FBE5E |
:10937000CDBF09942A88398848885F846E847D84AB |
:109380008C849B84AA84B984C884DF80EE80FD80AD |
:109390000C811B81AA81B981CE0FD11D0FB6F89423 |
:1093A000DEBF0FBECDBFED010895F999FECFB2BD6E |
:1093B000A1BDF89A119600B40895F999FECFB2BDF7 |
:1093C000A1BD00BC11960FB6F894FA9AF99A0FBE97 |
:0493D0000895FFCF2E |
:1093D4000A01FF64496E74656772616C4E69636B60 |
:1093E40020202020496E74656772616C526F6C6C2A |
:1093F400202020204163634E69636B2020202020BD |
:1094040020202020416363526F6C6C202020202098 |
:10941400202020204779726F476965722020202020 |
:1094240020202020486F6568656E5765727420207F |
:10943400202020204163635A202020202020202047 |
:10944400202020204761732020202020202020205D |
:10945400202020204B6F6D7061737356616C7565AD |
:109464002020202045727361747A6B6F6D70617374 |
:10947400732020205573725F5061723120202020A8 |
:10948400202020205573725F7061723320202020C9 |
:109494002020202064656C74615F656173742020F2 |
:1094A4002020202064656C74615F6E6F7274682084 |
:1094B40020202020696E745F656173742020202051 |
:1094C40020202020696E745F6E6F727468202020E3 |
:1094D40020202020496E6465782020202020202030 |
:1094E400202020205542617420202020202020208C |
:1094F400202020204D657373776572745F4E696315 |
:109504006B2020204D657373776572745F526F6CA6 |
:109514006C2020204D657373776572745F476965AD |
:1095240072202020537469636B5F4E69636B202043 |
:1095340020202020537469636B5F526F6C6C202071 |
:1095440020202020537469636B5F47696572202073 |
:10955400202020204750535F4E69636B2020202039 |
:10956400202020204750535F526F6C6C2020202015 |
:109574002020202075746D5F656173742020202085 |
:109584002020202075746D5F6E6F72746820202017 |
:109594002020202075746D5F616C742020202020B1 |
:1095A400202020206770735F73746174652020200D |
:1095B4002020202067705F7265675F78202020205C |
:1095C4002020202067705F7265675F79202020204B |
:1095D40020202020FFFF0A016400007D0000FF031B |
:1095E4000102030405060708090A48616C6C6F2030 |
:1095F40057656C74000000000000000000000000CB |
:109604000000000000000000000000000000000056 |
:109614000000000000000000000000000000000046 |
:109624000000000000000000000000000000000036 |
:10963400000000000000000000000A0142656769A4 |
:109644006E6E657200004E6F726D616C0000537037 |
:109654006F72740000640090D0030090D003001770 |
:10966400B7D13830FB103A409696020A644664EC4F |
:10967400FF000102020303030304040404040404BA |
:109684000405050505050505050505050505050587 |
:109694000506060606060606060606060606060667 |
:1096A4000606060606060606060606060606060656 |
:1096B4000607070707070707070707070707070737 |
:1096C4000707070707070707070707070707070726 |
:1096D4000707070707070707070707070707070716 |
:1096E4000707070707070707070707070707070706 |
:1096F40007080808080808080808080808080808E7 |
:1097040008080808080808080808080808080808D5 |
:1097140008080808080808080808080808080808C5 |
:1097240008080808080808080808080808080808B5 |
:1097340008080808080808080808080808080808A5 |
:109744000808080808080808080808080808080895 |
:109754000808080808080808080808080808080885 |
:109764000808080808080808080808080808080875 |
:029774000800EB |
:00000001FF |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>22-Dec-2007 14:15:04</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>G:\Mikrokopter\Flight_Crtl\v0067g\</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>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>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.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>0</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:\WinAVR-20071221\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\WinAVR-20071221\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>timer0.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>analog.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>makefile</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>main.c</FileName><Status>1</Status></File00003></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/GPS.c |
---|
0,0 → 1,685 |
/* |
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 |
Stand 29.1.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; |
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; // zaheler fuer GPS Off Time beim Kameraausloesen |
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 |
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_UserParam2 > 0) |
{ |
gpsintmax = (GPS_NICKROLL_MAX * GPS_V * GPS_USR_PAR_FKT * ((32*3)/10))/(long)Parameter_UserParam2; //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_V*2)/10// auf 20 Prozent des maximalen Nick/Rollwert begrenzen |
int_east1 = ((((long)int_east) * Parameter_UserParam2)/32)/GPS_USR_PAR_FKT; |
int_north1 = ((((long)int_north) * Parameter_UserParam2)/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_UserParam3/GPS_USR_PAR_FKT); |
amplfy_speed_north *= (Parameter_UserParam3/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_V*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_UserParam1 * 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_UserParam3/GPS_USR_PAR_FKT); |
amplfy_speed_north *= (Parameter_UserParam3/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_V*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_UserParam1 * 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_V*7)/10 // auf 80 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_V*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/GYROKOMP_INC_GRAD_DEFAULT; //Ausrichtung Kopter |
ni = -((gps_reg_y * (long)cos_i(n)) + (gps_reg_x * (long)sin_i(n)))/(1000*GPS_V); |
ro = ((gps_reg_x * (long)cos_i(n)) - (gps_reg_y * (long)sin_i(n)))/(1000*GPS_V); |
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_v0067g/tags/v0007b/License_GPL.txt |
---|
0,0 → 1,674 |
GNU 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. |
Preamble |
The GNU General Public License is a free, copyleft license for |
software and other kinds of works. |
The licenses for most software and other practical works are designed |
to take away your freedom to share and change the works. By contrast, |
the GNU General Public License is intended to guarantee your freedom to |
share and change all versions of a program--to make sure it remains free |
software for all its users. We, the Free Software Foundation, use the |
GNU General Public License for most of our software; it applies also to |
any other work released this way by its authors. You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
them if you wish), that you receive source code or can get it if you |
want it, that you can change the software or use pieces of it in new |
free programs, and that you know you can do these things. |
To protect your rights, we need to prevent others from denying you |
these rights or asking you to surrender the rights. Therefore, you have |
certain responsibilities if you distribute copies of the software, or if |
you modify it: responsibilities to respect the freedom of others. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must pass on to the recipients the same |
freedoms that you received. You must make sure that they, too, receive |
or can get the source code. And you must show them these terms so they |
know their rights. |
Developers that use the GNU GPL protect your rights with two steps: |
(1) assert copyright on the software, and (2) offer you this License |
giving you legal permission to copy, distribute and/or modify it. |
For the developers' and authors' protection, the GPL clearly explains |
that there is no warranty for this free software. For both users' and |
authors' sake, the GPL requires that modified versions be marked as |
changed, so that their problems will not be attributed erroneously to |
authors of previous versions. |
Some devices are designed to deny users access to install or run |
modified versions of the software inside them, although the manufacturer |
can do so. This is fundamentally incompatible with the aim of |
protecting users' freedom to change the software. The systematic |
pattern of such abuse occurs in the area of products for individuals to |
use, which is precisely where it is most unacceptable. Therefore, we |
have designed this version of the GPL to prohibit the practice for those |
products. If such problems arise substantially in other domains, we |
stand ready to extend this provision to those domains in future versions |
of the GPL, as needed to protect the freedom of users. |
Finally, every program is threatened constantly by software patents. |
States should not allow patents to restrict development and use of |
software on general-purpose computers, but in those that do, we wish to |
avoid the special danger that patents applied to a free program could |
make it effectively proprietary. To prevent this, the GPL assures that |
patents cannot be used to render the program non-free. |
The precise terms and conditions for copying, distribution and |
modification follow. |
TERMS AND CONDITIONS |
0. Definitions. |
"This License" refers to version 3 of the GNU General Public License. |
"Copyright" also means copyright-like laws that apply to other kinds of |
works, such as semiconductor masks. |
"The Program" refers to any copyrightable work licensed under this |
License. Each licensee is addressed as "you". "Licensees" and |
"recipients" may be individuals or organizations. |
To "modify" a work means to copy from or adapt all or part of the work |
in a fashion requiring copyright permission, other than the making of an |
exact copy. The resulting work is called a "modified version" of the |
earlier work or a work "based on" the earlier work. |
A "covered work" means either the unmodified Program or a work based |
on the Program. |
To "propagate" a work means to do anything with it that, without |
permission, would make you directly or secondarily liable for |
infringement under applicable copyright law, except executing it on a |
computer or modifying a private copy. Propagation includes copying, |
distribution (with or without modification), making available to the |
public, and in some countries other activities as well. |
To "convey" a work means any kind of propagation that enables other |
parties to make or receive copies. Mere interaction with a user through |
a computer network, with no transfer of a copy, is not conveying. |
An interactive user interface displays "Appropriate Legal Notices" |
to the extent that it includes a convenient and prominently visible |
feature that (1) displays an appropriate copyright notice, and (2) |
tells the user that there is no warranty for the work (except to the |
extent that warranties are provided), that licensees may convey the |
work under this License, and how to view a copy of this License. If |
the interface presents a list of user commands or options, such as a |
menu, a prominent item in the list meets this criterion. |
1. Source Code. |
The "source code" for a work means the preferred form of the work |
for making modifications to it. "Object code" means any non-source |
form of a work. |
A "Standard Interface" means an interface that either is an official |
standard defined by a recognized standards body, or, in the case of |
interfaces specified for a particular programming language, one that |
is widely used among developers working in that language. |
The "System Libraries" of an executable work include anything, other |
than the work as a whole, that (a) is included in the normal form of |
packaging a Major Component, but which is not part of that Major |
Component, and (b) serves only to enable use of the work with that |
Major Component, or to implement a Standard Interface for which an |
implementation is available to the public in source code form. A |
"Major Component", in this context, means a major essential component |
(kernel, window system, and so on) of the specific operating system |
(if any) on which the executable work runs, or a compiler used to |
produce the work, or an object code interpreter used to run it. |
The "Corresponding Source" for a work in object code form means all |
the source code needed to generate, install, and (for an executable |
work) run the object code and to modify the work, including scripts to |
control those activities. However, it does not include the work's |
System Libraries, or general-purpose tools or generally available free |
programs which are used unmodified in performing those activities but |
which are not part of the work. For example, Corresponding Source |
includes interface definition files associated with source files for |
the work, and the source code for shared libraries and dynamically |
linked subprograms that the work is specifically designed to require, |
such as by intimate data communication or control flow between those |
subprograms and other parts of the work. |
The Corresponding Source need not include anything that users |
can regenerate automatically from other parts of the Corresponding |
Source. |
The Corresponding Source for a work in source code form is that |
same work. |
2. Basic Permissions. |
All rights granted under this License are granted for the term of |
copyright on the Program, and are irrevocable provided the stated |
conditions are met. This License explicitly affirms your unlimited |
permission to run the unmodified Program. The output from running a |
covered work is covered by this License only if the output, given its |
content, constitutes a covered work. This License acknowledges your |
rights of fair use or other equivalent, as provided by copyright law. |
You may make, run and propagate covered works that you do not |
convey, without conditions so long as your license otherwise remains |
in force. You may convey covered works to others for the sole purpose |
of having them make modifications exclusively for you, or provide you |
with facilities for running those works, provided that you comply with |
the terms of this License in conveying all material for which you do |
not control copyright. Those thus making or running the covered works |
for you must do so exclusively on your behalf, under your direction |
and control, on terms that prohibit them from making any copies of |
your copyrighted material outside their relationship with you. |
Conveying under any other circumstances is permitted solely under |
the conditions stated below. Sublicensing is not allowed; section 10 |
makes it unnecessary. |
3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
No covered work shall be deemed part of an effective technological |
measure under any applicable law fulfilling obligations under article |
11 of the WIPO copyright treaty adopted on 20 December 1996, or |
similar laws prohibiting or restricting circumvention of such |
measures. |
When you convey a covered work, you waive any legal power to forbid |
circumvention of technological measures to the extent such circumvention |
is effected by exercising rights under this License with respect to |
the covered work, and you disclaim any intention to limit operation or |
modification of the work as a means of enforcing, against the work's |
users, your or third parties' legal rights to forbid circumvention of |
technological measures. |
4. Conveying Verbatim Copies. |
You may convey verbatim copies of the Program's source code as you |
receive it, in any medium, provided that you conspicuously and |
appropriately publish on each copy an appropriate copyright notice; |
keep intact all notices stating that this License and any |
non-permissive terms added in accord with section 7 apply to the code; |
keep intact all notices of the absence of any warranty; and give all |
recipients a copy of this License along with the Program. |
You may charge any price or no price for each copy that you convey, |
and you may offer support or warranty protection for a fee. |
5. Conveying Modified Source Versions. |
You may convey a work based on the Program, or the modifications to |
produce it from the Program, in the form of source code under the |
terms of section 4, provided that you also meet all of these conditions: |
a) The work must carry prominent notices stating that you modified |
it, and giving a relevant date. |
b) The work must carry prominent notices stating that it is |
released under this License and any conditions added under section |
7. This requirement modifies the requirement in section 4 to |
"keep intact all notices". |
c) You must license the entire work, as a whole, under this |
License to anyone who comes into possession of a copy. This |
License will therefore apply, along with any applicable section 7 |
additional terms, to the whole of the work, and all its parts, |
regardless of how they are packaged. This License gives no |
permission to license the work in any other way, but it does not |
invalidate such permission if you have separately received it. |
d) If the work has interactive user interfaces, each must display |
Appropriate Legal Notices; however, if the Program has interactive |
interfaces that do not display Appropriate Legal Notices, your |
work need not make them do so. |
A compilation of a covered work with other separate and independent |
works, which are not by their nature extensions of the covered work, |
and which are not combined with it such as to form a larger program, |
in or on a volume of a storage or distribution medium, is called an |
"aggregate" if the compilation and its resulting copyright are not |
used to limit the access or legal rights of the compilation's users |
beyond what the individual works permit. Inclusion of a covered work |
in an aggregate does not cause this License to apply to the other |
parts of the aggregate. |
6. Conveying Non-Source Forms. |
You may convey a covered work in object code form under the terms |
of sections 4 and 5, provided that you also convey the |
machine-readable Corresponding Source under the terms of this License, |
in one of these ways: |
a) Convey the object code in, or embodied in, a physical product |
(including a physical distribution medium), accompanied by the |
Corresponding Source fixed on a durable physical medium |
customarily used for software interchange. |
b) Convey the object code in, or embodied in, a physical product |
(including a physical distribution medium), accompanied by a |
written offer, valid for at least three years and valid for as |
long as you offer spare parts or customer support for that product |
model, to give anyone who possesses the object code either (1) a |
copy of the Corresponding Source for all the software in the |
product that is covered by this License, on a durable physical |
medium customarily used for software interchange, for a price no |
more than your reasonable cost of physically performing this |
conveying of source, or (2) access to copy the |
Corresponding Source from a network server at no charge. |
c) Convey individual copies of the object code with a copy of the |
written offer to provide the Corresponding Source. This |
alternative is allowed only occasionally and noncommercially, and |
only if you received the object code with such an offer, in accord |
with subsection 6b. |
d) Convey the object code by offering access from a designated |
place (gratis or for a charge), and offer equivalent access to the |
Corresponding Source in the same way through the same place at no |
further charge. You need not require recipients to copy the |
Corresponding Source along with the object code. If the place to |
copy the object code is a network server, the Corresponding Source |
may be on a different server (operated by you or a third party) |
that supports equivalent copying facilities, provided you maintain |
clear directions next to the object code saying where to find the |
Corresponding Source. Regardless of what server hosts the |
Corresponding Source, you remain obligated to ensure that it is |
available for as long as needed to satisfy these requirements. |
e) Convey the object code using peer-to-peer transmission, provided |
you inform other peers where the object code and Corresponding |
Source of the work are being offered to the general public at no |
charge under subsection 6d. |
A separable portion of the object code, whose source code is excluded |
from the Corresponding Source as a System Library, need not be |
included in conveying the object code work. |
A "User Product" is either (1) a "consumer product", which means any |
tangible personal property which is normally used for personal, family, |
or household purposes, or (2) anything designed or sold for incorporation |
into a dwelling. In determining whether a product is a consumer product, |
doubtful cases shall be resolved in favor of coverage. For a particular |
product received by a particular user, "normally used" refers to a |
typical or common use of that class of product, regardless of the status |
of the particular user or of the way in which the particular user |
actually uses, or expects or is expected to use, the product. A product |
is a consumer product regardless of whether the product has substantial |
commercial, industrial or non-consumer uses, unless such uses represent |
the only significant mode of use of the product. |
"Installation Information" for a User Product means any methods, |
procedures, authorization keys, or other information required to install |
and execute modified versions of a covered work in that User Product from |
a modified version of its Corresponding Source. The information must |
suffice to ensure that the continued functioning of the modified object |
code is in no case prevented or interfered with solely because |
modification has been made. |
If you convey an object code work under this section in, or with, or |
specifically for use in, a User Product, and the conveying occurs as |
part of a transaction in which the right of possession and use of the |
User Product is transferred to the recipient in perpetuity or for a |
fixed term (regardless of how the transaction is characterized), the |
Corresponding Source conveyed under this section must be accompanied |
by the Installation Information. But this requirement does not apply |
if neither you nor any third party retains the ability to install |
modified object code on the User Product (for example, the work has |
been installed in ROM). |
The requirement to provide Installation Information does not include a |
requirement to continue to provide support service, warranty, or updates |
for a work that has been modified or installed by the recipient, or for |
the User Product in which it has been modified or installed. Access to a |
network may be denied when the modification itself materially and |
adversely affects the operation of the network or violates the rules and |
protocols for communication across the network. |
Corresponding Source conveyed, and Installation Information provided, |
in accord with this section must be in a format that is publicly |
documented (and with an implementation available to the public in |
source code form), and must require no special password or key for |
unpacking, reading or copying. |
7. Additional Terms. |
"Additional permissions" are terms that supplement the terms of this |
License by making exceptions from one or more of its conditions. |
Additional permissions that are applicable to the entire Program shall |
be treated as though they were included in this License, to the extent |
that they are valid under applicable law. If additional permissions |
apply only to part of the Program, that part may be used separately |
under those permissions, but the entire Program remains governed by |
this License without regard to the additional permissions. |
When you convey a copy of a covered work, you may at your option |
remove any additional permissions from that copy, or from any part of |
it. (Additional permissions may be written to require their own |
removal in certain cases when you modify the work.) You may place |
additional permissions on material, added by you to a covered work, |
for which you have or can give appropriate copyright permission. |
Notwithstanding any other provision of this License, for material you |
add to a covered work, you may (if authorized by the copyright holders of |
that material) supplement the terms of this License with terms: |
a) Disclaiming warranty or limiting liability differently from the |
terms of sections 15 and 16 of this License; or |
b) Requiring preservation of specified reasonable legal notices or |
author attributions in that material or in the Appropriate Legal |
Notices displayed by works containing it; or |
c) Prohibiting misrepresentation of the origin of that material, or |
requiring that modified versions of such material be marked in |
reasonable ways as different from the original version; or |
d) Limiting the use for publicity purposes of names of licensors or |
authors of the material; or |
e) Declining to grant rights under trademark law for use of some |
trade names, trademarks, or service marks; or |
f) Requiring indemnification of licensors and authors of that |
material by anyone who conveys the material (or modified versions of |
it) with contractual assumptions of liability to the recipient, for |
any liability that these contractual assumptions directly impose on |
those licensors and authors. |
All other non-permissive additional terms are considered "further |
restrictions" within the meaning of section 10. If the Program as you |
received it, or any part of it, contains a notice stating that it is |
governed by this License along with a term that is a further |
restriction, you may remove that term. If a license document contains |
a further restriction but permits relicensing or conveying under this |
License, you may add to a covered work material governed by the terms |
of that license document, provided that the further restriction does |
not survive such relicensing or conveying. |
If you add terms to a covered work in accord with this section, you |
must place, in the relevant source files, a statement of the |
additional terms that apply to those files, or a notice indicating |
where to find the applicable terms. |
Additional terms, permissive or non-permissive, may be stated in the |
form of a separately written license, or stated as exceptions; |
the above requirements apply either way. |
8. Termination. |
You may not propagate or modify a covered work except as expressly |
provided under this License. Any attempt otherwise to propagate or |
modify it is void, and will automatically terminate your rights under |
this License (including any patent licenses granted under the third |
paragraph of section 11). |
However, if you cease all violation of this License, then your |
license from a particular copyright holder is reinstated (a) |
provisionally, unless and until the copyright holder explicitly and |
finally terminates your license, and (b) permanently, if the copyright |
holder fails to notify you of the violation by some reasonable means |
prior to 60 days after the cessation. |
Moreover, your license from a particular copyright holder is |
reinstated permanently if the copyright holder notifies you of the |
violation by some reasonable means, this is the first time you have |
received notice of violation of this License (for any work) from that |
copyright holder, and you cure the violation prior to 30 days after |
your receipt of the notice. |
Termination of your rights under this section does not terminate the |
licenses of parties who have received copies or rights from you under |
this License. If your rights have been terminated and not permanently |
reinstated, you do not qualify to receive new licenses for the same |
material under section 10. |
9. Acceptance Not Required for Having Copies. |
You are not required to accept this License in order to receive or |
run a copy of the Program. Ancillary propagation of a covered work |
occurring solely as a consequence of using peer-to-peer transmission |
to receive a copy likewise does not require acceptance. However, |
nothing other than this License grants you permission to propagate or |
modify any covered work. These actions infringe copyright if you do |
not accept this License. Therefore, by modifying or propagating a |
covered work, you indicate your acceptance of this License to do so. |
10. Automatic Licensing of Downstream Recipients. |
Each time you convey a covered work, the recipient automatically |
receives a license from the original licensors, to run, modify and |
propagate that work, subject to this License. You are not responsible |
for enforcing compliance by third parties with this License. |
An "entity transaction" is a transaction transferring control of an |
organization, or substantially all assets of one, or subdividing an |
organization, or merging organizations. If propagation of a covered |
work results from an entity transaction, each party to that |
transaction who receives a copy of the work also receives whatever |
licenses to the work the party's predecessor in interest had or could |
give under the previous paragraph, plus a right to possession of the |
Corresponding Source of the work from the predecessor in interest, if |
the predecessor has it or can get it with reasonable efforts. |
You may not impose any further restrictions on the exercise of the |
rights granted or affirmed under this License. For example, you may |
not impose a license fee, royalty, or other charge for exercise of |
rights granted under this License, and you may not initiate litigation |
(including a cross-claim or counterclaim in a lawsuit) alleging that |
any patent claim is infringed by making, using, selling, offering for |
sale, or importing the Program or any portion of it. |
11. Patents. |
A "contributor" is a copyright holder who authorizes use under this |
License of the Program or a work on which the Program is based. The |
work thus licensed is called the contributor's "contributor version". |
A contributor's "essential patent claims" are all patent claims |
owned or controlled by the contributor, whether already acquired or |
hereafter acquired, that would be infringed by some manner, permitted |
by this License, of making, using, or selling its contributor version, |
but do not include claims that would be infringed only as a |
consequence of further modification of the contributor version. For |
purposes of this definition, "control" includes the right to grant |
patent sublicenses in a manner consistent with the requirements of |
this License. |
Each contributor grants you a non-exclusive, worldwide, royalty-free |
patent license under the contributor's essential patent claims, to |
make, use, sell, offer for sale, import and otherwise run, modify and |
propagate the contents of its contributor version. |
In the following three paragraphs, a "patent license" is any express |
agreement or commitment, however denominated, not to enforce a patent |
(such as an express permission to practice a patent or covenant not to |
sue for patent infringement). To "grant" such a patent license to a |
party means to make such an agreement or commitment not to enforce a |
patent against the party. |
If you convey a covered work, knowingly relying on a patent license, |
and the Corresponding Source of the work is not available for anyone |
to copy, free of charge and under the terms of this License, through a |
publicly available network server or other readily accessible means, |
then you must either (1) cause the Corresponding Source to be so |
available, or (2) arrange to deprive yourself of the benefit of the |
patent license for this particular work, or (3) arrange, in a manner |
consistent with the requirements of this License, to extend the patent |
license to downstream recipients. "Knowingly relying" means you have |
actual knowledge that, but for the patent license, your conveying the |
covered work in a country, or your recipient's use of the covered work |
in a country, would infringe one or more identifiable patents in that |
country that you have reason to believe are valid. |
If, pursuant to or in connection with a single transaction or |
arrangement, you convey, or propagate by procuring conveyance of, a |
covered work, and grant a patent license to some of the parties |
receiving the covered work authorizing them to use, propagate, modify |
or convey a specific copy of the covered work, then the patent license |
you grant is automatically extended to all recipients of the covered |
work and works based on it. |
A patent license is "discriminatory" if it does not include within |
the scope of its coverage, prohibits the exercise of, or is |
conditioned on the non-exercise of one or more of the rights that are |
specifically granted under this License. You may not convey a covered |
work if you are a party to an arrangement with a third party that is |
in the business of distributing software, under which you make payment |
to the third party based on the extent of your activity of conveying |
the work, and under which the third party grants, to any of the |
parties who would receive the covered work from you, a discriminatory |
patent license (a) in connection with copies of the covered work |
conveyed by you (or copies made from those copies), or (b) primarily |
for and in connection with specific products or compilations that |
contain the covered work, unless you entered into that arrangement, |
or that patent license was granted, prior to 28 March 2007. |
Nothing in this License shall be construed as excluding or limiting |
any implied license or other defenses to infringement that may |
otherwise be available to you under applicable patent law. |
12. No Surrender of Others' Freedom. |
If conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot convey a |
covered work so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you may |
not convey it at all. For example, if you agree to terms that obligate you |
to collect a royalty for further conveying from those to whom you convey |
the Program, the only way you could satisfy both those terms and this |
License would be to refrain entirely from conveying the Program. |
13. Use with the GNU Affero General Public License. |
Notwithstanding any other provision of this License, you have |
permission to link or combine any covered work with a work licensed |
under version 3 of the GNU Affero General Public License into a single |
combined work, and to convey the resulting work. The terms of this |
License will continue to apply to the part which is the covered work, |
but the special requirements of the GNU Affero General Public License, |
section 13, concerning interaction through a network will apply to the |
combination as such. |
14. Revised Versions of this License. |
The Free Software Foundation may publish revised and/or new versions of |
the GNU 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 |
Program specifies that a certain numbered version of the GNU General |
Public License "or any later version" applies to it, you have the |
option of following the terms and conditions either of that numbered |
version or of any later version published by the Free Software |
Foundation. If the Program does not specify a version number of the |
GNU General Public License, you may choose any version ever published |
by the Free Software Foundation. |
If the Program specifies that a proxy can decide which future |
versions of the GNU General Public License can be used, that proxy's |
public statement of acceptance of a version permanently authorizes you |
to choose that version for the Program. |
Later license versions may give you additional or different |
permissions. However, no additional obligations are imposed on any |
author or copyright holder as a result of your choosing to follow a |
later version. |
15. Disclaimer of Warranty. |
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
16. Limitation of Liability. |
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
SUCH DAMAGES. |
17. Interpretation of Sections 15 and 16. |
If the disclaimer of warranty and limitation of liability provided |
above cannot be given local legal effect according to their terms, |
reviewing courts shall apply local law that most closely approximates |
an absolute waiver of all civil liability in connection with the |
Program, unless a warranty or assumption of liability accompanies a |
copy of the Program in return for a fee. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
state the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program 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 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 for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. |
Also add information on how to contact you by electronic and paper mail. |
If the program does terminal interaction, make it output a short |
notice like this when it starts in an interactive mode: |
<program> Copyright (C) <year> <name of author> |
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, your program's commands |
might be different; for a GUI interface, you would use an "about box". |
You should also get your employer (if you work as a programmer) or school, |
if any, to sign a "copyright disclaimer" for the program, if necessary. |
For more information on this, and how to apply and follow the GNU GPL, see |
<http://www.gnu.org/licenses/>. |
The GNU General Public License does not permit incorporating your program |
into proprietary programs. If your program is a subroutine library, you |
may consider it more useful to permit linking proprietary applications with |
the library. If this is what you want to do, use the GNU Lesser General |
Public License instead of this License. But first, please read |
<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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_v0067g/tags/v0007b/License_buss.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_v0067g/tags/v0007b/README_Gps_Deutsch.txt |
---|
0,0 → 1,95 |
********************************************************************* |
GPS Implementierung von Peter Muehlenbrock ("Salvo") für Mikrokopter/FlightCrtl |
Stand 9.2.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.67g. |
********************************************************************* |
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 UserParameter1(P), 2(I) und D(3) gesteuert wird. |
UserParameter1 beschreibt den P(roportional)-Anteil, UserParameter2 den I(ntegral)-Anteil und UserParameter3 den D(ifferential)-Anteil. |
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 klein bei gleichzeitig geringer Schwingneigung ist. |
Standarddwerte für P,I,D sind 60,8,100. |
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"). |
Folgende Möglichkeiten zur Aktivierung von GPS Hold gibt es: |
Das GPS Aktiv Flag im Setting ist aktiviert |
ODER |
das GPS Aktiv Flag im Setting ist nicht aktiviert UND UserParameter5 hat einen Wert > 75 und < 170. |
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_STICK_HOLDOFF) oder liefert das GPS Modul 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. |
Folgende Möglichkeiten zur Aktivierung von GPS Home gibt es: |
Das GPS Aktiv Flag im Setting ist aktiviert UND der Hoehenreglerschalter ("Parameter_MaxHoehe") hat einen Wert > 170 |
ODER |
das GPS Aktiv Flag im Setting ist nicht aktiviert UND UserParameter5 hat einen Wert >170. |
Holgers Code habe ich so abgeändert daß der Höhenregler mit "Parameter_MaxHoehe" >=50 aktiviert wird. |
Weitere Änderungen: |
-Bei Unterschreiten der eingestellten Warnschwelle für UBAT ertönt zunächst wie gewohnt der Piepser. Geht die Spannung weiter |
runter wird zwangsweise die Gaseinstellung langsam reduziert um den Kopter zum Landen zu bringen. |
-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_v0067g/tags/v0007b/README_Gps_English.txt |
---|
0,0 → 1,70 |
********************************************************************* |
GPS Implementation by Peter Muehlenbrock ("Salvo") for Mikrokopter/FlightCrtl |
As of February, 9th 2008 |
Please note the files Licensce_LPGL.txt and Licensce_GPL.txt |
This SW is based on Holgers V00.67g. |
********************************************************************* |
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: UserParameter1 =P(proportional), UserParameter2 = I(ntegral), |
UserParameter3 = D(ifferential). Standardvalues for P,I and D are 60,8,100. |
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. |
There are two ways to enable the GPS Hold functionality: |
Either enable the GPS flag in the setting OR |
disable the GPS flag in the setting AND set UserParameter5 to a value > 75 and < 170. |
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 |
There are tow ways to enable the GPS Coming Home functionality: |
Either enable the GPS flag in the setting AND set the Height Switch ("ParameterMAxhoehe) to a value > 170 OR |
disable the GPS flag in the setting AND set UserParameter5 to a value > 170. |
The height regulator itself is activated with a value >= 50. |
Other changes: |
- automatic pitch reduction if the battery voltage falls more than 0.2V below the warning limit. |
- 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_v0067g/tags/v0007b/Settings.h |
---|
--- salvo_gps/Basis_v0067g/tags/v0007b/_Settings.h (nonexistent) |
+++ salvo_gps/Basis_v0067g/tags/v0007b/_Settings.h (revision 697) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 16 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Debugdaten 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_v0067g/tags/v0007b/analog.c |
---|
0,0 → 1,145 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/analog.h |
---|
0,0 → 1,24 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/eeprom.c |
---|
0,0 → 1,183 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
//EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 Salvo |
EE_Parameter.Gier_P = 14; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 120; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 98; // Wert : 0-250 |
EE_Parameter.NotGas = 95; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 60; // 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 = 90; // P Anteil GPS |
EE_Parameter.UserParam2 = 24; // I Anteil GPS |
EE_Parameter.UserParam3 = 130; //D Anteil GPS |
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 = 100; |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 50; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 10; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 98; // Wert : 0-250 |
EE_Parameter.NotGas = 95; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 60; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 100; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 8; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 200; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 98; // Wert : 0-250 |
EE_Parameter.NotGas = 95; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 60; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 10; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 100; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/fc.c |
---|
0,0 → 1,1404 |
/*####################################################################################### |
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; |
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
volatile long IntegralNick = 0,IntegralNick2 = 0; |
volatile long IntegralRoll = 0,IntegralRoll2 = 0; |
volatile long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
volatile long Integral_Gier = 0; |
volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
volatile long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile int KompassRichtung = 0; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
//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; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
float Ki = FAKTOR_I; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
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; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
GyroGier_Comp =0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
ExternHoehenValue = 0; |
//Salvo 13.10.2007 Ersatzkompass und Gas |
GyroKomp_Int = KompassValue * GYROKOMP_INC_GRAD_DEFAULT; //Neu ab 3.1.2007 |
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; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
//Salvo 12.11.2007 |
GyroKomp_Int += (long)MesswertGier; |
GyroGier_Comp += (long)MesswertGier; |
//Salvo End |
Mess_Integral_Gier += MesswertGier; |
Mess_Integral_Gier2 += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = Mess_IntegralNick / 4096L; |
tmpl *= MesswertGier; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 2048L; |
tmpl2 = Mess_IntegralRoll / 4096L; |
tmpl2 *= MesswertGier; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 2048L; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(AdWertRoll < 15) MesswertRoll = -1000; |
if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertRoll > 1010) MesswertRoll = +1000; |
if(AdWertRoll > 1017) MesswertRoll = +2000; |
} |
else |
{ |
if(AdWertRoll > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(AdWertNick < 15) MesswertNick = -1000; |
if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +1000; |
if(AdWertNick > 1017) MesswertNick = +2000; |
} |
else |
{ |
if(AdWertNick > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(MOTOR_OFF || !MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
} |
/* |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
*/ |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static unsigned int modell_fliegt = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
//****** 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 = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
if(GasMischanteil > MAX_GAS - 20) GasMischanteil = MAX_GAS - 20; |
//Salvo 13.10.2007 langsame Gasreduktion bei Unterspannung. Als Ausgangswert wird der bei UBAT=k gemessen Mittelwert genommen |
// und dieser dann langsam zwangsweise reduziert |
if (UBat <= EE_Parameter.UnterspannungsWarnung - 4) //Unterhalb der Piepser Schwelle aktivieren |
{ |
if (ubat_cnt > 1000) |
{ |
ubat_cnt = 0; |
if (gas_actual > ((gas_mittel*12)/15)) gas_actual--; |
} |
else ubat_cnt++; |
if (GasMischanteil > gas_actual) GasMischanteil = gas_actual; |
} |
else //Falls UBAT wieder ok ist |
{ |
if (ubat_cnt > 1000) |
{ |
gas_mittel = ((gas_mittel*9) + GasMischanteil)/10; //Filtern |
gas_actual = GasMischanteil; |
} |
else |
{ |
ubat_cnt++; |
if ((ubat_cnt % 10) == 0) |
{ |
if (gas_actual < GasMischanteil) gas_actual++; |
else gas_actual = GasMischanteil; |
} |
} |
GasMischanteil = gas_actual; |
} |
// Salvo End |
if(GasMischanteil < 0) GasMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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 > 2000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 200) || (GasMischanteil < 40)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
} |
if((GasMischanteil > 200) && 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 |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Piep(GetActiveParamSetNumber()); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
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(); |
if (ACC_FIXED > 0) |
{ |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],ACC_NICK_NEUTRAL / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],ACC_NICK_NEUTRAL % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],ACC_ROLL_NEUTRAL / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],ACC_ROLL_NEUTRAL % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)ACC_Z_NEUTRAL / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)ACC_Z_NEUTRAL % 256); |
} |
else |
{ |
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(GasMischanteil < 35) |
{ |
// 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 |
} |
} |
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; |
ParameterZuordnung(); |
StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
#define KEY_VALUE (Parameter_UserParam1 * 4) //(Poti3 * 8) |
if(DubWiseKeys[1]) beeptime = 10; |
if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickNick = (ExternStickNick * 7 + tmp_int) / 8; |
if(DubWiseKeys[1] & DUB_KEY_LEFT) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_RIGHT) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickRoll = (ExternStickRoll * 7 + tmp_int) / 8; |
if(DubWiseKeys[0] & 8) ExternStickGier = 50;else |
if(DubWiseKeys[0] & 4) ExternStickGier =-50;else ExternStickGier = 0; |
if(DubWiseKeys[0] & 2) ExternHoehenValue++; |
if(DubWiseKeys[0] & 16) ExternHoehenValue--; |
StickNick += ExternStickNick / 8; |
StickRoll += ExternStickRoll / 8; |
StickGier += ExternStickGier; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
// greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
{ |
if(IntegralNick > 60000) |
{ |
StickNick -= 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralNick < -60000) |
{ |
StickNick += 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
if(IntegralRoll > 60000) |
{ |
StickRoll -= 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralRoll < -60000) |
{ |
StickRoll += 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) {Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll) beeptime = 100; |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 0.1; |
IntegralFaktor = 0.005; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll) |
{ |
long tmp_long, tmp_long2; |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long /= 16; |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long2 /= 16; |
#define AUSGLEICH 32 //(Parameter_UserParam1 / 2) |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
// Mess_IntegralNick -= ausgleichNick; |
// Mess_IntegralRoll -= ausgleichRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
// tmp_long = (long)(MittelIntegralNick2 - (long)IntegralAccNick); |
// tmp_long2 = (long)(MittelIntegralRoll2 - (long)IntegralAccRoll); |
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; |
//Salvo Ersatzkompass Ueberlauf korrigieren |
if (GyroKomp_Int >= ((long)360 * GYROKOMP_INC_GRAD_DEFAULT)) GyroKomp_Int = GyroKomp_Int - (GYROKOMP_INC_GRAD_DEFAULT *(long)360); //neu ab 3.11.2007 |
if (GyroKomp_Int < 0) GyroKomp_Int = GyroKomp_Int + (GYROKOMP_INC_GRAD_DEFAULT *(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; |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
DebugOut.Analog[28] = ausgleichNick; |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} else cnt = 0; |
//Salvo 26.12.2007 |
w = (abs(Mittelwert_AccNick)); |
v = (abs(Mittelwert_AccRoll)); |
if ((w < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) // Gyro nur in annaehend 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; |
} |
//Salvo 26.12.2007 |
if ((w < ACC_WAAGRECHT_LIMIT*2) && (v < ACC_WAAGRECHT_LIMIT*2)) // Gyro nur inannaehernd 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 |
//DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
//DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // Ende Abgleich |
// 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)GYROKOMP_INC_GRAD_DEFAULT); |
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 8 |
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)GYROKOMP_INC_GRAD_DEFAULT; |
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)GYROKOMP_INC_GRAD_DEFAULT; // 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]]) < GPS_STICK_HOLDOFF) |
&& (abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < GPS_STICK_HOLDOFF) && (gps_alive_cnt > 0)) |
{ |
if ((Parameter_MaxHoehe > 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_UserParam5 > 170) && (!(EE_Parameter.GlobalConfig & CFG_GPS_AKTIV))) //UserPar5 aktiv und GPS Flag nicht 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_MaxHoehe < 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 if ((Parameter_UserParam5 > 75) && (!(EE_Parameter.GlobalConfig & CFG_GPS_AKTIV))) //UserPar5 Mittelstellung und GPS Flag nicht 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(abs(StickGier) > 20) // war 35 |
{ |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) && (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] = GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
// Diverse parameter Debugging |
DebugOut.Analog[16] = dataset_cnt; |
DebugOut.Analog[17] = UBat; |
DebugOut.Analog[18] = MesswertNick; |
DebugOut.Analog[19] = MesswertRoll; |
DebugOut.Analog[20] = MesswertGier; |
DebugOut.Analog[21] = StickNick; |
DebugOut.Analog[22] = StickRoll; |
DebugOut.Analog[23] = StickGier; |
// GPS Debugging |
// DebugOut.Analog[10] = GPS_dist_2trgt/10; |
// DebugOut.Analog[11] = GPS_hdng_rel_2trgt; |
DebugOut.Analog[10] = Parameter_UserParam1; |
DebugOut.Analog[11] = Parameter_UserParam3; |
DebugOut.Analog[24] = GPS_Nick; |
DebugOut.Analog[25] = GPS_Roll; |
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] = debug_gp_0; |
DebugOut.Analog[31] = debug_gp_1; |
DebugOut.Analog[12] = debug_gp_2; |
DebugOut.Analog[13] = debug_gp_3; |
DebugOut.Analog[14] = debug_gp_4; |
DebugOut.Analog[15] = debug_gp_5; |
// DebugOut.Analog[30] = dist_flown; |
// DebugOut.Analog[31] = (int) dist_2home; |
// DebugOut.Analog[31] = (int) GPS_hdng_abs_2trgt; |
// DebugOut.Analog[31] = (int) GyroGier_Comp; |
/* |
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 * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
//DebugOut.Analog[28] = MesswertRoll; |
//DebugOut.Analog[25] = IntegralRoll * IntegralFaktor; |
//DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor); |
// Maximalwerte abfangen |
#define MAX_SENSOR 2048 |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//OCR0B = 180 - (Poti1 + 120) / 4; |
//DruckOffsetSetting = OCR0B; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
} |
else |
HoehenReglerAktiv = 1; |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
if(tmp_int > 50) tmp_int = 50; |
else if(tmp_int < -50) tmp_int = -50; |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
//GierMischanteil = 0; |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
if(GierMischanteil > ((MAX_GAS - GasMischanteil))) GierMischanteil = ((MAX_GAS - GasMischanteil)); |
if(GierMischanteil < -((MAX_GAS - GasMischanteil))) GierMischanteil = -((MAX_GAS - GasMischanteil)); |
if(GasMischanteil < 20) GierMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - (StickNick - GPS_Nick); // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - (StickNick - GPS_Nick); // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > 0) SummeNick-= 2 ; else SummeNick += 2 ; |
if(SummeNick > 16000) SummeNick = 16000; |
if(SummeNick < -16000) SummeNick = -16000; |
pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - (StickRoll - GPS_Roll); // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - (StickRoll - GPS_Roll);// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > 0) SummeRoll-= 2 ; else SummeRoll += 2 ; |
if(SummeRoll > 16000) SummeRoll = 16000; |
if(SummeRoll < -16000) SummeRoll = -16000; |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/fc.h |
---|
0,0 → 1,169 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
//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_NICK_NEUTRAL 518 // ADC Wandler Wert in Neutrallage (0g): Vom individuellen Sensor abhaengig |
#define ACC_ROLL_NEUTRAL 516 // ADC Wandler wert in Neutrallage (0g) |
#define ACC_Z_NEUTRAL 740 // ADC Wandler wert in Neutrallage (0g) |
#define ACC_WAAGRECHT_LIMIT 100 // Nick und Roll kleiner als dieser Wert gelten als Kriterium fuer waagrechte Lage |
#define CAM_GPS_QUIET 0 // wenn dieses Flag gesetzt ist, wird GPS beim Ausloesen kurzzeitig deaktiviert um eine ruhige Lage zu bekommen |
//Salvo 2.9.2007 Ersatzkompass: Gyroincrements/Grad als Defaultwert ***** |
// Laut Datenblatt sind di; Werte ueber Zeit und Temperatur sehr stabil. |
#define GYROKOMP_INC_GRAD_DEFAULT 1300 // Gyroincrements/Grad als Defaultwert |
// Salvo End |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
//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 |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Integral_Gier; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Gier; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern unsigned char MotorWert[5]; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
#define STRUCT_PARAM_LAENGE 71 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
#endif //_FC_H |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/flightctrl.aws |
---|
0,0 → 1,0 |
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA644"/><Files><File00000 Name="G:\Mikrokopter\Flight_Crtl\v0067g\timer0.c" Position="266 101 1182 710" LineCol="164 0" State="Maximized"/><File00001 Name="G:\Mikrokopter\Flight_Crtl\v0067g\analog.h" Position="288 130 1218 738" LineCol="0 0" State="Maximized"/><File00002 Name="G:\Mikrokopter\Flight_Crtl\v0067g\makefile" Position="310 159 1240 767" LineCol="203 0" State="Maximized"/><File00003 Name="G:\Mikrokopter\Flight_Crtl\v0067g\main.c" Position="332 188 1262 796" LineCol="208 35" State="Maximized"/><File00004 Name="G:\Mikrokopter\Flight_Crtl\v0067g\fc.c" Position="354 217 1266 800" LineCol="1299 22" State="Maximized"/><File00005 Name="G:\Mikrokopter\Flight_Crtl\v0067g\timer0.h" Position="262 71 1402 978" LineCol="6 0" State="Maximized"/></Files></AVRWorkspace> |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/gps.h |
---|
0,0 → 1,131 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock alias Salvo |
// Definitionen fuer Modul GPS |
// Stand 20.1.2008 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
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 30 // 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_STICK_HOLDOFF 16 // Wenn der Nick oder Roll Stickwerte groesser sind, wird GPS_HOLD deaktiviert |
#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 100 // 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 16 // 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_v0067g/tags/v0007b/main.c |
---|
0,0 → 1,251 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
//unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
// Salvo 9.12.2007 PC6 als Ausgang |
// DDRC = 0x81; // SCL |
DDRC = 0xCD; // SCL und PC2,PC3, PC6 als Ausgang |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
// SPI_MasterInit(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 68 // 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; |
// Salvo 9.12.2007 Defaultwert fuer Umschaltsignal fuer RX: Bluettooth Modul aktiv |
RX_SWTCH_OFF; |
// Salvo End |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
// SPI_TransmitByte(); |
UpdateMotor=0; |
//PORTD |= 0x08; |
MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
DubWiseKeys[0] = 0; |
DubWiseKeys[1] = 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) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
// SPI_StartTransmitPacket(); |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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 PORTB &=~0x02 |
#define GRN_ON 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; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/makefile |
---|
0,0 → 1,411 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 7 |
VERSION_INDEX = 1 |
VERSION_KOMPATIBEL = 7 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(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 |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c math.c |
#spi.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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_v0067g/tags/v0007b/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_v0067g/tags/v0007b/menu.c |
---|
0,0 → 1,127 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); RemotePollDisplayLine = -1; } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); RemotePollDisplayLine = -1;} |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,0,"[%i]",MenuePunkt); |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"++ MikroKopter ++"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier/2); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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_v0067g/tags/v0007b/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_v0067g/tags/v0007b/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_v0067g/tags/v0007b/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_v0067g/tags/v0007b/rc.c |
---|
0,0 → 1,84 |
/*####################################################################################### |
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 initialisiert 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 = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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_v0067g/tags/v0007b/spi.c |
---|
0,0 → 1,86 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
cli(); |
DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
sei(); |
//---- |
SPDR = ToNaviCtrl.Comp; // Start transmission |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ SPDR = Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
unsigned char i; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = (char) StickNick; |
ToNaviCtrl.StickRoll = (char) StickRoll; |
ToNaviCtrl.StickGier = (char) StickGier; |
sei(); |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/spi.h |
---|
0,0 → 1,46 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#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 |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#endif |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/timer0.c |
---|
0,0 → 1,192 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
//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(!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) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 4000)) |
{ |
// 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); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/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 int ServoValue; |
extern unsigned int BeepMuster; |
//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_v0067g/tags/v0007b/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/salvo_gps/Basis_v0067g/tags/v0007b/uart.c |
---|
0,0 → 1,406 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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[3] = {0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
//Salvo 26.10.2007 |
int dataset_cnt=0; //Zaehlt die uebertragenen Debugdaten |
//Salvo End |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Ersatzkompass ", |
"Usr_Par1 ", //10 |
"Usr_par3 ", |
/* "Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
*/ |
"delta_east ", |
"delta_north ", |
"int_east ", |
"int_north ", //15 |
"Index ", |
"UBat ", |
"Messwert_Nick ", |
"Messwert_Roll ", |
"Messwert_Gier ", //20 |
"Stick_Nick ", |
"Stick_Roll ", |
"Stick_Gier ", |
"GPS_Nick ", |
"GPS_Roll ", //25 |
"utm_east ", |
"utm_north ", |
"utm_alt ", |
"gps_state ", |
// "dist_flown ", //30 |
// "dist_2home " |
"gp_reg_x ", //30 |
"gp_reg_y " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'a':// Texte der Analogwerte |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
DebugTextAnforderung = tmp_char_arr2[0]; |
break; |
case 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
// static char dis_zeile = 0; |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
//Salvo 26.10.2007 Counter fuer Erkennung von fehlenden Daten per Bluetoothuebertragung |
dataset_cnt++; |
// Salvo End |
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(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_v0067g/tags/v0007b/uart.h |
---|
0,0 → 1,106 |
#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 |
//Salvo 26.10.2007 |
extern int dataset_cnt; |
// salvo End |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
extern unsigned char DubWiseKeys[3]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/salvo_gps/Basis_v0067g/tags/v0007b |
---|
Property changes: |
Added: svn:ignore |
+*.bak |
+*.aps |
+*.elf |
+*.sym |
+*.map |
+*.lss |
+*.eep |
+*.txt |
+*.mkp |