/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/GPS.c |
---|
0,0 → 1,30 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Hex-Files/Flight-Ctrl_MEGA644_V0_64.hex |
---|
0,0 → 1,1544 |
:100000000C94EC010C9407020C9407020C94070268 |
:100010000C9407020C9407020C9407020C9407023C |
:100020000C9407020C94590B0C9407020C940702D1 |
:100030000C9400160C9407020C9407020C9407020F |
:100040000C9407020C9407020C94630A0C940702A8 |
:100050000C943C040C9407020C9406040C940702C4 |
:100060000C945E0C0C9407020C942A150C94070255 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A00020000A0D3D3D3D3D3D3D3D3D3D3D3D3D3D |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D000A0D496E69742E20454550524F42 |
:1000D0004D3A2047656E65726965726520446566B4 |
:1000E00061756C742D506172616D657465722E2E30 |
:1000F0002E000A0D42656E75747A6520506172613A |
:100100006D657465727361747A202564000A0D410F |
:1001100062676C65696368204C75667464727563A8 |
:100120006B73656E736F722E2E004F4B0A0D000AB3 |
:100130000D537465756572756E673A200048656188 |
:1001400064696E67486F6C64004E65757472616CAB |
:10015000000A0A0D002E005B25695D002B2B204D47 |
:10016000696B726F4B6F70746572202B2B00485750 |
:100170003A5625642E25642053573A25642E25646B |
:100180000053657474696E673A2025642000286303 |
:100190002920486F6C676572204275737300486F41 |
:1001A0006568653A202020202025356900536F6C52 |
:1001B0006C486F6568653A20253569004C75667432 |
:1001C000647275636B3A20253569004F666620209E |
:1001D000202020203A20253569004B65696E652076 |
:1001E0000048F668656E726567656C756E670061DC |
:1001F0006B742E204C616765004E69636B3A20205A |
:100200002020202025356900526F6C6C3A20202078 |
:10021000202020253569004B6F6D706173733A2083 |
:100220002020253569004B313A25346920204B3296 |
:100230003A25346920004B333A25346920204B3469 |
:100240003A25346920004B353A25346920204B3655 |
:100250003A25346920004B373A25346920204B3841 |
:100260003A25346920004E693A2534692020526FBE |
:100270003A253469200047733A25346920204769BC |
:100280003A253469200050313A2534692020503213 |
:100290003A253469200050333A25346920205034FF |
:1002A0003A25346920004779726F202D2053656EFE |
:1002B000736F72004E69636B2025346920282533E3 |
:1002C000692900526F6C6C20253469202825336918 |
:1002D000290047696572202534692028253369295A |
:1002E00000414343202D2053656E736F72004E69A9 |
:1002F000636B2025346920282533692900526F6CEF |
:100300006C2025346920282533692900486F6368EB |
:1003100020253469202825336929005370616E6EC9 |
:10032000756E673A202025356900456D70662E5040 |
:100330006567656C3A253569004B6F6D7061737345 |
:1003400020202020202020005269636874756E6789 |
:100350003A2020253569004D657373776572743ACC |
:1003600020202535690053746172743A20202020C2 |
:100370002025356900506F7469313A202025336992 |
:1003800000506F7469323A202025336900506F7431 |
:1003900069333A202025336900506F7469343A205C |
:1003A0002025336900536572766F202000536574F1 |
:1003B000706F696E742020253369005374656C6C0E |
:1003C000756E673A202533690052616E67653A257C |
:1003D00033692D253369000011241FBECFEFD0E112 |
:1003E000DEBFCDBF11E0A0E0B1E0E8EDFFE502C067 |
:1003F00005900D92A039B107D9F715E0A0E9B1E059 |
:1004000001C01D92A333B107E1F70C9442020C9492 |
:100410000000FB01863008F085E0489FD0011124E0 |
:10042000AC59BF4F842F9927019724F00E94D82FF1 |
:100430000192FACF0895282FFB01863008F025E0BD |
:10044000429FD0011124AC59BF4F842F99270197A7 |
:1004500024F001900E94E02FFACFA2E0B0E0022E3B |
:100460000E94E02F0895A2E0B0E09D010E94D82FE5 |
:10047000802D863028F082E0D901082E0E94E02FDE |
:1004800099270895CFEFD0E1DEBFCDBF14B815B8DE |
:1004900097EEE92E93E0F92E8EEC9FEFE80EF91E11 |
:1004A000F7FEFACF88EEE82E83E0F82E189B02C004 |
:1004B0008BE001C08AE08093000181E887B98FEF6B |
:1004C00088B98BE184B981E085B98EE38AB9579AFE |
:1004D00087EF8BB984B7877F84BF80916000886184 |
:1004E000809360001092600080ED97E09093AA01E5 |
:1004F0008093A9011092E3011092E2011092BC04D2 |
:100500001092BB041092E5011092E4011092E701F1 |
:100510001092E601809100018A3011F4289801C000 |
:10052000289A0E941A0B0E94EA060E94EB150E946C |
:10053000100C0E94F31478941092BA0380E4809314 |
:10054000BB0385E08093BC0380E490E09F938F938E |
:100550001F921F92809100016AE00E94682F892FEC |
:1005600099279F938F93809100010E94682F99276C |
:100570009F938F9380E790E09F938F931F920E94A9 |
:10058000D9078DB79EB70B960FB6F8949EBF0FBED6 |
:100590008DBF82EA90E09F938F931F920E94D907AC |
:1005A000299A0F900F900F90C1E0D0E0DE010E94D9 |
:1005B000D82F802D8E3329F183EC90E09F938F9379 |
:1005C0001F920E94D9070E94951C10E00F900F9077 |
:1005D0000F90123011F40E940C1D4AE363EE74E098 |
:1005E000812F0E941B021F5F163098F3A2E0B0E03B |
:1005F00082E0082E0E94E02F8EE3DE01082E0E948A |
:10060000E02F0E9433024AE363EE74E00E94090285 |
:100610000E94330299279F938F9382EF90E09F93DC |
:100620008F931F920E94D9078091EB040F900F9037 |
:100630000F900F900F9080FF20C08DE091E09F936E |
:100640008F931F920E94D90788EE93E00E94110BAE |
:100650007C010E94160C0F900F900F90C7010E9412 |
:10066000400B8823D9F38AE291E09F938F931F92E6 |
:100670000E94D9070F900F900F900E9471188091DF |
:1006800000018A3011F4289801C0289A80ED97E083 |
:100690009093AA018093A90188EE93E09093B5030B |
:1006A0008093B40385E58093AF038FE291E09F933D |
:1006B0008F931F920E94D9078091EB040F900F90A7 |
:1006C0000F9082FF03C08DE391E002C089E491E0C6 |
:1006D0009F938F931F920E94D9070F900F900F90B6 |
:1006E00081E591E09F938F931F920E94D9070E940A |
:1006F000591088E893E190937F0180937E010F90D9 |
:100700000F900F908091AD01882309F451C0109291 |
:10071000AD010E94CB1F0E944E1C209100012A3087 |
:1007200011F4289801C0289A80910101882319F0BA |
:100730008150809301018091E801882329F0809104 |
:10074000E80181508093E80180917E0190917F01C2 |
:10075000892B01F585E090E090937F0180937E01E5 |
:100760000E940D1580910301909104018F5F9F4FAE |
:10077000F9F48091E1018823D9F080E197E2909328 |
:10078000AA018093A90180E890E0909304018093EE |
:1007900003010EC080917E0190917F01019790939B |
:1007A0007F0180937E012A3011F4289801C0289A95 |
:1007B0000E9408070E942606C7010E94400B88235A |
:1007C00009F4A0CF8091FB04282F332780910D01DD |
:1007D00090910E01821793079CF4809103019091F0 |
:1007E00004018F5F9F4F61F480E797E19093AA0126 |
:1007F0008093A90180E093E090930401809303012A |
:1008000084E690E00E94110B7C017CCF1F920F9236 |
:100810000FB60F9211248F939F93EF93FF938091C4 |
:1008200002018823E1F480919E0190919F0101963D |
:1008300090939F0180939E01FC01EF57FD4FE08153 |
:10084000ED3019F08639910539F410929F0110921C |
:100850009E0181E080930201E093C60004C01092E3 |
:100860009F0110929E01FF91EF919F918F910F90A8 |
:100870000FBE0F901F9018951F920F920FB60F92F8 |
:1008800011242F933F934F935F938F939F93AF9335 |
:10089000BF93EF93FF9390E08091C60080939901FE |
:1008A0005091A401563910F09093A50180919901BF |
:1008B0008D3009F05FC08091A501823009F05AC0E7 |
:1008C0009093A501852F99278C539C4FFC0132975B |
:1008D00040812091A0013091A101241B3109DC014C |
:1008E00011978C91281B3109C9019F709093A10128 |
:1008F0008093A00146E0969587954A95E1F7982F59 |
:10090000935C9093A2012F733070235C2093A3011A |
:100910008081981729F48C91281711F491E006C072 |
:1009200090E0809196018F5F80939601809198016D |
:10093000882309F06EC0992309F46BC081E080938D |
:10094000980150939501E52FFF27EC53FC4F8DE064 |
:1009500080838091C603823509F05BC088E190E016 |
:100960002CE00FB6F894A895809360000FBE2093FA |
:1009700060004FC02091A501822F992781309105F9 |
:10098000F9F0823091051CF4892B21F040C00297C8 |
:1009900011F13DC080919901833239F48091980121 |
:1009A000882319F481E08093A501809199018093B7 |
:1009B000C40381E08093A40180919901992722C00A |
:1009C0002F5F2093A501E52FFF27EC53FC4F80916B |
:1009D0009901808309C0E52FFF27EC53FC4F8091DC |
:1009E00099018083563920F45F5F5093A40102C0BF |
:1009F0001092A501209199018091A0019091A101EF |
:100A0000820F911D9093A1018093A00102C01092CA |
:100A1000A501FF91EF91BF91AF919F918F915F9150 |
:100A20004F913F912F910F900FBE0F901F901895EF |
:100A3000AC01A0E0B0E09D01A817B90748F4E1E8D7 |
:100A4000F2E08191280F311D1196A417B507C8F364 |
:100A50003F70FD01EF57FD4FC90156E09695879510 |
:100A60005A95E1F7835C80831196FD01EF57FD4FA6 |
:100A70002F733070822F835C8083AE57BD4F8DE023 |
:100A80008C9310920201809181028093C600089598 |
:100A90001F93CF93DF93382FEA01722F10E083E288 |
:100AA000809381026093820230938302A3E0B0E0DE |
:100AB000772309F458C0772311F4972F07C0FE015C |
:100AC000E10FF11D1F5F9081715011F4472F0EC08F |
:100AD000FE01E10FF11D1F5F4081715039F0FE01F1 |
:100AE000E10FF11D1F5F6081715001C0672FFD0193 |
:100AF000EF57FD4F892F86958695835C80831196ED |
:100B0000FD01EF57FD4F892F99278370907024E0E6 |
:100B1000880F991F2A95E1F755279A0194E0369599 |
:100B200027959A95E1F7822B835C80831196FD01CE |
:100B3000EF57FD4F4F705070440F551F440F551F16 |
:100B4000862F992726E0969587952A95E1F7842B9D |
:100B5000835C80831196FD01EF57FD4F6F73635CDB |
:100B600060831196A5CFCD010E941805DF91CF912A |
:100B70001F9108951F93CF93DF93EC0110E066233C |
:100B800009F460C0A22FBB271297E42FFF27EC5374 |
:100B9000FC4F30813D534F5FE42FFF27EC53FC4F58 |
:100BA00050815D534F5FE42FFF27EC53FC4F708162 |
:100BB0007D534F5FE42FFF27EC53FC4FE081ED5353 |
:100BC0004F5F842F9927A817B907E4F1832F99273E |
:100BD000880F991F880F991F352F32953F70382B3A |
:100BE000852F99278F709070F4E0880F991FFA95E0 |
:100BF000E1F7572F56955695582B872F99278370D5 |
:100C0000907076E0880F991F7A95E1F78E2B6150EE |
:100C10006F3FC1F0FE01E10FF11D30831F5F615096 |
:100C20006F3F81F0FE01E10FF11D50831F5F6150A6 |
:100C30006F3F41F0FE01E10FF11D80831F5F6623CE |
:100C400009F0A3CFDF91CF911F910895CF93DF9348 |
:100C5000CDB7DEB72B970FB6F894DEBF0FBECDBF72 |
:100C600080919801882309F49AC08FEF8093010145 |
:100C70008091C6039927813791059CF48C369105A4 |
:100C80000CF06EC08736910509F444C08836910592 |
:100C900024F48336910599F080C088369105D9F007 |
:100CA0007CC08437910549F18537910524F481375B |
:100CB0009105A1F172C08637910541F16EC0209176 |
:100CC000950143E06BE08FEA93E00E94BA0581E072 |
:100CD00080939B0162C02091950143E062E0CE01C8 |
:100CE0000A960E94BA058091CB019A85892B809340 |
:100CF000CB0181E080939C0150C02091950143E09D |
:100D000064E080E991E00E94BA0547C081E08093E9 |
:100D10009A0143C081E080939D013FC020919501DD |
:100D200043E062E0CE010A960E94BA058A858F3FB1 |
:100D300061F0863010F085E08A874AE363EE74E064 |
:100D40008A850E9409028A8502C00E9433022AE332 |
:100D500043EE54E060918002855B0E9448051DC00F |
:100D60002091950143E06AE383EE94E00E94BA0586 |
:100D70008091C6034AE363EE74E08B560E941B0227 |
:100D8000A2E0B0E08091C6038B56082E0E94E02FAF |
:100D90000E94330299270E94B216109298012B9656 |
:100DA0000FB6F894DEBF0FBECDBFDF91CF9108958F |
:100DB000CF93C82F8A3019F48DE00E94D806809115 |
:100DC000C00085FFFCCFC093C60080E090E0CF91CB |
:100DD0000895089588E18093C1008091C0008260E9 |
:100DE0008093C0008091C10080688093C100809191 |
:100DF000C10080648093C1008AE28093C40088ECC3 |
:100E000090E00E94110B9093AE038093AD03089580 |
:100E100080910201882309F471C080919D0188238B |
:100E200071F080910201882351F02BE04FEA53E0EA |
:100E30006091800287E40E94480510929D01809194 |
:100E4000AD039091AE030E94400B882321F4809162 |
:100E50009B018823B1F080910201882391F022E464 |
:100E60004AE554E06091800284E40E9448051092B3 |
:100E70009B0184EF91E00E94110B9093AE0380934D |
:100E8000AD0380919C01882339F180910201882370 |
:100E900019F10E94621010929C013091A601832FDB |
:100EA0008F5F8093A601843059F426E147EB54E02C |
:100EB00060E084E30E9448058FEF8093A6010CC098 |
:100EC00024E1829FC0011124815F9E4FAC0160E04C |
:100ED000832F8F5C0E94480580919A01882371F0CE |
:100EE00080910201882351F02AE04AEB53E060919F |
:100EF000800286E50E94480510929A010895982F75 |
:100F000080919C04813069F48091CC01E82FFF2707 |
:100F1000E15FFE4F90838F5F8093CC0121E030E052 |
:100F200005C0892F0E94D806282F3327C9010895AC |
:100F30000F931F93CF93DF938C01EB01672B39F055 |
:100F4000F80181918F010E947F072197C9F7DF91F6 |
:100F5000CF911F910F9108950F931F93CF93DF931C |
:100F60008C01EB01672B41F0F8010F5F1F4F84915B |
:100F70000E947F072197C1F7DF91CF911F910F91B9 |
:100F80000895CF93C82F181634F480E20E947F078B |
:100F9000C1501C16D4F3CF910895CF93C82F1816C3 |
:100FA00034F480E30E947F07C1501C16D4F3CF9124 |
:100FB00008952F923F924F925F926F927F928F92FD |
:100FC0009F92AF92BF92CF92DF92EF92FF920F93D8 |
:100FD0001F93CF93DF93CDB7DEB7E0970FB6F894AA |
:100FE000DEBF0FBECDBF26968FAD26972896EEADFD |
:100FF000FFAD28971CA61DA61EA61FA680939C04C5 |
:10100000A8E46A2E712C6C0E7D1E5F01C50105C01F |
:10101000053239F00894A11CB11CF501049100239C |
:10102000B9F7B501681B790B11F00E94AC070023DA |
:1010300009F430C20894A11CB11C552458AA252CCF |
:101040001FEF59A6F5010894A11CB11C04910537A6 |
:1010500021F0802F80628837F1F450FE0EC0F3013A |
:1010600024E030E0620E731E80819181A281B38101 |
:101070008CA79DA7AEA7BFA70EC0F301A2E0B0E06A |
:101080006A0E7B1E808191819C01442755272CA7E5 |
:101090003DA74EA75FA7003221F489A5882391F6CA |
:1010A0001BC0033211F438E081C00A3211F00D3256 |
:1010B00089F40A3251F4F30142E050E0640E751EE7 |
:1010C000208022200CF0BECF219450E1552A8FEDD4 |
:1010D0005822B8CF0B3211F409A7B4CF0E32C1F5A4 |
:1010E000F5010894A11CB11C04910A3279F4F301B2 |
:1010F000A2E0B0E06A0E7B1E60817181BFEF6F3F9E |
:101100007B0714F46FEF7FEF162F9CCF60E070E049 |
:10111000802F80538A30A0F4CB01F3E0880F991F11 |
:10112000FA95E1F7860F971F680F791F600F711D01 |
:1011300060537040F5010894A11CB11C0491E8CFE4 |
:10114000EFEF6F3F7E0714F46FEF7FEF162F7FCF27 |
:10115000003329F454FC76CFF0E25F2A73CF802F5E |
:1011600081538930D8F460E070E0CB01E3E0880F70 |
:10117000991FEA95E1F7860F971F680F791F600F97 |
:10118000711D60537040F5010894A11CB11C0491BD |
:10119000802F80538A3048F3262E59CF083619F411 |
:1011A00024E0522A4FCF0C3619F431E0532A4ACFAB |
:1011B000033661F44E010894811C911CF30142E056 |
:1011C00050E0640E751E808189831BC1043421F0B8 |
:1011D000043611F00936B1F5043411F451E0552A02 |
:1011E00050FE0AC0F30184E090E0680E791E208171 |
:1011F0003181428153810CC0F30142E050E0640E22 |
:10120000751E808191819C01442737FD4095542FA4 |
:101210002CA73DA74EA75FA78CA59DA5AEA5BFA5F2 |
:10122000B7FF0DC0B095A095909581959F4FAF4F9A |
:10123000BF4F8CA79DA7AEA7BFA78DE289A77AE075 |
:10124000472E7BC00F3411F00F3639F40F3411F4F0 |
:1012500091E0592A68E0462E6FC00037A1F4F301EF |
:10126000A2E0B0E06A0E7B1E808191819C01442740 |
:1012700055272CA73DA74EA75FA750E1452E30E488 |
:10128000532A08E759C00337C1F5F30142E050E0A3 |
:10129000640E751E808091808114910489F44E0142 |
:1012A0000894811C911C88E289838EE6F401818375 |
:1012B00085E78B838CE68C838D8389E28E831F8206 |
:1012C00017FD13C0812F992787FD9095AC0160E031 |
:1012D00070E0C4010E94D42D009729F0D82ED818B0 |
:1012E0001D150CF090C0D12E8EC0F401019000208D |
:1012F000E9F73197DE2ED81886C0053511F005378D |
:1013000039F4053511F4F1E05F2A4AE0442E14C0A7 |
:10131000083519F0083709F06CC030E1432E53FE50 |
:101320000BC02CA53DA54EA55FA521153105410596 |
:10133000510511F030E4532A19A618AB17FD02C06D |
:101340004FED542229E2822E912C8C0E9D1E8CA5ED |
:101350009DA5AEA5BFA50097A105B10521F498A94B |
:10136000992309F43FC0C42CDD24EE24FF24332448 |
:101370002CA53DA54EA55FA52C153D054E055F0589 |
:1013800010F091E0392E6CA57DA58EA59FA5A70133 |
:1013900096010E949B2FDC01CB01182F8A3010F49C |
:1013A000105D04C0195A083509F41F7DD4011E933D |
:1013B0004D016CA57DA58EA59FA5A70196010E9454 |
:1013C0009B2F2CA73DA74EA75FA7332081F6B8E03F |
:1013D0004B1641F453FE06C0103321F080E3F401B4 |
:1013E00082934F01CE010196D82ED818F8E2DF0E75 |
:1013F0000BC0002309F44EC04E010894811C911CBF |
:10140000098381E0D82E19A61D2DC8A8CD18C7FCC8 |
:10141000CC2489A5882311F01F5F02C056FC1E5FF3 |
:101420001C0DE52CFF24C70180739070892B21F4DB |
:10143000822D811B0E94C10789A5882329F061E0C4 |
:1014400070E0CE01899609C0E6FE09C080E38AA754 |
:101450000BA762E070E0CE018A960E949807C70150 |
:1014600080739070809721F4822D811B0E94CD079C |
:101470008C2D0E94CD078D2D992787FD9095BC015D |
:10148000C4010E949807E4FEC1CD822D811B0E94F9 |
:10149000C107BCCDE0960FB6F894DEBF0FBECDBF3E |
:1014A000DF91CF911F910F91FF90EF90DF90CF9040 |
:1014B000BF90AF909F908F907F906F905F904F9074 |
:1014C0003F902F9008951F920F920FB60F92112404 |
:1014D0002F933F935F936F937F938F939F93AF93DC |
:1014E000BF938091B00181508093B0018F3FB9F4D8 |
:1014F00089E08093B001809105018F5F81708093B6 |
:101500000501882319F481E08093AD018091AE013B |
:101510009091AF0101969093AF018093AE018091BD |
:10152000A9019091AA010297C8F08091A901909118 |
:10153000AA0101979093AA018093A9018091A90122 |
:101540009091AA01209103013091040182239323F9 |
:10155000892B11F021E009C020E007C020E08FEFC7 |
:101560009FEF909304018093030180910001222357 |
:1015700031F08A3011F45A9A07C0479A05C08A3070 |
:1015800011F45A9801C047988091EB0483FF3BC047 |
:10159000349B0AC08091AB019091AC01019690936D |
:1015A000AC018093AB012FC08091AB019091AC0155 |
:1015B000892B79F08091AB019091AC01805A9F40CA |
:1015C00040F48091AB019091AC019093F80180932D |
:1015D000F7018091F7019091F8012091F501309188 |
:1015E000F601821B930B845E9D4F68E671E00E94BA |
:1015F000882F845B90409093F4018093F3011092C4 |
:10160000AC011092AB01BF91AF919F918F917F91EF |
:101610006F915F913F912F910F900FBE0F901F9090 |
:1016200018952091AE013091AF01280F391FC901E3 |
:10163000019608958AE090E00E94110B9093B20108 |
:101640008093B10182E085BD83EA84BD17BC88E741 |
:1016500088BD96E096BD83EC8093B0009093B10076 |
:101660008091700082608093700080916E00816034 |
:1016700080936E008AE08093B3001092B2000895C8 |
:101680002091AE013091AF01821B930B892F9927D6 |
:101690008695807490700895CF93DF930E94110B0C |
:1016A000EC01CE010E94400B8823D9F3DF91CF914A |
:1016B00008951F920F920FB60F9211242F933F930C |
:1016C0004F935F936F937F938F939F93AF93BF934A |
:1016D000CF93DF93EF93FF93809106018150809326 |
:1016E00006018F3F09F085C083E88093B0008091A8 |
:1016F0006C01C82FDD27D093A801C093A70180916A |
:101700000C056091050580FF2AC077278827992757 |
:101710002091250230912602409127025091280203 |
:1017200057FF04C021583F4F4F4F5F4FA7E05595DB |
:10173000479537952795AA95D1F70E94492F97FF8E |
:1017400004C061507E4F8F4F9F4FF9E0959587956C |
:1017500077956795FA95D1F7C60FD71F29C07727D8 |
:10176000882799272091250230912602409127024F |
:101770005091280257FF04C021583F4F4F4F5F4FF1 |
:10178000E7E05595479537952795EA95D1F70E945B |
:10179000492F97FF04C061507E4F8F4F9F4F39E014 |
:1017A00095958795779567953A95D1F7C61BD70B91 |
:1017B000D093A801C093A701809106059927209195 |
:1017C000A7013091A8012817390734F08091070547 |
:1017D00099278217930724F49093A8018093A70177 |
:1017E0008091A7018093B300809108058093060142 |
:1017F00004C083E08093B0005F98FF91EF91DF9188 |
:10180000CF91BF91AF919F918F917F916F915F9198 |
:101810004F913F912F910F900FBE0F901F901895F1 |
:1018200010927C008FEE80937A0008950F931F939F |
:10183000CF93DF9303E010E0D8010E94D82F802DD2 |
:10184000C82FDD27C531D10508F02A97C7BD84E62A |
:1018500090E00E944C0B8091070190910801825505 |
:10186000934010F4C0E0D0E0CA3FD105C0F4C7BD3A |
:1018700082E390E00E944C0B85E591E09F938F936B |
:101880001F920E94D90780910701909108010F9043 |
:101890000F900F908458934010F02196E5CFD80117 |
:1018A0000C2E0E94E02FC093AA048CE291E00E94CB |
:1018B0004C0BDF91CF911F910F9108951F920F92C2 |
:1018C0000FB60F921124EF92FF920F931F932F9355 |
:1018D0003F934F935F936F937F938F939F93AF93B8 |
:1018E000BF93CF93DF93EF93FF9310927A00809191 |
:1018F000CA01682F77278F5F8093CA016330710513 |
:1019000009F4BCC1643071055CF46130710509F4FF |
:1019100071C0623071050CF00FC1672B91F0A7C345 |
:101920006530710509F4EAC1653071050CF4C1C177 |
:101930006630710509F408C26730710509F417C3F0 |
:1019400096C3609133027091340280917800909137 |
:101950007900681B790B809100018A3011F0660FC5 |
:10196000771F8091C3019091C401860F971F9093B8 |
:10197000C4018093C3018091BA018F5F8093BA0143 |
:101980009B01442737FD4095542F8091010290918F |
:101990000202A0910302B0910402820F931FA41FC0 |
:1019A000B51F8093010290930202A0930302B093AB |
:1019B00004028091FD019091FE01A091FF01B09180 |
:1019C0000002820F931FA41FB51F8093FD01909307 |
:1019D000FE01A093FF01B093000281E08093C90152 |
:1019E0008091B3019091B40101969093B4018093DA |
:1019F000B30141C360917800709179008091350204 |
:101A000090913602681B790B809100018A3011F0A9 |
:101A1000660F771F9B01442737FD4095542F809117 |
:101A2000090290910A02A0910B02B0910C02820F60 |
:101A3000931FA41FB51F8093090290930A02A093DD |
:101A40000B02B0930C028091050290910602A091C6 |
:101A50000702B0910802820F931FA41FB51F809345 |
:101A6000050290930602A0930702B09308028091AA |
:101A7000090290910A02A0910B02B0910C02815FC1 |
:101A80009A4BA440B04064F080E393E9ABEFBFEF22 |
:101A90008093090290930A02A0930B02B0930C0268 |
:101AA0008091090290910A02A0910B02B0910C0260 |
:101AB00080519544AB4FBF4F64F480ED9CE6A4E0A9 |
:101AC000B0E08093090290930A02A0930B02B093B6 |
:101AD0000C0280917800909179000F9710F468E1E2 |
:101AE0007CEF8091780090917900079710F460E383 |
:101AF00078EF8091780090917900835F934010F0A7 |
:101B000068EE73E080917800909179008A5F93404D |
:101B100010F060ED77E08091C5019091C601860FCD |
:101B2000971F9093C6018093C5018091BB018F5F81 |
:101B30008093BB0182E0DFC06091780070917900F2 |
:101B40008091370290913802681B790B80910001D7 |
:101B50008A3011F0660F771F9B01442737FD4095AF |
:101B6000542F8091110290911202A0911302B09112 |
:101B70001402820F931FA41FB51F8093110290932C |
:101B80001202A0931302B093140280910D0290915F |
:101B90000E02A0910F02B0911002820F931FA41F9A |
:101BA000B51F80930D0290930E02A0930F02B09385 |
:101BB00010028091110290911202A0911302B09133 |
:101BC0001402815F9A4BA440B04064F080E393E933 |
:101BD000ABEFBFEF8093110290931202A093130218 |
:101BE000B09314028091110290911202A0911302FD |
:101BF000B091140280519544AB4FBF4F64F480ED17 |
:101C00009CE6A4E0B0E08093110290931202A093AE |
:101C10001302B093140280917800909179000F978D |
:101C200010F468E17CEF809178009091790007973B |
:101C300010F460E378EF8091780090917900835FF1 |
:101C4000934010F068EE73E08091780090917900F5 |
:101C50008A5F934010F060ED77E08091C70190912A |
:101C6000C801860F971F9093C8018093C701809188 |
:101C7000BC018F5F8093BC0184E03DC080910D0169 |
:101C800090910E019C01220F331F280F391F809164 |
:101C90007800909179000E94742F260F371F369597 |
:101CA00027953695279530930E0120930D0186E0F8 |
:101CB00022C080912F0290913002209178003091C3 |
:101CC0007900821B930B90939E0480939D048091D6 |
:101CD000C1019091C20120919D0430919E04820F18 |
:101CE000931F9093C2018093C1018091B8018F5FCF |
:101CF0008093B80187E08093C901BDC180917800CD |
:101D0000909179002091310230913202821B930B25 |
:101D10009093A9048093A8048091BF019091C00181 |
:101D20002091A8043091A904820F931F9093C001C1 |
:101D30008093BF018091B9018F5F8093B90185E0E5 |
:101D40008093C90186E010C180917800909179005C |
:101D5000AA2797FDA095BA2FBC01CD010E94872E1E |
:101D60007B018C0180912B0290912C02A0912D027D |
:101D7000B0912E029C01AD01C801B7010E94E12D76 |
:101D8000DC01CB01BC01CD010E946A2EDC01CB013C |
:101D90009093BE018093BD0180919D0490919E041B |
:101DA00080919D0490919E0497FF03C0909581952A |
:101DB0009F4F97FD0396AC015595479555954795CF |
:101DC0008091A8049091A9048091A8049091A904FD |
:101DD00097FF03C0909581959F4F9C0197FF02C08C |
:101DE0002D5F3F4F3595279535952795240F351F46 |
:101DF0008091BD019091BE01820F931F9093BE010F |
:101E00008093BD018091BD019091BE01029724F1A4 |
:101E100080912B0290912C02A0912D02B0912E0264 |
:101E200020E030E048E454E4BC01CD010E94912E52 |
:101E300088230CF044C080912B0290912C02A09139 |
:101E40002D02B0912E022AE037ED43EA5CE3BC019B |
:101E5000CD010E94E22D29C08091BD019091BE016B |
:101E60008F5F9F4F64F580912B0290912C02A0917F |
:101E70002D02B0912E0220E030E046E154E4BC0196 |
:101E8000CD010E94942E1816D4F480912B029091CB |
:101E90002C02A0912D02B0912E022AE037ED43EAE8 |
:101EA0005CE3BC01CD010E94E12DDC01CB018093FC |
:101EB0002B0290932C02A0932D02B0932E0281E06E |
:101EC0008093B70180917800909179009093A0045D |
:101ED00080939F048091BD019091BE019C01442795 |
:101EE00037FD4095542F8091F9019091FA01A0910E |
:101EF000FB01B091FC01820F931FA41FB51F8093BB |
:101F0000F9019093FA01A093FB01B093FC01209199 |
:101F1000F9013091FA014091FB015091FC0157FF0A |
:101F200004C021503C4F4F4F5F4F7AE05595479585 |
:101F3000379527957A95D1F78091F9019091FA011B |
:101F4000A091FB01B091FC01821B930BA40BB50B7C |
:101F50008093F9019093FA01A093FB01B093FC01E7 |
:101F600083E08093C90187E08093CA0184C0809197 |
:101F7000AD049091AE042091780030917900820FE9 |
:101F8000931F9093AE048093AD048091A5048F5F5E |
:101F90008093A5048091A504853008F468C08091E1 |
:101FA0007800909179009093080180930701109236 |
:101FB000A5048091A1049091A2042091AD043091D8 |
:101FC000AE04821B930B2091DF013091E001821B54 |
:101FD000930B9093B6018093B5018091AD049091DD |
:101FE000AE04EC01EE27D7FDE095FE2F209109010C |
:101FF00030910A0140910B0150910C01DA01C901A5 |
:10200000880F991FAA1FBB1F820F931FA41FB51F04 |
:10201000C80FD91FEA1FFB1FF7FF03C02396E11D5E |
:10202000F11D82E0F595E795D795C7958A95D1F78B |
:10203000C0930901D0930A01E0930B01F0930C01C6 |
:102040008091090190910A01A0910B01B0910C01BE |
:102050009C018091A1049091A204821B930B909308 |
:10206000E0018093DF011092AE041092AD04109253 |
:10207000C9011092CA018091C90180937C008FEE42 |
:1020800080937A00FF91EF91DF91CF91BF91AF9153 |
:102090009F918F917F916F915F914F913F912F9180 |
:1020A0001F910F91FF90EF900F900FBE0F901F9018 |
:1020B000189590E2EFE0F1E08FE49193815087FF73 |
:1020C000FCCF08951F93CF93DF938091CB0180FFC6 |
:1020D0000CC08091CF01882311F0815002C0809103 |
:1020E00069018093CF010E9459108091CB0181FF3B |
:1020F00007C08091CF018F5F8093CF010E9459105C |
:102100008091CB01992780FF04C081FF02C010920B |
:10211000CF0181E18093CC018091CF0199279F93DA |
:102120008F9387E591E09F938F9311E01F930E9417 |
:10213000D9070F900F900F900F900F908091CF01C3 |
:10214000C82FDD27C530D10509F459C2C630D105E5 |
:10215000ACF4C230D10509F4DEC0C330D10534F48B |
:10216000209719F1219709F46EC032C4C330D1050C |
:1021700009F43FC1249709F4A7C12AC4C830D10586 |
:1021800009F43EC3C930D10544F4C630D10509F481 |
:10219000A5C2279709F414C31BC4C930D10509F49B |
:1021A00071C32A9709F4C2C313C41092CC018CE501 |
:1021B00091E09F938F931F930E94D90784E18093AE |
:1021C000CC010F900F900F908FE390E09F938F932F |
:1021D000DF93CF93809100016AE00E94682F892FDE |
:1021E00099279F938F93809100010E94682F9927D0 |
:1021F0009F938F938EE691E09F938F931F930E94FE |
:10220000D90788E28093CC018DB79EB70B960FB6A5 |
:10221000F8949EBF0FBE8DBF0E94330299279F93F3 |
:102220008F9381E891E09F938F931F930E94D9072A |
:102230008CE38093CC010F900F900F900F900F9034 |
:102240008EE891E05FC08091EB0480FF49C010925E |
:10225000CC018091DF019091E0019F938F938EE9F3 |
:1022600091E09F938F931F930E94D90784E18093FD |
:10227000CC010F900F900F900F900F908091DD0187 |
:102280009091DE019F938F938DEA91E09F938F93BE |
:102290001F930E94D90788E28093CC010F900F9082 |
:1022A0000F900F900F9080910701909108019F93DC |
:1022B0008F938CEB91E09F938F931F930E94D9078C |
:1022C0008CE38093CC010F900F900F900F900F90A4 |
:1022D0008091AA0499279F938F938BEC91E01BC365 |
:1022E00084E18093CC018AED91E09F938F931F93BB |
:1022F0000E94D90788E28093CC010F900F900F9035 |
:1023000081EE91E09F938F931F930E94D9070F90C6 |
:102310000F900F9062C31092CC018FEE91E09F93CB |
:102320008F931F930E94D90784E18093CC010F9073 |
:102330000F900F908091250290912602A091270284 |
:10234000B0912802B7FF04C081509C4FAF4FBF4FE0 |
:102350003AE0B595A795979587953A95D1F7BF93AC |
:10236000AF939F938F9389EF91E09F938F931F93E8 |
:102370000E94D90788E28093CC018DB79EB707965B |
:102380000FB6F8949EBF0FBE8DBF80911D02909135 |
:102390001E02A0911F02B0912002B7FF04C081501D |
:1023A0009C4FAF4FBF4F2AE0B595A795979587955E |
:1023B0002A95D1F7BF93AF939F938F9388E092E0D4 |
:1023C0009F938F931F930E94D9078CE38093CC0136 |
:1023D0008DB79EB707960FB6F8949EBF0FBE8DBF00 |
:1023E0008091F7019091F8019F938F9387E192E09C |
:1023F00092C21092CC018091BB049091BC049F9337 |
:102400008F938091B9049091BA049F938F9386E241 |
:1024100092E09F938F931F930E94D90784E180934A |
:10242000CC018DB79EB707960FB6F8949EBF0FBE2E |
:102430008DBF8091BF049091C0049F938F93809132 |
:10244000BD049091BE049F938F9386E392E09F9387 |
:102450008F931F930E94D90788E28093CC018DB798 |
:102460009EB707960FB6F8949EBF0FBE8DBF8091A2 |
:10247000C3049091C4049F938F938091C104909161 |
:10248000C2049F938F9386E492E09F938F931F9350 |
:102490000E94D9078CE38093CC018DB79EB7079635 |
:1024A0000FB6F8949EBF0FBE8DBF8091C704909168 |
:1024B000C8049F938F938091C5049091C6049F9305 |
:1024C0008F9386E592E076C21092CC018091E4046D |
:1024D000E82FFF27EE0FFF1FE954FB4F808191810A |
:1024E0009F938F938091E304E82FFF27EE0FFF1F48 |
:1024F000E954FB4F808191819F938F9386E692E010 |
:102500009F938F931F930E94D90784E18093CC01FE |
:102510008DB79EB707960FB6F8949EBF0FBE8DBFBE |
:102520008091E604E82FFF27EE0FFF1FE954FB4FD1 |
:10253000808191819F938F938091E504E82FFF27FD |
:10254000EE0FFF1FE954FB4F808191819F938F9382 |
:1025500086E792E09F938F931F930E94D90788E2AA |
:102560008093CC018DB79EB707960FB6F8949EBFA7 |
:102570000FBE8DBF8091E804E82FFF27EE0FFF1FED |
:10258000E954FB4F808191819F938F938091E70461 |
:10259000E82FFF27EE0FFF1FE954FB4F8081918149 |
:1025A0009F938F9386E892E09F938F931F930E944F |
:1025B000D9078CE38093CC018DB79EB707960FB6F1 |
:1025C000F8949EBF0FBE8DBF8091EA04E82FFF27CD |
:1025D000EE0FFF1FE954FB4F808191819F938F93F2 |
:1025E0008091E904E82FFF27EE0FFF1FE954FB4F0E |
:1025F000808191819F938F9386E992E0DBC1109255 |
:10260000CC0186EA92E09F938F931F930E94D90793 |
:1026100084E18093CC010F900F900F90809137024E |
:10262000909138029F938F938091BC01282F33277C |
:102630008091C7019091C801B9010E94882F7F93B2 |
:102640006F9384EB92E09F938F931F930E94D9071F |
:1026500088E28093CC018DB79EB707960FB6F894A9 |
:102660009EBF0FBE8DBF80913502909136029F9321 |
:102670008F938091BB01282F33278091C5019091C2 |
:10268000C601B9010E94882F7F936F9383EC92E07B |
:102690009F938F931F930E94D9078CE38093CC0163 |
:1026A0008DB79EB707960FB6F8949EBF0FBE8DBF2D |
:1026B00080913302909134029F938F938091BA015D |
:1026C000282F33278091C3019091C401B9010E9442 |
:1026D000882F7F936F9382ED92E06CC11092CC01B2 |
:1026E00081EE92E09F938F931F930E94D90784E11C |
:1026F0008093CC010F900F900F90809131029091B8 |
:1027000032029F938F938091B901282F33278091B4 |
:10271000BF019091C001B9010E94882F7F936F93F0 |
:102720008EEE92E09F938F931F930E94D90788E2C9 |
:102730008093CC018DB79EB707960FB6F8949EBFD5 |
:102740000FBE8DBF80912F02909130029F938F9387 |
:102750008091B801282F33278091C1019091C20147 |
:10276000B9010E94882F7F936F938DEF92E09F9322 |
:102770008F931F930E94D9078CE38093CC018DB770 |
:102780009EB707960FB6F8949EBF0FBE8DBF80917F |
:102790002B0290912C02A0912D02B0912E02BC012F |
:1027A000CD010E946A2EDC01CB019F938F93809113 |
:1027B0009F049091A0049F938F938CE093E0FAC0C4 |
:1027C00084E18093CC0180910D0190910E019F9343 |
:1027D0008F938BE193E09F938F931F930E94D90770 |
:1027E00088E28093CC010F900F900F900F900F9084 |
:1027F0008091E80199279F938F938AE293E08BC0A1 |
:102800001092CC0189E393E09F938F931F930E94D2 |
:10281000D90784E18093CC010F900F900F908091A5 |
:10282000F3019091F4019F938F9388E493E09F9339 |
:102830008F931F930E94D90788E28093CC010F9059 |
:102840000F900F900F900F908091F7019091F801E9 |
:102850009F938F9387E593E09F938F931F930E949D |
:10286000D9078CE38093CC010F900F900F900F90BD |
:102870000F908091F5019091F6019F938F9386E6DA |
:1028800093E049C01092CC018091EF019091F0014A |
:102890009F938F9385E793E09F938F931F930E945D |
:1028A000D90784E18093CC010F900F900F900F9087 |
:1028B0000F908091ED019091EE019F938F9381E8AD |
:1028C00093E09F938F931F930E94D90788E2809390 |
:1028D000CC010F900F900F900F900F908091EB0113 |
:1028E0009091EC019F938F938DE893E09F938F934A |
:1028F0001F930E94D9078CE38093CC010F900F9017 |
:102900000F900F900F908091E9019091EA019F93B1 |
:102910008F9389E993E09F938F931F930E94D90728 |
:102920000F900F900F900F900F9057C01092CC0106 |
:1029300085EA93E09F938F931F930E94D90784E1C8 |
:102940008093CC010F900F900F9080916C0199278C |
:102950009F938F938DEA93E09F938F931F930E9491 |
:10296000D90788E28093CC010F900F900F900F90C1 |
:102970000F908091A7019091A8019F938F938BEB6B |
:1029800093E09F938F931F930E94D9078CE38093CA |
:10299000CC010F900F900F900F900F908091070532 |
:1029A00099279F938F938091060599279F938F93E3 |
:1029B00089EC93E09F938F931F930E94D9078DB763 |
:1029C0009EB707960FB6F8949EBF0FBE8DBF05C089 |
:1029D0008150809369011092CF011092CB01DF9159 |
:1029E000CF911F9108951092B9008AE28093B800A8 |
:1029F000089585EA8093BC0080E090E0089584E922 |
:102A00008093BC0008951092B9008093BB0085E8C4 |
:102A10008093BC0080E090E008950E94FF14109223 |
:102A2000D2018091BB001092D10180E88093BC005C |
:102A30001092BD001092BA001092BB001092B90023 |
:102A40001092B8000E94F3140E94F91480E00E94D2 |
:102A5000031508951F920F920FB60F9211242F9312 |
:102A60003F934F935F936F937F938F939F93AF9316 |
:102A7000BF93EF93FF938091D201282F33278F5F6D |
:102A80008093D2012330310509F446C0243031054A |
:102A90004CF421303105D1F0223031057CF5232B67 |
:102AA00081F083C025303105E1F1253031050CF48A |
:102AB00041C026303105F1F12730310509F45AC003 |
:102AC00074C08091D101880F8E5A51C08091D1017C |
:102AD000282F33278F5F8093D1012130310509F4EE |
:102AE0003EC0223031051CF4232BB1F15EC02230F0 |
:102AF0003105C1F123303105C1F157C00E94FF14E7 |
:102B00008091D101843018F41092D20102C0109249 |
:102B1000D1010E94F91449C08091D001880F8D5ACB |
:102B200026C08091D001E82FFF27E155FB4F80910F |
:102B3000BB0080838091D00199278130910579F085 |
:102B4000823091051CF4892B39F02FC08230910519 |
:102B500049F0039751F029C08091700208C080911C |
:102B6000710205C08091740202C0809176020E94B9 |
:102B700003151BC09091D001E92FFF27E155FB4FB2 |
:102B80008091BB008483892F8F5F8093D001843034 |
:102B900010F01092D0010E94FF148AE090E0909310 |
:102BA0007F0180937E011092D2018091BC008068E9 |
:102BB0008093BC00FF91EF91BF91AF919F918F9156 |
:102BC0007F916F915F914F913F912F910F900FBE29 |
:102BD0000F901F90189583EC8093810080916F0077 |
:102BE000806280936F001092340210923302109230 |
:102BF0003602109235021092380210923702089570 |
:102C00001F920F920FB60F9211242F933F934F9361 |
:102C10005F936F937F938F939F93AF93BF93EF9344 |
:102C2000FF9340918600509187008091D30190914D |
:102C3000D401481B590B8091860090918700909396 |
:102C4000D4018093D301CA018D5D9540835699418B |
:102C500048F481E090E09093D6018093D5011092E2 |
:102C60006A016FC02091D5013091D6012A3031051B |
:102C70000CF067C0CA018B5F9040845B914008F004 |
:102C800043C0425D5140F901E20FF31FE954FB4F8D |
:102C900080819181BA01681B790BCB0177FF03C05A |
:102CA000909581959F4F06974CF48091E801883C60 |
:102CB00028F48091E801865F8093E801F901E20F32 |
:102CC000F31FDF01A954BB4F8D919C9111979C017B |
:102CD000220F331F280F391F240F351F37FF02C063 |
:102CE0002D5F3F4FC9019595879595958795E3533E |
:102CF000FB4F2D913C911197AC01421B530B51831B |
:102D0000408311969C938E938091D5019091D6012A |
:102D100001969093D6018093D501059711F45D9AA1 |
:102D200001C05D988091D5019091D60186309105C2 |
:102D300011F45C9A01C05C98079711F45B9A01C08A |
:102D40005B98FF91EF91BF91AF919F918F917F9190 |
:102D50006F915F914F913F912F910F900FBE0F9008 |
:102D60001F901895CF93C82FC150CF3F81F080910D |
:102D7000E101882361F484E690E09093AA018093B6 |
:102D8000A9018AEF90E00E944C0BC15080F7CF91CF |
:102D9000089510927A008091BC01882379F0809187 |
:102DA000BC01282F33278091C7019091C801B90138 |
:102DB0000E94882F7093200560931F058091BB01AE |
:102DC000882379F08091BB01282F33278091C5019A |
:102DD0009091C601B9010E94882F70931E056093DF |
:102DE0001D058091BA01882379F08091BA01282FBE |
:102DF00033278091C3019091C401B9010E94882FAB |
:102E000070932C0560932B058091B9018823E1F024 |
:102E10008091BF019091C001AA2797FDA095BA2F7C |
:102E200034E0880F991FAA1FBB1F3A95D1F7209154 |
:102E3000B901332744275527BC01CD010E94BD2F7E |
:102E400030932905209328058091B8018823E1F06B |
:102E50008091C1019091C201AA2797FDA095BA2F38 |
:102E600024E0880F991FAA1FBB1F2A95D1F7209134 |
:102E7000B801332744275527BC01CD010E94BD2F3F |
:102E800030933205209331058091B7018823A9F052 |
:102E90008091BD019091BE01AA2797FDA095BA2F00 |
:102EA0002091B701332744275527BC01CD010E944B |
:102EB000BD2F30932305209322051092C801109254 |
:102EC000C7011092BC011092C6011092C501109268 |
:102ED000BB011092C4011092C3011092BA0110926A |
:102EE000C2011092C1011092B8011092C00110925B |
:102EF000BF011092B9011092BE011092BD01109253 |
:102F0000B7018FEE80937A008091E704E82FFF27C6 |
:102F1000EE0FFF1FE954FB4F8081918182599F4F33 |
:102F20002091EF013091F001281739071CF42F5F31 |
:102F30003F4F0CC08081918182599F4F8217930728 |
:102F40004CF42115310531F0215030403093F0011F |
:102F50002093EF018091E804E82FFF27EE0FFF1F79 |
:102F6000E954FB4F8081918182599F4F2091ED015F |
:102F70003091EE01281739071CF42F5F3F4F0CC02A |
:102F80008081918182599F4F821793074CF42115BC |
:102F9000310531F0215030403093EE012093ED01A6 |
:102FA0008091E904E82FFF27EE0FFF1FE954FB4F44 |
:102FB0008081918182599F4F2091EB013091EC01EA |
:102FC000281739071CF42F5F3F4F0CC08081918177 |
:102FD00082599F4F821793074CF42115310531F028 |
:102FE000215030403093EC012093EB018091EA04B2 |
:102FF000E82FFF27EE0FFF1FE954FB4F80819181DF |
:1030000082599F4F2091E9013091EA012817390731 |
:103010001CF42F5F3F4F0CC08081918182599F4FDC |
:10302000821793074CF42115310531F021503040BF |
:103030003093EA012093E9018091EF019091F00132 |
:1030400097FF05C01092F0011092EF010AC08F3F68 |
:10305000910539F034F08FEF90E09093F001809378 |
:10306000EF018091ED019091EE0197FF05C0109264 |
:10307000EE011092ED010AC08F3F910539F034F056 |
:103080008FEF90E09093EE018093ED018091EB0142 |
:103090009091EC0197FF05C01092EC011092EB01AA |
:1030A0000AC08F3F910539F034F08FEF90E0909394 |
:1030B000EC018093EB018091E9019091EA0197FF87 |
:1030C00005C01092EA011092E90108958F3F910521 |
:1030D00039F034F08FEF90E09093EA018093E901AA |
:1030E0000895CF93DF931092320210923102109222 |
:1030F000300210922F0280E090E0A0E0B0E08093D8 |
:103100002B0290932C02A0932D02B0932E021092CA |
:103110003802109237021092360210923502109245 |
:103120003402109233020E94C91685E090E00E949A |
:10313000110BEC01CE010E94400B8823D9F30E94B1 |
:10314000C9168091EB0480FF10C080910701909117 |
:103150000801875B934038F4809107019091080142 |
:103160008E5E924010F40E94160C809100018A300D |
:1031700081F580911F059091200580911F05909108 |
:10318000200597FF03C0909581959F4F909338023B |
:103190008093370280911D0590911E0580911D0539 |
:1031A00090911E0597FF03C0909581959F4F909336 |
:1031B00036028093350280912B0590912C058091E9 |
:1031C0002B0590912C0597FF3FC0909581959F4FBF |
:1031D0003BC080911F059091200580911F05909123 |
:1031E000200597FF03C0909581959F4F97FD01960D |
:1031F00095958795909338028093370280911D05AD |
:1032000090911E0580911D0590911E0597FF03C0AA |
:10321000909581959F4F97FD0196959587959093F1 |
:1032200036028093350280912B0590912C05809178 |
:103230002B0590912C0597FF03C0909581959F4F8A |
:1032400097FD01969595879590933402809333026C |
:103250008091310590913205809131059091320530 |
:1032600097FF03C0909581959F4F97FD0F9654E06F |
:10327000959587955A95E1F79093300280932F02A8 |
:103280008091280590912905809128059091290524 |
:1032900097FF03C0909581959F4F97FD0F9644E04F |
:1032A000959587954A95E1F7909332028093310284 |
:1032B00080919F049091A004AA2797FDA095BA2F12 |
:1032C000BC01CD010E94872EDC01CB0180932B0233 |
:1032D00090932C02A0932D02B0932E021092110213 |
:1032E00010921202109213021092140210920D0208 |
:1032F00010920E0210920F02109210021092090208 |
:1033000010920A0210920B0210920C021092050207 |
:103310001092060210920702109208021092010207 |
:1033200010920202109203021092040210922005E1 |
:1033300010921F0510921E0510921D0510922C056B |
:1033400010922B058091090190910A01A0910B0127 |
:10335000B0910C019093A2048093A1041092B60145 |
:103360001092B5011092F9011092FA011092FB012E |
:103370001092FC018091F7019091F8019093F60171 |
:103380008093F5010E94AA2D82E390E09093AA0118 |
:103390008093A901DF91CF910895EF92FF920F934F |
:1033A0001F9310927A008091BC01882379F080915C |
:1033B000BC01282F33278091C7019091C801B90122 |
:1033C0000E94882F7093200560931F058091BB0198 |
:1033D000882379F08091BB01282F33278091C50184 |
:1033E0009091C601B9010E94882F70931E056093C9 |
:1033F0001D058091BA01882379F08091BA01282FA8 |
:1034000033278091C3019091C401B9010E94882F94 |
:1034100070932C0560932B058091B901882309F4E2 |
:1034200046C08091280590912905AA2797FDA0956F |
:10343000BA2F7C018D01E3E0EE0CFF1C001F111F71 |
:10344000EA95D1F7E81AF90A0A0B1B0B8091BF0124 |
:103450009091C001AA2797FDA095BA2F74E0880F1C |
:10346000991FAA1FBB1F7A95D1F72091B901332765 |
:1034700044275527BC01CD010E94BD2FE20EF31E4B |
:10348000041F151F17FF08C087E090E0A0E0B0E020 |
:10349000E80EF91E0A1F1B1F63E015950795F794A8 |
:1034A000E7946A95D1F7F0922905E092280580917A |
:1034B000B801882309F446C0809131059091320506 |
:1034C000AA2797FDA095BA2F7C018D0153E0EE0C41 |
:1034D000FF1C001F111F5A95D1F7E81AF90A0A0BB1 |
:1034E0001B0B8091C1019091C201AA2797FDA09565 |
:1034F000BA2F44E0880F991FAA1FBB1F4A95D1F726 |
:103500002091B801332744275527BC01CD010E94E3 |
:10351000BD2FE20EF31E041F151F17FF08C087E022 |
:1035200090E0A0E0B0E0E80EF91E0A1F1B1F33E098 |
:1035300015950795F794E7943A95D1F7F0923205EF |
:10354000E09231058091B701882309F43FC0809152 |
:10355000220590912305AA2797FDA095BA2F7C01FB |
:103560008D0123E0EE0CFF1C001F111F2A95D1F7DF |
:10357000E81AF90A0A0B1B0B8091BD019091BE015C |
:10358000AA2797FDA095BA2F2091B701332744278A |
:103590005527BC01CD010E94BD2FE20EF31E041F72 |
:1035A000151F17FF08C087E090E0A0E0B0E0E80E2C |
:1035B000F91E0A1F1B1FF3E015950795F794E79472 |
:1035C000FA95D1F7F0922305E09222051092C801F6 |
:1035D0001092C7011092BC011092C6011092C50151 |
:1035E0001092BB011092C4011092C3011092BA0153 |
:1035F0001092C2011092C1011092B8011092C00144 |
:103600001092BF011092B9011092BE011092BD013B |
:103610001092B7018091010290910202A0910302E1 |
:10362000B09104028093150290931602A0931702A2 |
:10363000B09318028091110290911202A09113028E |
:10364000B09114028093250290932602A093270242 |
:10365000B09328028091090290910A02A0910B0276 |
:10366000B0910C0280931D0290931E02A0931F0242 |
:10367000B093200280910D0290910E02A0910F0252 |
:10368000B09110028093210290932202A093230212 |
:10369000B09324028091050290910602A091070246 |
:1036A000B09108028093190290931A02A0931B0212 |
:1036B000B0931C028FEE80937A008091E704E82F8C |
:1036C000FF27EE0FFF1FE954FB4F80819181825944 |
:1036D0009F4F2091EF013091F001281739071CF41A |
:1036E0002F5F3F4F0CC08081918182599F4F82177D |
:1036F00093074CF42115310531F0215030403093BF |
:10370000F0012093EF018091E804E82FFF27EE0FEE |
:10371000FF1FE954FB4F8081918182599F4F209177 |
:10372000ED013091EE01281739071CF42F5F3F4F50 |
:103730000CC08081918182599F4F821793074CF46E |
:103740002115310531F0215030403093EE012093A6 |
:10375000ED018091E904E82FFF27EE0FFF1FE954E8 |
:10376000FB4F8081918182599F4F2091EB013091D5 |
:10377000EC01281739071CF42F5F3F4F0CC08081E4 |
:10378000918182599F4F821793074CF4211531057F |
:1037900031F0215030403093EC012093EB018091C7 |
:1037A000EA04E82FFF27EE0FFF1FE954FB4F80814B |
:1037B000918182599F4F2091E9013091EA012817A8 |
:1037C00039071CF42F5F3F4F0CC0808191818259D3 |
:1037D0009F4F821793074CF42115310531F021508A |
:1037E00030403093EA012093E9018091EF019091FC |
:1037F000F00197FF05C01092F0011092EF010AC08E |
:103800008F3F910539F034F08FEF90E09093F00105 |
:103810008093EF018091ED019091EE0197FF05C03B |
:103820001092EE011092ED010AC08F3F910539F020 |
:1038300034F08FEF90E09093EE018093ED01809152 |
:10384000EB019091EC0197FF05C01092EC011092F2 |
:10385000EB010AC08F3F910539F034F08FEF90E013 |
:103860009093EC018093EB018091E9019091EA0142 |
:1038700097FF05C01092EA011092E9010AC08F3F3C |
:10388000910539F034F08FEF90E09093EA01809346 |
:10389000E9011F910F91FF90EF9008958091E10150 |
:1038A000882301F5809371028093700280937402E3 |
:1038B0008093760280919001882311F080937002AA |
:1038C00080919101882311F080937102809192017F |
:1038D000882311F08093760280919301882311F060 |
:1038E000809374028091700299279093750480935D |
:1038F00074048091710299279093770480937604E1 |
:10390000809176029927909379048093780480912E |
:103910007402992790937B0480937A041092D201C9 |
:103920001092D1010E94F914089581E08093E3047C |
:1039300082E08093E40483E08093E50494E0909334 |
:10394000E60445E04093E70486E08093E80487E0DE |
:103950008093E90438E03093EA041092EB048EE19E |
:103960008093EC048BEF8093EE048AE08093EF0465 |
:1039700022E32093ED042093F1049093F0049093BC |
:10398000F2043093F30480E18093F4048FE0809399 |
:10399000F5048AEF8093F6048AE18093F70480E8C7 |
:1039A0008093F80488E78093F90496E99093FA04E9 |
:1039B0008EE58093FB0483E28093FC0484E1809392 |
:1039C000FD041092FE041092FF0410920005109264 |
:1039D0000105109202051092030584E68093040508 |
:1039E00088E28093050510920C05209306059093BC |
:1039F000070540930805209309058AE580930A0589 |
:103A000010920B05A1E1B5E0E0E8F1E08CE0019057 |
:103A10000D928150E1F7089581E08093E30432E054 |
:103A20003093E40483E08093E50424E02093E604EB |
:103A300045E04093E70486E08093E80487E08093C4 |
:103A4000E90488E08093EA041092EB048EE180930D |
:103A5000EC048BEF8093EE048AE08093EF0492E312 |
:103A60009093ED049093F1043093F0042093F204CA |
:103A70001092F30480E18093F4048FE08093F504C6 |
:103A80008AEF8093F6048AE18093F70480E88093BC |
:103A9000F8048FEA8093F9048093FA048EE580930A |
:103AA000FB0483E28093FC0484E18093FD04109284 |
:103AB000FE041092FF04109200051092010510926E |
:103AC00002051092030584E68093040588E2809342 |
:103AD000050510920C059093060586E9809307056D |
:103AE00040930805909309058AE580930A05109292 |
:103AF0000B05A1E1B5E0E7E8F1E08CE001900D9263 |
:103B00008150E1F708951F938091EE048B3F98F068 |
:103B10008B3F19F48091EF010EC08C3F19F4809116 |
:103B2000ED0109C08D3F19F48091EB0104C08E3F77 |
:103B300021F48091E90180937401809174018823BC |
:103B400021F08F3F11F4809374018091ED048B3F3D |
:103B500098F08B3F19F48091EF010EC08C3F19F45F |
:103B60008091ED0109C08D3F19F48091EB0104C0F3 |
:103B70008E3F21F48091E901809375018091750158 |
:103B8000882329F0843618F084E6809375018091AB |
:103B9000EF048B3F98F08B3F19F48091EF010EC03A |
:103BA0008C3F19F48091ED0109C08D3F19F480918B |
:103BB000EB0104C08E3F21F48091E90180937301F1 |
:103BC00080917301882329F0843618F084E680936D |
:103BD00073018091F1048B3F98F08B3F19F4809131 |
:103BE000EF010EC08C3F19F48091ED0109C08D3FAB |
:103BF00019F48091EB0104C08E3F21F48091E9011A |
:103C00008093720180917201882321F08F3F11F41B |
:103C1000809372018091F8048B3F98F08B3F19F4E8 |
:103C20008091EF010EC08C3F19F48091ED0109C025 |
:103C30008D3F19F48091EB0104C08E3F21F48091F7 |
:103C4000E9018093710180917101882321F08F3FF8 |
:103C500011F4809371018091F9048B3F98F08B3FB0 |
:103C600019F48091EF010EC08C3F19F48091ED01A1 |
:103C700009C08D3F19F48091EB0104C08E3F21F4FF |
:103C80008091E90180937001809170018B3010F474 |
:103C90008AE002C08F3F11F4809370018091FA0492 |
:103CA0008B3F98F08B3F19F48091EF010EC08C3F51 |
:103CB00019F48091ED0109C08D3F19F48091EB0159 |
:103CC00004C08E3F21F48091E90180936F018091BF |
:103CD0006F01882321F08F3F11F480936F01809151 |
:103CE000FF048B3F98F08B3F19F48091EF010EC0D9 |
:103CF0008C3F19F48091ED0109C08D3F19F480913A |
:103D0000EB0104C08E3F21F48091E90180936D01A5 |
:103D100080916D01882321F08F3F11F480936D0114 |
:103D2000809100058B3F98F08B3F19F48091EF0153 |
:103D30000EC08C3F19F48091ED0109C08D3F19F43C |
:103D40008091EB0104C08E3F21F48091E9018093C2 |
:103D5000DA018091DA01882321F08F3F11F48093FA |
:103D6000DA01809101058B3F98F08B3F19F4809127 |
:103D7000EF010EC08C3F19F48091ED0109C08D3F19 |
:103D800019F48091EB0104C08E3F21F48091E90188 |
:103D90008093D9018091D901882321F08F3F11F4BC |
:103DA0008093D901809102058B3F98F08B3F19F4E5 |
:103DB0008091EF010EC08C3F19F48091ED0109C094 |
:103DC0008D3F19F48091EB0104C08E3F21F4809166 |
:103DD000E9018093D8018091D801882321F08F3F99 |
:103DE00011F48093D801809103058B3F98F08B3FAD |
:103DF00019F48091EF010EC08C3F19F48091ED0110 |
:103E000009C08D3F19F48091EB0104C08E3F21F46D |
:103E10008091E9018093D7018091D701882321F017 |
:103E20008F3F11F48093D701909104059B3FB0F030 |
:103E30009B3F19F48091EF010EC09C3F19F48091D3 |
:103E4000ED0109C09D3F19F48091EB0104C09E3F34 |
:103E500039F48091E90180936C0102C090936C0168 |
:103E600080916C01882321F08F3F11F480936C01C5 |
:103E70009B3FB0F09B3F19F48091EF010EC09C3F37 |
:103E800019F48091ED0109C09D3F19F48091EB0177 |
:103E900004C09E3F39F48091E90180936C0102C017 |
:103EA00090936C0180916C01882321F08F3F11F475 |
:103EB00080936C019B3FB0F09B3F19F48091EF0120 |
:103EC0000EC09C3F19F48091ED0109C09D3F19F48B |
:103ED0008091EB0104C09E3F39F48091E901809309 |
:103EE0006C0102C090936C0180916C01882321F0D9 |
:103EF0008F3F11F480936C01809109058B3F98F0FE |
:103F00008B3F19F48091EF010EC08C3F19F4809122 |
:103F1000ED0109C08D3F19F48091EB0104C08E3F83 |
:103F200021F48091E90180936B0180916B018823DA |
:103F300021F08F3F11F480936B0110916D01812F5F |
:103F4000992787FD9095A92FB92FBC01CD010E941B |
:103F5000872E17FF06C020E030E040E853E40E94BF |
:103F6000E22D27E137EB41ED58E30E94012FDC0100 |
:103F7000CB018093760190937701A0937801B09361 |
:103F800079018091F60480932A058091F50480934D |
:103F900021051F9108953F924F925F926F927F92F9 |
:103FA0008F929F92AF92BF92CF92DF92EF92FF9249 |
:103FB0000F931F93CF93DF930E94CD19299A80917D |
:103FC000E504E82FFF27EE0FFF1FE954FB4F808029 |
:103FD000918028E730E0820E931E97FE02C088246D |
:103FE00099248091E801843608F05EC08091010137 |
:103FF000882399F480910301909104018F5F9F4F72 |
:1040000061F488E99AE39093AA018093A90180E082 |
:104010009CE0909304018093030180914D02909164 |
:104020004E02009731F0019790934E0280934D021B |
:1040300004C01092E1011092F201809100018A30D7 |
:1040400011F4289A01C0289880915202909153024D |
:10405000815D974030F18091FC04882E992481E0A5 |
:104060008093F2018091E304E82FFF27EE0FFF1FFA |
:10407000E954FB4F118210828091E404E82FFF275E |
:10408000EE0FFF1FE954FB4F118210828091E6046E |
:10409000E82FFF27EE0FFF1FE954FB4F118210821C |
:1040A000E0C11092E101DDC18091E8018D3808F492 |
:1040B000D8C11092F2019091FD0482E3989FC00153 |
:1040C000112490934E0280934D0259E2851691047B |
:1040D0006CF080915202909153026FEF8F3F9607E0 |
:1040E00029F00196909353028093520280915202DC |
:1040F00090915302883C910520F078E28716910454 |
:1041000004F51092390210923A0210923B0210927A |
:104110003C0210923D0210923E0210923F02109219 |
:1041200040021092010210920202109203021092B9 |
:1041300004021092FD011092FE011092FF011092F4 |
:10414000000289EC881691040CF4EBC02091E10187 |
:10415000222309F0E6C08091E604E82FFF27EE0F46 |
:10416000FF1FE954FB4F808191818C3491050CF441 |
:10417000D6C080914F028F5F80934F02893C08F434 |
:10418000D0C0299820934F021092530210925202ED |
:104190003091E304E32FFF27EE0FFF1FE954FB4F9D |
:1041A0008081918187349105B4F48091E404E82FF3 |
:1041B000FF27EE0FFF1FE954FB4F80819181019093 |
:1041C000F081E02DF7FF03C0F095E195FF4FE73454 |
:1041D000F1050CF482C02091E404E22FFF27EE0FDA |
:1041E000FF1FE954FB4F808191818734910564F072 |
:1041F000E32FFF27EE0FFF1FE954FB4F80819181D2 |
:10420000863491050CF4C1E0E22FFF27EE0FFF1F6B |
:10421000E954FB4F808191818734910574F080913E |
:10422000E304E82FFF27EE0FFF1FE954FB4F8081C7 |
:104230009181873491050CF0C2E0E22FFF27EE0F49 |
:10424000FF1FE954FB4F808191818634910574F4FE |
:104250008091E304E82FFF27EE0FFF1FE954FB4F87 |
:1042600080819181873491050CF0C3E0E22FFF2714 |
:10427000EE0FFF1FE954FB4F808191818A5B9F4FB6 |
:1042800074F48091E304E82FFF27EE0FFF1FE95439 |
:10429000FB4F80819181873491050CF0C4E0E22FBF |
:1042A000FF27EE0FFF1FE954FB4F808191818A5B4E |
:1042B0009F4F74F48091E304E82FFF27EE0FFF1F58 |
:1042C000E954FB4F80819181863491050CF4C5E05F |
:1042D000A2E0B0E00C2E0E94E02F8091EB0480FF62 |
:1042E00010C08091070190910801875B934038F4DA |
:1042F00080910701909108018E5E924010F40E9417 |
:10430000160C0E9433024AE363EE74E00E94090235 |
:104310000E9471180E9433020E94B21602C02093BC |
:104320004F0273E2871691040CF09BC02091E604C3 |
:10433000E22FFF27EE0FFF1FE954FB4F8081918191 |
:10434000855B9F4F0CF06DC0809150028F5F809312 |
:104350005002893C08F467C088EC8093500281E0E9 |
:1043600090E0909353028093520281E08093E101A8 |
:1043700010924102109242021092430210924402A3 |
:104380001092010210920202109203021092040293 |
:104390001092FD011092FE011092FF011092000296 |
:1043A0001092110210921202109213021092140233 |
:1043B0001092090210920A0210920B0210920C0243 |
:1043C0008091250290912602A0912702B0912802A7 |
:1043D00080930D0290930E02A0930F02B0931002EF |
:1043E00080911D0290911E02A0911F02B0912002A7 |
:1043F0008093050290930602A0930702B0930802EF |
:104400001092390210923A0210923B0210923C0232 |
:1044100010923D0210923E0210923F021092400212 |
:1044200002C010925002E22FFF27EE0FFF1FE95447 |
:10443000FB4F808191818C3491058CF080915102E9 |
:104440008F5F80935102893C60F01092E10188EC0B |
:1044500080935102109253021092520202C01092A5 |
:10446000510280916A01815080936A0180916A01B2 |
:104470008F3F29F08091F201882309F4AAC10E949C |
:10448000831D8091E304E82FFF27EE0FFF1FDF015C |
:10449000A954BB4F0091F204C02FDD278D919C9150 |
:1044A0008C9F70018D9FF00C9C9FF00C1124E353A6 |
:1044B000FB4F8091F304482F552780819181849F81 |
:1044C000B001859F700D949F700D1124E60EF71EAC |
:1044D000F092E701E092E6018091E404E82FFF27E3 |
:1044E000EE0FFF1FDF01A954BB4F8D919C918C9F54 |
:1044F00090018D9F300D9C9F300D1124E353FB4F95 |
:1045000080819181849FB001859F700D949F700D73 |
:104510001124260F371F3093E5012093E401809189 |
:10452000E604E82FFF27EE0FFF1FE954FB4F8081C1 |
:104530009181909581959F4F9093E3018093E20143 |
:1045400010917001812F992787FD9095A92FB92F80 |
:10455000BC01CD010E94872E17FF06C020E030E08D |
:1045600040E853E40E94E22D20E030E040E251E4D4 |
:104570000E94E22DDC01CB0120E030E040E85BE36B |
:10458000BC01CD010E94012F5B016C0160932D05E0 |
:1045900070932E0580932F059093300510916F0135 |
:1045A000812F992787FD9095A92FB92FBC01CD01A7 |
:1045B0000E94872E17FF06C020E030E040E853E459 |
:1045C0000E94E22D20E030EE4BE257E40E94242EC0 |
:1045D000DC01CB018093240590932505A09326054B |
:1045E000B09327058091EB0482FF0CC080E090E03F |
:1045F000A0E0B0E08093240590932505A0932605C4 |
:10460000B093270520E030E040E050E0C601B5015E |
:104610000E94912E882364F480E090E0A0E0B0E056 |
:1046200080932D0590932E05A0932F05B093300510 |
:104630008091240590912505A0912605B09127052C |
:1046400020E030E040E050E0BC01CD010E94912E1E |
:10465000882364F480E090E0A0E0B0E0809324053B |
:1046600090932505A0932605B093270580910B050F |
:10467000992782FDAEC083FDACC080912502909148 |
:104680002602A0912702B091280281569A4EA0409E |
:10469000B040DCF0CE0123E0880F991F2A95E1F7A6 |
:1046A0009701281B390B3093E7012093E601809195 |
:1046B000250290912602A0912702B09128028158EC |
:1046C0009843A140B04094F126C08091250290917A |
:1046D0002602A0912702B0912802805A9541AF4F3F |
:1046E000BF4F24F59E0113E0220F331F1A95E1F707 |
:1046F0002E0D3F1D3093E7012093E60180912502A6 |
:1047000090912602A0912702B091280281589843E7 |
:10471000A140B0405CF0B4E0CC0FDD1FBA95E1F7EA |
:104720002C1B3D0B3093E7012093E60180911D0285 |
:1047300090911E02A0911F02B091200281569A4EC4 |
:10474000A040B0407CF0402F5527CA01A3E0880F5D |
:10475000991FAA95E1F72091E4013091E501281B0A |
:10476000390B1BC080911D0290911E02A0911F0267 |
:10477000B0912002805A9541AF4FBF4F54F5402F62 |
:104780005527CA01F3E0880F991FFA95E1F72091A8 |
:10479000E4013091E501280F391F3093E5012093A2 |
:1047A000E40180911D0290911E02A0911F02B09120 |
:1047B000200281589843A140B0405CF0E4E0440FEF |
:1047C000551FEA95E1F7241B350B3093E501209343 |
:1047D000E4018091E404E82FFF27EE0FFF1FE95466 |
:1047E000FB4F40910A05242F3327808191812817A0 |
:1047F000390724F480910B0582FD0CC0309521957A |
:104800003F4F80819181821793077CF480910B0543 |
:1048100083FF0BC081E08093DB018091090599271C |
:104820008815990524F44C0102C01092DB01809197 |
:10483000E304E82FFF27EE0FFF1FE954FB4F242F5F |
:104840003327808191812817390724F480910B0543 |
:1048500080FD0CC0309521953F4F8081918182175A |
:1048600093078CF480910B0581FF0DC081E080934C |
:10487000DC011092DB0180910905992788159905C3 |
:1048800024F44C0102C01092DC013090F20133207C |
:1048900041F11092E3011092E2011092E7011092AF |
:1048A000E6011092E5011092E4018DEC9CECACEC79 |
:1048B000BDE380932D0590932E05A0932F05B09313 |
:1048C00030058AE097EDA3EABBE38093240590933B |
:1048D0002505A0932605B09327051092DB011092C1 |
:1048E000DC018091B3019091B4018D54914008F4A2 |
:1048F00099C02091210230912202409123025091CF |
:1049000024028091250290912602A0912702B09165 |
:104910002802281B390B4A0B5B0BC0911902D0915E |
:104920001A02E0911B02F0911C0280911D029091ED |
:104930001E02A0911F02B0912002C81BD90BEA0BE6 |
:10494000FB0B1092B4011092B301273A31054105D7 |
:1049500051054CF080913702909138020196909366 |
:104960003802809337022A553F4F4F4F5F4F4CF428 |
:10497000809137029091380201979093380280938A |
:104980003702C73AD105E105F1054CF080913502B7 |
:104990009091360201969093360280933502CA5563 |
:1049A000DF4FEF4FFF4F4CF480913502909136026C |
:1049B0000197909336028093350210927A0080918D |
:1049C000250290912602A0912702B091280280939F |
:1049D0000D0290930E02A0930F02B09310028091EB |
:1049E0001D0290911E02A0911F02B091200280939F |
:1049F000050290930602A0930702B09308028091EB |
:104A0000150290911602A0911702B091180280939E |
:104A1000FD019093FE01A093FF01B09300028FEE81 |
:104A200080937A00409024055090250560902605DB |
:104A30007090270520E030E040E050E0C301B20173 |
:104A40000E94912E882309F43DC18091DC018823C6 |
:104A500009F038C18091DB01882309F033C1C0918E |
:104A6000F7042C2F33274427552780912502909156 |
:104A70002602A0912702B0912802BC01CD010E941C |
:104A8000BD2F8091280590912905AA2797FDA09513 |
:104A9000BA2F281B390B4A0B5B0B2093450230932E |
:104AA0004602409347025093480280912805909116 |
:104AB0002905AA2797FDA095BA2FB7FF07C0B09583 |
:104AC000A095909581959F4FAF4FBF4F883C910522 |
:104AD000A105B105BCF4DA01C90157FF03C007966F |
:104AE000A11DB11D73E0B595A795979587957A950A |
:104AF000D1F78093450290934602A0934702B0936A |
:104B0000480215C057FF04C0215F3F4F4F4F5F4F12 |
:104B100064E055954795379527956A95D1F7209389 |
:104B200045023093460240934702509348022C2F8F |
:104B300033274427552780911D0290911E02A09192 |
:104B40001F02B0912002BC01CD010E94BD2F8091B7 |
:104B5000310590913205AA2797FDA095BA2F281B01 |
:104B6000390B4A0B5B0B2093490230934A02409366 |
:104B70004B0250934C028091310590913205AA2747 |
:104B800097FDA095BA2FB7FF07C0B095A095909557 |
:104B900081959F4FAF4FBF4F883C9105A105B1054F |
:104BA000BCF4DA01C90157FF03C00796A11DB11D6E |
:104BB00023E0B595A795979587952A95D1F780938A |
:104BC000490290934A02A0934B02B0934C0215C045 |
:104BD00057FF04C0215F3F4F4F4F5F4F94E0559503 |
:104BE0004795379527959A95D1F7209349023093A9 |
:104BF0004A0240934B0250934C028091450290919F |
:104C00004602A0914702B0914802855F9140A040C2 |
:104C1000B04064F084EF91E0A0E0B0E08093450202 |
:104C200090934602A0934702B093480280914502B8 |
:104C300090914602A0914702B09148028C509E4F3D |
:104C4000AF4FBF4F64F48CE09EEFAFEFBFEF8093A8 |
:104C5000450290934602A0934702B0934802809188 |
:104C6000490290914A02A0914B02B0914C02855F9B |
:104C70009140A040B04064F084EF91E0A0E0B0E04B |
:104C80008093490290934A02A0934B02B0934C0246 |
:104C90008091490290914A02A0914B02B0914C023E |
:104CA0008C509E4FAF4FBF4FECF48CE09EEFAFEFB8 |
:104CB000BFEF8093490290934A02A0934B02B093B6 |
:104CC0004C0210C010924502109246021092470208 |
:104CD000109248021092490210924A0210924B021E |
:104CE00010924C0210927A0080911102909112025F |
:104CF000A0911302B0911402209145023091460216 |
:104D00004091470250914802821B930BA40BB50BB4 |
:104D10008093110290931202A0931302B093140295 |
:104D20008091090290910A02A0910B02B0910C02AD |
:104D30002091490230914A0240914B0250914C021D |
:104D4000821B930BA40BB50B8093090290930A026C |
:104D5000A0930B02B0930C022091E2013091E30189 |
:104D6000C90137FF04C088279927821B930B4597F9 |
:104D70003CF08091EB0484FD03C081E080935702F6 |
:104D80008091F404682F7727C90137FF04C0882772 |
:104D90009927821B930B289FA001299F500D389FB4 |
:104DA000500D1124CA01689FA001699F500D789F82 |
:104DB000500D1124CA0157FF02C081509E4FAC0113 |
:104DC000452F550F550B4595629FC001639F900D70 |
:104DD000729F900D112497FD039695958795959553 |
:104DE0008795480F591FCA01AA2797FDA095BA2F8A |
:104DF0008093410290934202A0934302B0934402F5 |
:104E0000209101023091020240910302509104026C |
:104E1000281B390B4A0B5B0B2093010230930202D3 |
:104E20004093030250930402809101029091020288 |
:104E3000A0910302B0910402895A9146A040B0406B |
:104E400064F088EA91E6A0E0B0E0809301029093DC |
:104E50000202A0930302B093040280910102909198 |
:104E60000202A0910302B091040288559E49AF4FFF |
:104E7000BF4F64F488E59EE9AFEFBFEF8093010276 |
:104E800090930202A0930302B09304028FEE8093EA |
:104E90007A008091F7019091F801892B09F4B8C04C |
:104EA0008091EB0483FFB4C080912502909126028B |
:104EB000A0912702B0912802B7FF04C081509E4FF5 |
:104EC000AF4FBF4F19E0B595A795979587951A9560 |
:104ED000D1F79C0197FF03C0309521953F4F8091FA |
:104EE0001D0290911E02A0911F02B0912002B7FFF7 |
:104EF00004C081509E4FAF4FBF4FC9E0B595A795F5 |
:104F000097958795CA95D1F7BC0197FF03C0709517 |
:104F100061957F4F261737070CF49B012931310526 |
:104F2000A4F480915702882381F0809158029091D7 |
:104F30005902892B51F48091F7019091F8019093D7 |
:104F4000F6018093F5011092570280917101482F6C |
:104F50005527249FC001259F900D349F900D11244B |
:104F600097FDCF969C01B6E035952795BA95E1F768 |
:104F7000421B530B9A01141615060CF043C01092F5 |
:104F80007A0060915802709159026115710569F5B6 |
:104F90008091F3019091F401829FA001839F500DB5 |
:104FA000929F500D11249A0157FF02C0215E3F4F7E |
:104FB000A5E035952795AA95E1F7442737FD40955B |
:104FC000542F8091010290910202A0910302B091AE |
:104FD0000402820F931FA41FB51F809301029093B8 |
:104FE0000202A0930302B09304028FEE80937A0032 |
:104FF0006115710569F061507040709359026093BA |
:10500000580206C084EF91E09093590280935802B1 |
:10501000809156028150809356028F3F09F06EC0F6 |
:1050200081E3809356028091F704E82EFF24002745 |
:1050300011278091250290912602A0912702B0911C |
:105040002802BC01CD01A80197010E94BD2F309319 |
:105050005D0420935C0480911D0290911E02A0913A |
:105060001F02B0912002BC01CD01A80197010E944E |
:10507000BD2F30935F0420935E04809128059091AA |
:10508000290590936104809360048091310590918B |
:105090003205909363048093620480912B05909174 |
:1050A0002C0590936504809364048091DF019091B6 |
:1050B000E00190936704809366048091F9019091D8 |
:1050C000FA01A091FB01B091FC01B7FF04C081502F |
:1050D0009E4FAF4FBF4FF9E0B595A7959795879530 |
:1050E000FA95D1F790936904809368048091F70151 |
:1050F0009091F80190936D0480936C048091DC0191 |
:10510000A0902D05B0902E05C0902F05D0903005B1 |
:105110008823A9F080911F0590912005AA2797FD6B |
:10512000A095BA2FBC01CD010E94872EDC01CB01D6 |
:10513000A6019501BC01CD010E94012F32C08091D2 |
:10514000250290912602A0912702B0912802BC016D |
:10515000CD010E94872EDC01CB01A3019201BC018D |
:10516000CD010E94012F7B018C0180911F05909140 |
:105170002005AA2797FDA095BA2FBC01CD010E945A |
:10518000872EDC01CB01A6019501BC01CD010E9457 |
:10519000012FDC01CB019C01AD01C801B7010E94C8 |
:1051A000E22DDC01CB01BC01CD010E946A2EDC01A5 |
:1051B000CB019093200580931F058091DB01A09087 |
:1051C0002D05B0902E05C0902F05D0903005882376 |
:1051D000A9F080911D0590911E05AA2797FDA09525 |
:1051E000BA2FBC01CD010E94872EDC01CB01A601A4 |
:1051F0009501BC01CD010E94012F3AC080911D0292 |
:1052000090911E02A0911F02B0912002BC01CD011D |
:105210000E94872E7B018C018091240590912505A9 |
:10522000A0912605B09127059C01AD01C801B701E9 |
:105230000E94012F7B018C0180911D0590911E051C |
:10524000AA2797FDA095BA2FBC01CD010E94872EF9 |
:10525000DC01CB01A6019501BC01CD010E94012F0B |
:10526000DC01CB019C01AD01C801B7010E94E22D18 |
:10527000DC01CB01BC01CD010E946A2EDC01CB0117 |
:1052800090931E0580931D0580912B0590912C0510 |
:10529000AA2797FDA095BA2FBC01CD010E94872EA9 |
:1052A0007B018C0180912D0590912E05A0912F05F9 |
:1052B000B09130059C01AD01C801B7010E94012FDA |
:1052C0005B016C018091150290911602A09117026A |
:1052D000B0911802BC01CD010E94872E7B018C0188 |
:1052E0008091240590912505A0912605B091270570 |
:1052F0009C01AD01C801B7010E94012FDC01CB0167 |
:1053000020E030E040E05FE3BC01CD010E94012FCE |
:10531000DC01CB019C01AD01C601B5010E94E22D6B |
:10532000DC01CB01BC01CD010E946A2EDC01CB0166 |
:1053300090932C0580932B0580911F05909120055B |
:105340008150984034F080E098E09093200580935D |
:105350001F0580911F05909120058050984F34F4CF |
:1053600080E098EF9093200580931F0580911D05A4 |
:1053700090911E058150984034F080E098E0909321 |
:105380001E0580931D0580911D0590911E0580507E |
:10539000984F34F480E098EF90931E0580931D059C |
:1053A00080912B0590912C058150984034F080E03D |
:1053B00098E090932C0580932B0580912B0590917C |
:1053C0002C058050984F34F480E098EF90932C0592 |
:1053D00080932B058091EB04992780FFE1C02091F9 |
:1053E000740181FF0EC02233B0F48091DF019091EF |
:1053F000E00144979093DE018093DD011092F1016A |
:105400000DC08091F004289FC0011124449790930F |
:10541000DE018093DD0181E08093F101332021F0F2 |
:105420001092DE011092DD01C090DF01D090E0010A |
:105430002091DD013091DE012C153D050CF0B0C04E |
:105440008091F101882309F4ABC0C21AD30A80917C |
:1054500073019927C89EB001C99E700DD89E700D2A |
:105460001124CB0177FD0F966C01E4E0D594C7942D |
:10547000EA95E1F7C4018C199D096C0180917501D1 |
:10548000282F33278091B5019091B601829FA0010A |
:10549000839F500D929F500D1124CA0157FD07960E |
:1054A00073E0959587957A95E1F7C81AD90AA09186 |
:1054B000F901B091FA01C091FB01D091FC01D7FF35 |
:1054C00004C0A150BE4FCF4FDF4F69E0D595C795BF |
:1054D000B795A7956A95D1F780917201282F332748 |
:1054E00044275527BD01CE010E94492F97FF04C0D4 |
:1054F000615E7F4F8F4F9F4F55E0959587957795CC |
:1055000067955A95D1F7633371051CF062E370E03B |
:1055100006C05FEF6E3C750714F46EEC7FEFC61AA1 |
:10552000D70A80915402909155029C0144E0220FC9 |
:10553000331F4A95E1F7281B390B2C0D3D1D37FF12 |
:1055400002C0215F3F4F04E0359527950A95E1F7AA |
:1055500030935502209354028091EC04482F552734 |
:105560002417350774F48416950624F050935502D9 |
:10557000409354028416950624F49092550280922A |
:10558000540280915402909155028816990624F491 |
:10559000909255028092540280905402909055024D |
:1055A00090926B0480926A04C0912B05D0912C05D7 |
:1055B0008091410290914202C81BD90BCE01AA27CB |
:1055C00097FDA095BA2FBC01CD010E94872E7B01CB |
:1055D0008C01C401AA2797FDA095BA2FBC01CD016B |
:1055E0000E94872E5B016C019B01AC01C801B701D1 |
:1055F0000E94942E18163CF4C601B5010E946A2E32 |
:10560000DC01CB01EC01CE01AA2797FDA095BA2FB2 |
:10561000BC01CD010E94872EDC01CB01D7FAD094CA |
:10562000D7F8D094A6019501BC01CD010E94912E1E |
:1056300088233CF4C601B5010E946A2EDC01CB012F |
:10564000EC01C536D10514F0C4E6D0E06FEFCC39DB |
:10565000D60714F4CCE9DFEF74E18716910414F453 |
:10566000C0E0D0E02091E6013091E70180916C022A |
:1056700090916D02281B390B80911F059091200598 |
:10568000821B930BAA2797FDA095BA2FBC01CD01D1 |
:105690000E94872EDC01CB01C0907A01D0907B0163 |
:1056A000E0907C01F0907D019C01AD01C701B60145 |
:1056B0000E94012FDC01CB01BC01CD010E946A2EAA |
:1056C000DC01CB019093730280937202809172028D |
:1056D00090917302AA2797FDA095BA2F20913902C5 |
:1056E00030913A0240913B0250913C02280F391F01 |
:1056F0004A1F5B1F2093390230933A0240933B02CA |
:1057000050933C026091390270913A0212161306CE |
:1057100014061506C4F4CB0177FF04C08827992727 |
:10572000861B970B97FF02C081509F4F892F990FBF |
:10573000990B0196AA2797FDA095BA2F281B390B24 |
:105740004A0B5B0B16C0CB0177FF03C09095819588 |
:105750009F4F97FF02C081509F4F892F990F990B40 |
:105760000196AA2797FDA095BA2F280F391F4A1F27 |
:105770005B1F2093390230933A0240933B025093CF |
:105780003C028091390290913A02A0913B02B09183 |
:105790003C0281589E43A040B04064F080E89EE304 |
:1057A000A0E0B0E08093390290933A02A0933B02CC |
:1057B000B0933C028091390290913A02A0913B0251 |
:1057C000B0913C028058914CAF4FBF4F64F480E8D9 |
:1057D00091ECAFEFBFEF8093390290933A02A09320 |
:1057E0003B02B0933C024091720250917302CE0191 |
:1057F000D7FF04C0882799278C1B9D0B880D991D06 |
:10580000880F991F8417950764F4CE01D7FF04C051 |
:10581000882799278C1B9D0BA401480F591F440F03 |
:10582000551FCE01D7FF04C0882799278C1B9D0BDD |
:10583000880D991D2EEF3FEF829FB001839F700D61 |
:10584000929F700D11244617570784F4CE01D7FF9D |
:1058500004C0882799278C1B9D0B880D991D829F5A |
:10586000A001839F500D929F500D11249401240F8D |
:10587000351F2C0F3D1F37FF03C020E030E007C06D |
:1058800080912A059927821793070CF49C011091A7 |
:105890002105812F9927281739070CF49C012093A3 |
:1058A00070029401241B350B2C0F3D1F37FF03C0E2 |
:1058B00020E030E007C080912A05992782179307DE |
:1058C0000CF49C01812F9927281739070CF49C01AF |
:1058D000209371022091E4013091E50180916A02E8 |
:1058E00090916B02281B390B80911D0590911E052C |
:1058F000821B930BAA2797FDA095BA2FBC01CD015F |
:105900000E94872EDC01CB019C01AD01C701B601CD |
:105910000E94012FDC01CB01BC01CD010E946A2E47 |
:10592000DC01CB0190936F0280936E0280916E0236 |
:1059300090916F02AA2797FDA095BA2F20913D0262 |
:1059400030913E0240913F0250914002280F391F92 |
:105950004A1F5B1F20933D0230933E0240933F025B |
:105960005093400260913D0270913E021216130660 |
:1059700014061506C4F4CB0177FF04C088279927C5 |
:10598000861B970B97FF02C081509F4F892F990F5D |
:10599000990B0196AA2797FDA095BA2F281B390BC2 |
:1059A0004A0B5B0B16C0CB0177FF03C09095819526 |
:1059B0009F4F97FF02C081509F4F892F990F990BDE |
:1059C0000196AA2797FDA095BA2F280F391F4A1FC5 |
:1059D0005B1F20933D0230933E0240933F02509361 |
:1059E000400280913D0290913E02A0913F02B09111 |
:1059F000400281589E43A040B04064F080E89EE39E |
:105A0000A0E0B0E080933D0290933E02A0933F025D |
:105A1000B093400280913D0290913E02A0913F02DE |
:105A2000B09140028058914CAF4FBF4F64F480E872 |
:105A300091ECAFEFBFEF80933D0290933E02A093B5 |
:105A40003F02B093400240916E0250916F02CE012E |
:105A5000D7FF04C0882799278C1B9D0B880D991DA3 |
:105A6000880F991F8417950764F4CE01D7FF04C0EF |
:105A7000882799278C1B9D0BA401480F591F440FA1 |
:105A8000551FCE01D7FF04C0882799278C1B9D0B7B |
:105A9000880D991D2EEF3FEF829FB001839F700DFF |
:105AA000929F700D11244617570784F4CE01D7FF3B |
:105AB00004C0882799278C1B9D0B880D991D829FF8 |
:105AC000A001839F500D929F500D11249401240F2B |
:105AD000351F2C1B3D0B37FF03C020E030E007C013 |
:105AE00080912A059927821793070CF49C01812F36 |
:105AF0009927281739070CF49C012093760294010A |
:105B0000241B350B2C1B3D0B37FF03C020E030E07E |
:105B100007C080912A059927821793070CF49C01EE |
:105B2000812F9927281739070CF49C0120937402C0 |
:105B3000DF91CF911F910F91FF90EF90DF90CF9069 |
:105B4000BF90AF909F908F907F906F905F904F909D |
:105B50003F9008958091660290916702A09168023B |
:105B6000B091690280935E0290935F02A0936002FD |
:105B7000B09361028091620290916302A0916402ED |
:105B8000B091650280935A0290935B02A0935C02ED |
:105B9000B0935D02089510926D0210926C02109203 |
:105BA0006B0210926A020895FC014150504030F09F |
:105BB00001900616D1F73197CF01089588279927CC |
:105BC00008955058192EEFD001D0D2C0BA176207ED |
:105BD000730784079507B1F188F40EF410940B2E27 |
:105BE000BA2FA02D062E622F202D072E732F302DB9 |
:105BF000082E842F402D092E952F502DFF27552339 |
:105C0000B9F0591B49F0573E98F0469537952795BE |
:105C1000A795F0405395C9F776F0BA0F621F731F2E |
:105C2000841F30F4879577956795B795F0409395E5 |
:105C300017FA0F2E0895BF1BBB27BA0B620B730B0D |
:105C4000840BF6CFDEF6DBC0AED001D091C0552379 |
:105C500059F0992369F09F575F57951B33F442F42D |
:105C6000903811F4915805C09BC091589F3F09F49A |
:105C7000C6C0BB27112462177307840730F4660F70 |
:105C8000771F881FBB1F915098F311D00F920FD030 |
:105C90000F920DD0A0E82617370748071B0609F01A |
:105CA000A048BA2F602D7F918F9100240895A0E81D |
:105CB0000024621773078407B10528F0621B730B79 |
:105CC000840BB1090A2A660F771F881FBB1FA69590 |
:105CD00081F7089597FB73D09F3738F0FEE9F91BE1 |
:105CE000982F872F762F6B2F05C086C096958795A6 |
:105CF00077956795F150D0F73EF490958095709523 |
:105D000061957F4F8F4F9F4F0895E89403C097FB95 |
:105D10000EF4F3DFB62F672F782F892F9EE900242A |
:105D200027C00ED05EF004C00BD026F001C008D012 |
:105D300019F020F48FEF089580E0089581E0089530 |
:105D400097FB092E052600F8689430D0E89407FCEC |
:105D500007C0621773078407950721F008F40094C1 |
:105D60000794989408959A95BB0F661F771F881F14 |
:105D700011249923A1F08823B2F79F3F59F0BB0F5C |
:105D800048F421F4002011F460FF04C06F5F7F4FDE |
:105D90008F4F9F4F881F9795879597F908952CC02F |
:105DA0009FEF80EC0895052E092607FA440F551F32 |
:105DB0005F3F79F0AA27A51708F051E04795880FB3 |
:105DC000991F9F3F31F0BB27B91708F091E08795E5 |
:105DD00008959F919F911124E3CF97FB880F991FFE |
:105DE0009F3F31F0BB27B91708F091E087950895E0 |
:105DF0009F919F911124D4CF6627772788279927D1 |
:105E00000895D1DF01D0B4CF992339F0552329F07B |
:105E10009F575F57950F13F49AF1F1CF91589F3F19 |
:105E2000E1F3629FA12D0F92BB27639FA00DB11DCF |
:105E3000EE27729FA00DB11DEE1FAF93AA27649F9E |
:105E4000B00DE11D739FB00DE11DAA1F6627829F53 |
:105E5000B00DE11DA61F5527749FE00DA11D551F14 |
:105E6000839FE00DA11D561F849FA00D511D852FFE |
:105E70007A2F6E2F1F900F9088231AF4939539F480 |
:105E80008FCF000C111CBB1F661F771F881F0128B6 |
:105E90000895629FD001739FF001829FE00DF11D74 |
:105EA000649FE00DF11D929FF00D839FF00D749F94 |
:105EB000F00D659FF00D9927729FB00DE11DF91F40 |
:105EC000639FB00DE11DF91FBD01CF01112408959D |
:105ED000991B79E004C0991F961708F0961B881F3C |
:105EE0007A95C9F780950895AA1BBB1B51E107C09D |
:105EF000AA1FBB1FA617B70710F0A61BB70B881F5A |
:105F0000991F5A95A9F780959095BC01CD010895E8 |
:105F100097FB092E07260AD077FD04D0E5DF06D0CF |
:105F200000201AF4709561957F4F0895F6F79095CB |
:105F300081959F4F0895A1E21A2EAA1BBB1BFD015C |
:105F40000DC0AA1FBB1FEE1FFF1FA217B307E40758 |
:105F5000F50720F0A21BB30BE40BF50B661F771FB0 |
:105F6000881F991F1A9469F7609570958095909590 |
:105F70009B01AC01BD01CF01089597FB092E0526B9 |
:105F80000ED057FD04D0D7DF0AD0001C38F450954E |
:105F90004095309521953F4F4F4F5F4F0895F6F74D |
:105FA00090958095709561957F4F8F4F9F4F089585 |
:105FB000F999FECFB2BDA1BDF89A119600B408952B |
:105FC000F999FECFB2BDA1BD00BC11960FB6F894F1 |
:085FD000FA9AF99A0FBE089538 |
:105FD8000A6401FFFF010AFF03007D000064004816 |
:105FE800616C6C6F2057656C740000000000000045 |
:105FF8000000000000000000000000000000000099 |
:106008000000000000000000000000000000000088 |
:106018000000000000000000000000000000000078 |
:106028000000000000000000000000000000000167 |
:1060380002030405060708090A0A0146640A0296CB |
:1060480096403A10FB3017B7D1380000803F640003 |
:1060580053706F727400004B616D657261000000CF |
:00000001FF |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,15 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
Flight-Ctrl SW > 0.62 benötigt das Kopter-Tool >1.47 |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/Settings.h |
---|
--- Flight-Ctrl_V0_64_3_GPS_work_Jochen/_Settings.h (nonexistent) |
+++ Flight-Ctrl_V0_64_3_GPS_work_Jochen/_Settings.h (revision 198) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 16 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 500 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/analog.c |
---|
0,0 → 1,172 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AccumulateNick = 0, AccumulateRoll = 0, AccumulateGier = 0; |
volatile int accumulate_AccRoll = 0,accumulate_AccNick = 0,accumulate_AccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
signed int wert; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
wert = (signed int) AdNeutralGier - ADC; |
if(PlatinenVersion != 10) wert *= 2; |
AccumulateGier += wert; // |
MessanzahlGier++; |
Mess_Integral_Gier += wert;// / 16; |
Mess_Integral_Gier2 += wert; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
wert = (signed int) ADC - AdNeutralRoll; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralRoll += wert; |
Mess_IntegralRoll2 += wert; |
if(Mess_IntegralRoll > 310000L) Mess_IntegralRoll = -290000L; |
if(Mess_IntegralRoll <-310000L) Mess_IntegralRoll = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
AccumulateRoll += wert; |
MessanzahlRoll++; |
kanal = 2; |
break; |
case 2: |
wert = (signed int) ADC - AdNeutralNick; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralNick += wert; |
Mess_IntegralNick2 += wert; |
if(Mess_IntegralNick > 310000L) Mess_IntegralNick = -290000L; |
if(Mess_IntegralNick <-310000L) Mess_IntegralNick = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
AccumulateNick += wert; |
MessanzahlNick++; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
accumulate_AccRoll += Aktuell_ay; |
messanzahl_AccRoll++; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
accumulate_AccNick += Aktuell_ax; |
messanzahl_AccNick++; |
kanal = 5; |
state = 6; |
break; |
case 6: |
accumulate_AccHoch = (signed int) ADC - NeutralAccZ; |
accumulate_AccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(accumulate_AccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(accumulate_AccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += accumulate_AccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
// Mess_Integral_Hoch -= Mess_Integral_Hoch / 512; // dämfen |
/* if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
kanal = 3; |
state = 7; |
} |
else |
{ |
kanal = 0; |
state = 0; |
}*/ |
kanal = 3; |
state = 7; |
break; |
case 7: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
ANALOG_ON; |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/analog.h |
---|
0,0 → 1,23 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AccumulateNick, AccumulateRoll, AccumulateGier,accumulate_AccRoll,accumulate_AccNick,accumulate_AccHoch; |
extern volatile char MessanzahlNick, MessanzahlRoll, MessanzahlGier,messanzahl_AccNick, messanzahl_AccRoll,messanzahl_AccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern unsigned int ReadADC(unsigned char adc_input); |
extern void ADC_Init(void); |
extern void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/eeprom.c |
---|
--- Flight-Ctrl_V0_64_3_GPS_work_Jochen/fc.c (nonexistent) |
+++ Flight-Ctrl_V0_64_3_GPS_work_Jochen/fc.c (revision 198) |
@@ -0,0 +1,912 @@ |
+/*####################################################################################### |
+Flight Control |
+#######################################################################################*/ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) 04.2007 Holger Buss |
+// + Nur für den privaten Gebrauch |
+// + www.MikroKopter.com |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
+// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
+// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
+// + bzgl. der Nutzungsbedingungen aufzunehmen. |
+// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
+// + Verkauf von Luftbildaufnahmen, usw. |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
+// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
+// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
+// + eindeutig als Ursprung verlinkt werden |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
+// + Benutzung auf eigene Gefahr |
+// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
+// + mit unserer Zustimmung zulässig |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
+// + this list of conditions and the following disclaimer. |
+// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
+// + from this software without specific prior written permission. |
+// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
+// + for non-commercial use (directly or indirectly) |
+// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
+// + with our written permission |
+// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
+// + clearly linked as origin |
+// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
+// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
+// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
+// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
+// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
+// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
+// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
+// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
+// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
+// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
+// + POSSIBILITY OF SUCH DAMAGE. |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#include "main.h" |
+ |
+unsigned char h,m,s; |
+volatile unsigned int I2CTimeout = 100; |
+volatile int MesswertNick,MesswertRoll,MesswertGier; |
+volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0; |
+volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
+volatile float NeutralAccZ = 0; |
+unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
+volatile long IntegralNick = 0,IntegralNick2 = 0; |
+volatile long IntegralRoll = 0,IntegralRoll2 = 0; |
+volatile long Integral_Gier = 0; |
+volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
+volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
+volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
+volatile long Mess_Integral_Hoch = 0; |
+volatile int KompassValue = 0; |
+volatile int KompassStartwert = 0; |
+volatile int KompassRichtung = 0; |
+unsigned char MAX_GAS,MIN_GAS; |
+unsigned char Notlandung = 0; |
+unsigned char HoehenReglerAktiv = 0; |
+ |
+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; |
+unsigned char Looping_Nick = 0,Looping_Roll = 0; |
+ |
+float Kp = FAKTOR_P; |
+float Ki = FAKTOR_I; |
+ |
+unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
+unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
+unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
+unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
+unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
+unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
+unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
+unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
+unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
+unsigned char Parameter_UserParam1 = 0; |
+unsigned char Parameter_UserParam2 = 0; |
+unsigned char Parameter_UserParam3 = 0; |
+unsigned char Parameter_UserParam4 = 0; |
+unsigned char Parameter_ServoNickControl = 100; |
+unsigned char Parameter_LoopGasLimit = 70; |
+struct mk_param_struct EE_Parameter; |
+ |
+void Piep(unsigned char Anzahl) |
+{ |
+ while(Anzahl--) |
+ { |
+ if(MotorenEin) return; //auf keinen Fall im Flug! |
+ beeptime = 100; |
+ Delay_ms(250); |
+ } |
+} |
+ |
+//############################################################################ |
+// Nullwerte ermitteln |
+void SetNeutral(void) |
+//############################################################################ |
+{ |
+ unsigned int timer; |
+ NeutralAccX = 0; |
+ NeutralAccY = 0; |
+ NeutralAccZ = 0; |
+ AdNeutralNick = 0; |
+ AdNeutralRoll = 0; |
+ AdNeutralGier = 0; |
+ CalibrierMittelwert(); |
+ timer = SetDelay(5); |
+ while (!CheckDelay(timer)); |
+ CalibrierMittelwert(); |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ |
+ if(PlatinenVersion == 10) |
+ { |
+ AdNeutralNick= abs(MesswertNick); |
+ AdNeutralRoll= abs(MesswertRoll); |
+ AdNeutralGier= abs(MesswertGier); |
+ } |
+ else |
+ { |
+ AdNeutralNick= abs(MesswertNick) / 2; |
+ AdNeutralRoll= abs(MesswertRoll) / 2; |
+ AdNeutralGier= abs(MesswertGier) / 2; |
+ } |
+ NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
+ NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
+ NeutralAccZ = Aktuell_az; |
+ |
+ Mess_IntegralNick = 0; |
+ Mess_IntegralNick2 = 0; |
+ Mess_IntegralRoll = 0; |
+ Mess_IntegralRoll2 = 0; |
+ Mess_Integral_Gier = 0; |
+ MesswertNick = 0; |
+ MesswertRoll = 0; |
+ MesswertGier = 0; |
+ StartLuftdruck = Luftdruck; |
+ HoeheD = 0; |
+ Mess_Integral_Hoch = 0; |
+ KompassStartwert = KompassValue; |
+ GPS_Neutral(); |
+ beeptime = 50; |
+} |
+ |
+//############################################################################ |
+// Bildet den Mittelwert aus den Messwerten |
+void Mittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((long)Mittelwert_AccNick * 7 + ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick)) / 8L; |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 7 + ((ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll)) / 8L; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 7 + ((long)accumulate_AccHoch) / messanzahl_AccHoch) / 8L; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ Integral_Gier = Mess_Integral_Gier; |
+// Integral_Gier2 = Mess_Integral_Gier2; |
+ IntegralNick = Mess_IntegralNick; |
+ IntegralRoll = Mess_IntegralRoll; |
+ IntegralNick2 = Mess_IntegralNick2; |
+ IntegralRoll2 = Mess_IntegralRoll2; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ |
+/* |
+//------------------------------------------------------------------------------ |
+ if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
+ else |
+ if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
+ if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
+ else |
+ if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
+//------------------------------------------------------------------------------ |
+*/ |
+ if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
+ if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
+ if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
+ if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
+ if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
+ if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
+ if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
+ if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
+} |
+ |
+//############################################################################ |
+// Messwerte beim Ermitteln der Nullage |
+void CalibrierMittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick); |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = (ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)accumulate_AccHoch) / messanzahl_AccHoch; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
+ if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
+ if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
+ if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
+ if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
+ if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
+ if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
+ if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
+} |
+ |
+//############################################################################ |
+// Senden der Motorwerte per I2C-Bus |
+void SendMotorData(void) |
+//############################################################################ |
+{ |
+ if(MOTOR_OFF || !MotorenEin) |
+ { |
+ Motor_Hinten = 0; |
+ Motor_Vorne = 0; |
+ Motor_Rechts = 0; |
+ Motor_Links = 0; |
+ if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
+ if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
+ if(MotorTest[2]) Motor_Links = MotorTest[2]; |
+ if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
+ } |
+ |
+ DebugOut.Analog[12] = Motor_Vorne; |
+ DebugOut.Analog[13] = Motor_Hinten; |
+ DebugOut.Analog[14] = Motor_Links; |
+ DebugOut.Analog[15] = Motor_Rechts; |
+ |
+ //Start I2C Interrupt Mode |
+ twi_state = 0; |
+ motor = 0; |
+ i2c_start(); |
+} |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Konstanten |
+// + 0-250 -> normale Werte |
+// + 251 -> Poti1 |
+// + 252 -> Poti2 |
+// + 253 -> Poti3 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+void DefaultKonstanten1(void) |
+{ |
+ EE_Parameter.Kanalbelegung[K_NICK] = 1; |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
+ EE_Parameter.Kanalbelegung[K_GAS] = 3; |
+ EE_Parameter.Kanalbelegung[K_GIER] = 4; |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
+ EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 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 = 94; // Wert : 0-250 |
+ EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
+ EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 0; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
+ EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickRefresh = 5; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
+ memcpy(EE_Parameter.Name, "Sport\0", 12); |
+} |
+ |
+void DefaultKonstanten2(void) |
+{ |
+ EE_Parameter.Kanalbelegung[K_NICK] = 1; |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
+ EE_Parameter.Kanalbelegung[K_GAS] = 3; |
+ EE_Parameter.Kanalbelegung[K_GIER] = 4; |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
+ EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
+ EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
+ EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
+ EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
+ EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
+ EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 0; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
+ EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickRefresh = 5; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
+ memcpy(EE_Parameter.Name, "Kamera\0", 12); |
+} |
+ |
+ |
+//############################################################################ |
+// Trägt ggf. das Poti als Parameter ein |
+void ParameterZuordnung(void) |
+//############################################################################ |
+{ |
+ |
+ #define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
+ CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
+ CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
+ CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
+ CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
+ CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
+ CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
+ CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
+ CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
+ CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
+ CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
+ CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
+ CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
+ |
+ Ki = (float) Parameter_I_Faktor * 0.0001; |
+ MAX_GAS = EE_Parameter.Gas_Max; |
+ MIN_GAS = EE_Parameter.Gas_Min; |
+} |
+ |
+ |
+//############################################################################ |
+// |
+void MotorRegler(void) |
+//############################################################################ |
+{ |
+ int motorwert,pd_ergebnis,h,tmp_int; |
+ int GierMischanteil,GasMischanteil; |
+ static long SummeNick=0,SummeRoll=0; |
+ static long sollGier = 0,tmp_long,tmp_long2; |
+ long IntegralFehlerNick = 0; |
+ long IntegralFehlerRoll = 0; |
+ static unsigned int RcLostTimer; |
+ static unsigned char delay_neutral = 0; |
+ static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
+ static unsigned int modell_fliegt = 0; |
+ static int hoehenregler = 0; |
+ static char TimerWerteausgabe = 0; |
+ static char NeueKompassRichtungMerken = 0; |
+ Mittelwert(); |
+ |
+ GRN_ON; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gaswert ermitteln |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
+ if(GasMischanteil < 0) GasMischanteil = 0; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang schlecht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay < 100) |
+ { |
+ if(!PcZugriff) |
+ { |
+ if(BeepMuster == 0xffff) |
+ { |
+ beeptime = 15000; |
+ BeepMuster = 0x0c00; |
+ } |
+ } |
+ if(RcLostTimer) RcLostTimer--; |
+ else |
+ { |
+ MotorenEin = 0; |
+ Notlandung = 0; |
+ } |
+ ROT_ON; |
+ if(modell_fliegt > 2000) // wahrscheinlich in der Luft --> langsam absenken |
+ { |
+ GasMischanteil = EE_Parameter.NotGas; |
+ Notlandung = 1; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
+ } |
+ else MotorenEin = 0; |
+ } |
+ else |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang gut |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay > 140) |
+ { |
+ Notlandung = 0; |
+ RcLostTimer = EE_Parameter.NotGasZeit * 50; |
+ if(GasMischanteil > 40) |
+ { |
+ if(modell_fliegt < 0xffff) modell_fliegt++; |
+ } |
+ if((modell_fliegt < 200) || (GasMischanteil < 40)) |
+ { |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ } |
+ if((GasMischanteil > 200) && MotorenEin == 0) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// auf Nullwerte kalibrieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
+ { |
+ unsigned char setting; |
+ if(++delay_neutral > 200) // nicht sofort |
+ { |
+ GRN_OFF; |
+ MotorenEin = 0; |
+ delay_neutral = 0; |
+ modell_fliegt = 0; |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
+ { |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
+ eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting); // aktiven Datensatz merken |
+ } |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
+ SetNeutral(); |
+ Piep(GetActiveParamSetNumber()); |
+ } |
+ } |
+ else delay_neutral = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gas ist unten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(GasMischanteil < 35) |
+ { |
+ // Starten |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Einschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(++delay_einschalten > 200) |
+ { |
+ delay_einschalten = 200; |
+ modell_fliegt = 1; |
+ MotorenEin = 1; |
+ sollGier = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ Mess_IntegralNick = 0; |
+ Mess_IntegralRoll = 0; |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ } |
+ } |
+ else delay_einschalten = 0; |
+ //Auf Neutralwerte setzen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Auschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
+ { |
+ if(++delay_ausschalten > 200) // nicht sofort |
+ { |
+ MotorenEin = 0; |
+ delay_ausschalten = 200; |
+ modell_fliegt = 0; |
+ } |
+ } |
+ else delay_ausschalten = 0; |
+ } |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// neue Werte von der Funke |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!NewPpmData-- || Notlandung) |
+ { |
+ ParameterZuordnung(); |
+ StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
+ StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
+ StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
+ StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
+ StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
+ GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
+ IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
+ |
+ if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
+ if(GyroFaktor < 0) GyroFaktor = 0; |
+ if(IntegralFaktor < 0) IntegralFaktor = 0; |
+ // greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
+ if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ if(IntegralNick > 60000) |
+ { |
+ StickNick -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralNick < -60000) |
+ { |
+ StickNick += 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ if(IntegralRoll > 60000) |
+ { |
+ StickRoll -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralRoll < -60000) |
+ { |
+ StickRoll += 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ } |
+ |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Looping? |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ Looping_Roll = 1; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Roll = 0; |
+ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN)) |
+ { |
+ Looping_Nick = 1; |
+ Looping_Roll = 0; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Nick = 0; |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Bei Empfangsausfall im Flug |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Notlandung) |
+ { |
+ StickGier = 0; |
+ StickNick = 0; |
+ StickRoll = 0; |
+ GyroFaktor = 0.1; |
+ IntegralFaktor = 0.005; |
+ Looping_Roll = 0; |
+ Looping_Nick = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gyro-Drift kompensieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define DRIFT_FAKTOR 3 |
+ if(ZaehlMessungen >= 1000 / DRIFT_FAKTOR) |
+ { |
+ IntegralFehlerNick = IntegralNick2 - IntegralNick; |
+ IntegralFehlerRoll = IntegralRoll2 - IntegralRoll; |
+ ZaehlMessungen = 0; |
+ if(IntegralFehlerNick > 500/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -500/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 500/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -500/DRIFT_FAKTOR) AdNeutralRoll--; |
+// if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR) AdNeutralGier--; // macht nur mit Referenz (Kompass Sinn) |
+// if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; // macht nur mit Referenz (Kompass Sinn) |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ Mess_Integral_Gier2 = Integral_Gier; |
+ ANALOG_ON; // ADC einschalten |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Integrale auf ACC-Signal abgleichen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(IntegralFaktor && !Looping_Nick && !Looping_Roll) |
+ { |
+ tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
+ if(labs(Mittelwert_AccNick) < 200) tmp_long /= 8; |
+ else tmp_long /= 16; |
+ tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
+ if(labs(Mittelwert_AccRoll) < 200) tmp_long2 /= 8; |
+ else tmp_long2 /= 16; |
+ |
+ #define AUSGLEICH 500 |
+ if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
+ if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
+ if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
+ if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
+ } |
+ else |
+ { |
+ tmp_long = 0; |
+ tmp_long2 = 0; |
+ } |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick -= tmp_long; |
+ Mess_IntegralRoll -= tmp_long2; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(abs(StickGier) > 20) // war 35 |
+ { |
+ if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
+ } |
+ tmp_int = EE_Parameter.Gier_P * (StickGier * abs(StickGier)) / 512; // expo y = ax + bx² |
+ tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
+ sollGier = tmp_int; |
+ Mess_Integral_Gier -= tmp_int; |
+ if(Mess_Integral_Gier > 25000) Mess_Integral_Gier = 25000; // begrenzen |
+ if(Mess_Integral_Gier <-25000) Mess_Integral_Gier =-25000; |
+ |
+ ANALOG_ON; // ADC einschalten |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Kompass |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
+ { |
+ int w,v; |
+ static int SignalSchlecht = 0; |
+ w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
+ v = abs(IntegralRoll /512); |
+ if(v > w) w = v; // grösste Neigung ermitteln |
+ if(w < 25 && NeueKompassRichtungMerken && !SignalSchlecht) |
+ { |
+ KompassStartwert = KompassValue; |
+ NeueKompassRichtungMerken = 0; |
+ } |
+ w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
+ w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
+ if(w > 0) |
+ { |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ if(!SignalSchlecht) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
+ ANALOG_ON; // ADC einschalten |
+ if(SignalSchlecht) SignalSchlecht--; |
+ } |
+ else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debugwerte zuordnen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!TimerWerteausgabe--) |
+ { |
+ TimerWerteausgabe = 49; |
+ 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[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; |
+ |
+ // Maximalwerte abfangen |
+ #define MAX_SENSOR 2048 |
+ if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
+ if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
+ if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
+ if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
+ if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
+ if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Höhenregelung |
+// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+//OCR0B = 180 - (Poti1 + 120) / 4; |
+//DruckOffsetSetting = OCR0B; |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
+ { |
+ int tmp_int; |
+ if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
+ { |
+ if(Parameter_MaxHoehe < 50) |
+ { |
+ SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
+ HoehenReglerAktiv = 0; |
+ } |
+ else |
+ HoehenReglerAktiv = 1; |
+ } |
+ else |
+ { |
+ SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 20; |
+ HoehenReglerAktiv = 1; |
+ } |
+ |
+ if(Notlandung) SollHoehe = 0; |
+ h = HoehenWert; |
+ if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
+ { h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
+ h = GasMischanteil - h; // vom Gas abziehen |
+ h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
+ tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
+ if(tmp_int > 50) tmp_int = 50; |
+ else if(tmp_int < -50) tmp_int = -50; |
+ h -= tmp_int; |
+ hoehenregler = (hoehenregler*15 + h) / 16; |
+ if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
+ { |
+ if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
+ if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
+ } |
+ if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
+ GasMischanteil = hoehenregler; |
+ } |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Mischer und PI-Regler |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DebugOut.Analog[7] = GasMischanteil; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gier-Anteil |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MUL_G 1.0 |
+ GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
+//GierMischanteil = 0; |
+ if(GierMischanteil > (MUL_G * GasMischanteil)) GierMischanteil = MUL_G * GasMischanteil; |
+ if(GierMischanteil < -(MUL_G * GasMischanteil)) GierMischanteil = -(MUL_G * GasMischanteil); |
+ if(GierMischanteil > 100) GierMischanteil = 100; |
+ if(GierMischanteil < -100) GierMischanteil = -100; |
+ |
+ if(GasMischanteil < 20) GierMischanteil = 0; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Nick-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+ DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
+ SummeNick += DiffNick; // I-Anteil |
+ if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
+ if(SummeNick > 16000) SummeNick = 16000; |
+ if(SummeNick < -16000) SummeNick = -16000; |
+ pd_ergebnis = DiffNick;// + Ki * SummeNick; // PI-Regler für Nick |
+ // Motor Vorn |
+#define MUL 2 |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ |
+ motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Vorne = motorwert; |
+ // Motor Heck |
+ motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Hinten = motorwert; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Roll-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
+ SummeRoll += DiffRoll; // I-Anteil |
+ if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
+ if(SummeRoll > 16000) SummeRoll = 16000; |
+ if(SummeRoll < -16000) SummeRoll = -16000; |
+ pd_ergebnis = DiffRoll;// + Ki * SummeRoll; // PI-Regler für Roll |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ // Motor Links |
+ motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Links = motorwert; |
+ // Motor Rechts |
+ motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Rechts = motorwert; |
+ // +++++++++++++++++++++++++++++++++++++++++++++++ |
+} |
+ |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/fc.h |
---|
0,0 → 1,119 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
unsigned char h,m,s; |
volatile unsigned char Timeout ; |
unsigned char CosinusNickWinkel, CosinusRollWinkel; |
volatile long IntegralNick,IntegralNick2; |
volatile long IntegralRoll,IntegralRoll2; |
volatile long Integral_Gier; |
volatile long Mess_IntegralNick,Mess_IntegralNick2; |
volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
volatile long Mess_Integral_Gier; |
volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay; |
int StickNick,StickRoll,StickGier; |
char MotorenEin; |
extern void DefaultKonstanten(void); |
#define STRUCT_PARAM_LAENGE 58 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
#endif //_FC_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="fc.c"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File></Project> |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/gps.h |
---|
0,0 → 1,4 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern void GPS_Neutral(void); |
extern void GPS_BerechneZielrichtung(void); |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/main.c |
---|
0,0 → 1,227 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 62 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 2); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/main.h |
---|
0,0 → 1,97 |
#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 |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//#define ANZ_MITTELWERT 4 |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
extern void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/makefile |
---|
0,0 → 1,391 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 64 |
VERSION_KOMPATIBEL = 5 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION) |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/menu.c |
---|
0,0 → 1,118 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); } |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,0,"[%i]",MenuePunkt); |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"++ MikroKopter ++"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AccumulateNick / MessanzahlNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AccumulateRoll / MessanzahlRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AccumulateGier / MessanzahlGier, AdNeutralGier); |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",accumulate_AccNick / messanzahl_AccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",accumulate_AccRoll / messanzahl_AccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Aktuell_az/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"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/Flight-Ctrl_V0_64_3_GPS_work_Jochen/menu.h |
---|
0,0 → 1,5 |
extern void Menu(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
unsigned char RemoteTasten; |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
extern void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if ((signal > 1500) && (signal < 8000)) |
{ |
index = 1; |
NewPpmData = 0; // Null bedeutet: Neue Daten |
// OCR2A = Poti2/2 + 80; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/timer0.c |
---|
0,0 → 1,158 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 4000)) |
{ |
KompassValue = cntKompass; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = -TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/timer0.h |
---|
0,0 → 1,15 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/twimaster.h |
---|
0,0 → 1,32 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_init (void); // I2C initialisieren |
char i2c_start (void); // Start I2C |
void i2c_stop (void); // Stop I2C |
char i2c_write_byte (char byte); // 1 Byte schreiben |
#endif |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/uart.c |
---|
0,0 → 1,332 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned int tmp_int_arr1[1]; |
unsigned int tmp_int_arr2[2]; |
unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
unsigned char tmp_char_arr3[3]; |
unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
//RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
static char dis_zeile = 0; |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++dis_zeile == 4) |
{ |
SendOutData('4',0,&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
dis_zeile = -1; |
} |
else SendOutData('0' + dis_zeile,0,&DisplayBuff[20 * dis_zeile],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/uart.h |
---|
0,0 → 1,90 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern int Debug_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern unsigned char MotorTest[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/Flight-Ctrl_V0_64_3_GPS_work_Jochen/version.txt |
---|
0,0 → 1,76 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |