/tags/V0.70d/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/tags/V0.70d/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 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; |
} |
/tags/V0.70d/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 |
/tags/V0.70d/Hex-Files/Flight-Ctrl_MEGA644_V0_70c.hex |
---|
0,0 → 1,2334 |
:100000000C9467020C9482020C9482020C9482027B |
:100010000C9482020C9482020C9482020C94820250 |
:100020000C9482020C94FA0D0C9482020C94DB0D59 |
:100030000C94411A0C9482020C9482020C94820259 |
:100040000C9482020C9482020C94A30C0C948202F5 |
:100050000C9445050C9482020C940F050C948202BA |
:100060000C941F100C9482020C945F190C94820261 |
:1000700086198B19A219AE19BC19B319BC19DA1952 |
:10008000011AEC19EE19081AF619011AF119F319E7 |
:10009000081AF619011A031A051A081A0C1A0A0D79 |
:1000A000466C69676874436F6E74726F6C0A0D48B2 |
:1000B000617264776172653A25642E25640A0D5376 |
:1000C0006F6674776172653A5625642E25642563E0 |
:1000D00020000A0D3D3D3D3D3D3D3D3D3D3D3D3D0D |
:1000E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D40 |
:1000F0003D3D000A0D496E69742E20454550524F12 |
:100100004D3A2047656E6572696572652044656683 |
:1001100061756C742D506172616D657465722E2EFF |
:100120002E000A0D414343206E69636874206162AA |
:100130006765676C696368656E21000A0D42656ECC |
:1001400075747A6520506172616D65746572736152 |
:10015000747A202564000A0D4162676C65696368E2 |
:10016000204C756674647275636B73656E736F7221 |
:100170002E2E004F4B0A0D000A0D537465756572E3 |
:10018000756E673A200048656164696E67486F6CF8 |
:1001900064004E65757472616C000A0A0D002E00D1 |
:1001A0005B25695D005B25695D002B204D696B72E5 |
:1001B0006F4B6F70746572202B0048573A56256458 |
:1001C0002E25642053573A25642E25642563005359 |
:1001D000657474696E673A202564200028632920BD |
:1001E000486F6C676572204275737300486F65686D |
:1001F000653A202020202025356900536F6C6C481B |
:100200006F6568653A20253569004C7566746472BF |
:1002100075636B3A20253569004F666620202020E3 |
:1002200020203A20253569004B65696E652000481D |
:10023000F668656E726567656C756E6700616B74F4 |
:100240002E204C616765004E69636B3A20202020A8 |
:10025000202025356900526F6C6C3A202020202028 |
:1002600020253569004B6F6D706173733A20202033 |
:10027000253569004B313A25346920204B323A2527 |
:10028000346920004B333A25346920204B343A2519 |
:10029000346920004B353A25346920204B363A2505 |
:1002A000346920004B373A25346920204B383A25F1 |
:1002B000346920004E693A2534692020526F3A256E |
:1002C0003469200047733A253469202047693A256C |
:1002D0003469200050313A253469202050323A25C3 |
:1002E0003469200050333A253469202050343A25AF |
:1002F000346920004779726F202D2053656E736F2B |
:1003000072004E69636B20253469202825336929E2 |
:1003100000526F6C6C202534692028253369290030 |
:100320004769657220253469202825336929004EE4 |
:1003300069636B2025346920282533692900526FB1 |
:100340006C6C2025346920282533692900476965AC |
:100350007220253469202825336929004E69636B92 |
:100360002025346920282533692928253369290067 |
:10037000526F6C6C20253469202825336929282583 |
:10038000336929004769657220253469202825339F |
:100390006929282533692900414343202D205365CD |
:1003A0006E736F72004E69636B20253469202825B7 |
:1003B00033692900526F6C6C20253469202825335D |
:1003C000692900486F63682025346920282533692E |
:1003D00029005370616E6E756E673A20202535696D |
:1003E00000456D70662E506567656C3A253569006D |
:1003F0004B6F6D70617373202020202020200052ED |
:1004000069636874756E673A2020253569004D650B |
:100410007373776572743A202025356900537461CF |
:1004200072743A202020202025356900506F7469AD |
:10043000313A202025336900506F7469323A202008 |
:1004400025336900506F7469333A202025336900E1 |
:10045000506F7469343A20202533690053657276F1 |
:100460006F202000536574706F696E7420202533EF |
:1004700069005374656C6C756E673A2025336900AA |
:1004800052616E67653A2533692D253369004578D9 |
:100490007465726E436F6E74726F6C2020004E69CB |
:1004A0003A2534692020526F3A2534692000477379 |
:1004B0003A253469202047693A2534692000486983 |
:1004C0003A253469202043663A25346920001124F6 |
:1004D0001FBECFEFD0E1DEBFCDBF13E0A0E0B1E0A3 |
:1004E000E0E1FFE802C005900D92A43BB107D9F707 |
:1004F00018E0A4EBB3E001C01D92AD36B107E1F7FF |
:100500000C94F4020C940000FB01863008F085E0A6 |
:10051000489FD0011124AC59BF4F842F99270197D0 |
:1005200024F00E9474470192FACF0E94FB44089580 |
:10053000282FFB01863008F025E0429FD0011124CE |
:10054000AC59BF4F842F9927019724F001900E9446 |
:100550007C47FACFA2E0B0E0022E0E947C470E94C6 |
:10056000FB440895A2E0B0E09D010E947447802DF5 |
:10057000863028F082E0D901082E0E947C47992716 |
:10058000089580917807E82FFF27EE0FFF1FE65BA5 |
:10059000F84F808191818D5E9F4F14F0109202017F |
:1005A000808191818A5B9F4FBCF4809102018823F6 |
:1005B00099F481E080930201809147068F5F8093D8 |
:1005C0004706853038F088EE93E09093D40380930B |
:1005D000D30302C00E94361D80914706992790934D |
:1005E0001507809314070895CFEFD0E1DEBFCDBF8C |
:1005F00014B815B897EEE92E93E0F92E8EEC9FEF24 |
:10060000E80EF91EF7FEFACF88EEE82E83E0F82E0A |
:10061000189B06C0199B02C08DE003C08BE001C08F |
:100620008AE08093010181E887B98FEF88B98BE177 |
:1006300084B981E085B98EE38AB9579A87EF8BB97F |
:1006400084B7877F84BF8091600088618093600059 |
:100650001092600080ED97E09093D4038093D303D1 |
:10066000109233041092320410924F0710924E07EA |
:10067000109235041092340410923704109236040C |
:10068000809101018A3011F4289801C0289A0E94B3 |
:100690008A0D0E949C080E942C1A0E94180F0E942A |
:1006A00028190E94474278941092370686E4809376 |
:1006B000380688E08093390681E080933A0683E625 |
:1006C00090E09F938F9386E490E09F938F931F9287 |
:1006D0001F92809101016AE00E940447892F9927A7 |
:1006E0009F938F93809101010E94044799279F93C4 |
:1006F0008F938EE990E09F938F931F920E94190A27 |
:100700008DB79EB70D960FB6F8949EBF0FBE8DBFE6 |
:1007100082ED90E09F938F931F920E94190A80911F |
:1007200001010F900F900F908C3010F4299A01C0A6 |
:10073000299801E010E0D8010E947447802D873489 |
:1007400061F183EF90E09F938F931F920E94190AAB |
:100750000E942B1BC0E00F900F900F90C23039F019 |
:10076000C33019F40E948B1C04C0C43010F00E94E6 |
:10077000DA1B43E568E777E08C2F0E949802CF5F91 |
:10078000C63060F3A2E0B0E083E0082E0E947C4710 |
:1007900087E4D801082E0E947C47A4E0B0E00E94C4 |
:1007A0007447802D853050F082E291E09F938F93C3 |
:1007B0001F920E94190A0F900F900F900E94B20290 |
:1007C00043E568E777E00E9484020E94B20299271D |
:1007D0009F938F938BE391E09F938F931F920E943F |
:1007E000190A809180070F900F900F900F900F9033 |
:1007F00080FF20C086E591E09F938F931F920E9417 |
:10080000190A88EE93E00E94810D7C010E941E0F60 |
:100810000F900F900F90C7010E94B10D8823D9F35C |
:1008200083E791E09F938F931F920E94190A0F9084 |
:100830000F900F900E944E25809101018A3011F493 |
:10084000289801C0289A80ED97E09093D403809374 |
:10085000D30385E58093490688E791E09F938F93C2 |
:100860001F920E94190A809180070F900F900F909D |
:1008700082FF03C086E891E002C082E991E09F9385 |
:100880008F931F920E94190A0F900F900F908AE980 |
:1008900091E09F938F931F920E94190A0E94281340 |
:1008A00088E893E1909392038093910381E0809391 |
:1008B00048060F900F900F908091D703882309F47A |
:1008C000A6C01092D70380914706882319F00E9492 |
:1008D000C10202C00E948B2A0E94EE2620910101D3 |
:1008E0002A3011F4289801C0289A809103038823A4 |
:1008F00021F081508093030312C08093B40380934E |
:10090000B5038093530610921604109215041092AA |
:100910001404109213041092120410921104809186 |
:100920003804882329F0809138048150809338045A |
:100930008091910390919203892B01F585E090E0DD |
:1009400090939203809391030E9442198091060331 |
:10095000909107038F5F9F4FF9F480912F048823B4 |
:10096000D9F080E197E29093D4038093D30380E899 |
:1009700090E090930703809306030EC0809191034B |
:1009800090919203019790939203809391032A3060 |
:1009900011F4289801C0289A8091D703882321F068 |
:1009A00080912F04882311F40E94C2080E942F070F |
:1009B000C7010E94B10D882341F180919007282F33 |
:1009C00033278091170390911803821793079CF4A3 |
:1009D00080910603909107038F5F9F4F61F480E73A |
:1009E00097E19093D4038093D30380E093E09093B6 |
:1009F0000703809306030E942F4484E08093D20370 |
:100A000084E190E00E94810D7C010E940A45809162 |
:100A1000D203882309F050CF0E9470444DCF1F921B |
:100A20000F920FB60F9211248F939F93EF93FF9322 |
:100A3000809105038823E1F48091C8039091C90354 |
:100A400001969093C9038093C803FC01E75FFA4FB6 |
:100A5000E081ED3019F08639910539F41092C9031F |
:100A60001092C80381E080930503E093C60004C0A0 |
:100A70001092C9031092C803FF91EF919F918F913B |
:100A80000F900FBE0F901F9018951F920F920FB6E8 |
:100A90000F9211242F933F934F935F938F939F93C4 |
:100AA000AF93BF93EF93FF9390E08091C600809344 |
:100AB000C3035091CE03563910F09093CF03809129 |
:100AC000C3038D3009F05FC08091CF03823009F0FD |
:100AD0005AC09093CF03852F99278A5A994FFC01CA |
:100AE000329740812091CA033091CB03241B3109F6 |
:100AF000DC0111978C91281B3109C9019F709093DB |
:100B0000CB038093CA0346E0969587954A95E1F713 |
:100B1000982F935C9093CC032F733070235C2093B9 |
:100B2000CD038081981729F48C91281711F491E056 |
:100B300006C090E08091C0038F5F8093C0038091D6 |
:100B4000C203882309F06EC0992309F46BC081E0C9 |
:100B50008093C2035093BF03E52FFF27EA5AF94F52 |
:100B60008DE0808380915806823509F05BC088E172 |
:100B700090E02CE00FB6F894A895809360000FBE2B |
:100B8000209360004FC02091CF03822F992781309E |
:100B90009105F9F0823091051CF4892B21F040C0B9 |
:100BA000029711F13DC08091C303833239F48091E3 |
:100BB000C203882319F481E08093CF038091C3039B |
:100BC0008093560681E08093CE038091C3039927DA |
:100BD00022C02F5F2093CF03E52FFF27EA5AF94F5A |
:100BE0008091C303808309C0E52FFF27EA5AF94F9C |
:100BF0008091C3038083563920F45F5F5093CE0306 |
:100C000002C01092CF032091C3038091CA03909138 |
:100C1000CB03820F911D9093CB038093CA0302C034 |
:100C20001092CF03FF91EF91BF91AF919F918F9160 |
:100C30005F914F913F912F910F900FBE0F901F909A |
:100C40001895AC01A0E0B0E09D01A817B90748F4E1 |
:100C5000E9E0F5E08191280F311D1196A417B50741 |
:100C6000C8F33F70FD01E75FFA4FC90156E0969562 |
:100C700087955A95E1F7835C80831196FD01E75FC4 |
:100C8000FA4F2F733070822F835C8083A65FBA4F38 |
:100C90008DE08C9310920503809109058093C60026 |
:100CA00008951F93CF93DF93382FEA01722F10E03E |
:100CB00083E28093090560930A0530930B05A3E056 |
:100CC000B0E0772309F458C0772311F4972F07C0B9 |
:100CD000FE01E10FF11D1F5F9081715011F4472F4C |
:100CE0000EC0FE01E10FF11D1F5F4081715039F010 |
:100CF000FE01E10FF11D1F5F6081715001C0672F80 |
:100D0000FD01E75FFA4F892F86958695835C808386 |
:100D10001196FD01E75FFA4F892F99278370907034 |
:100D200024E0880F991F2A95E1F755279A0194E04E |
:100D3000369527959A95E1F7822B835C80831196EF |
:100D4000FD01E75FFA4F4F705070440F551F440F7D |
:100D5000551F862F992726E0969587952A95E1F7C6 |
:100D6000842B835C80831196FD01E75FFA4F6F73DC |
:100D7000635C60831196A5CFCD010E942106DF91AF |
:100D8000CF911F9108951F93CF93DF93EC0110E053 |
:100D9000662309F460C0A22FBB271297E42FFF2718 |
:100DA000EA5AF94F30813D534F5FE42FFF27EA5A4B |
:100DB000F94F50815D534F5FE42FFF27EA5AF94FF7 |
:100DC00070817D534F5FE42FFF27EA5AF94FE0818E |
:100DD000ED534F5F842F9927A817B907E4F1832FAC |
:100DE0009927880F991F880F991F352F32953F70CB |
:100DF000382B852F99278F709070F4E0880F991FFA |
:100E0000FA95E1F7572F56955695582B872F992726 |
:100E10008370907076E0880F991F7A95E1F78E2B9A |
:100E200061506F3FC1F0FE01E10FF11D30831F5F84 |
:100E300061506F3F81F0FE01E10FF11D50831F5F94 |
:100E400061506F3F41F0FE01E10FF11D80831F5F94 |
:100E5000662309F0A3CFDF91CF911F910895CF931F |
:100E6000DF93CDB7DEB724970FB6F894DEBF0FBE81 |
:100E7000CDBF8091C203882309F443C180915806F5 |
:100E800099278836910509F492C089369105C4F4F2 |
:100E90008236910509F462C08336910544F48B349F |
:100EA000910559F18136910509F44CC028C183366A |
:100EB000910509F465C08736910509F4B0C01FC1DA |
:100EC000813791054CF48C3691050CF0D2C08B36ED |
:100ED000910509F490C013C18437910509F482C0CB |
:100EE000853791052CF48137910509F49CC007C121 |
:100EF0008637910509F48FC002C12091BF0343E0FA |
:100F000062E0CE0101960E94C30689819A81909386 |
:100F10004B0480934A0480914A0490914B042091A1 |
:100F2000480430914904821B930B845E9D4F68E610 |
:100F300071E00E942447845B904090934704809323 |
:100F40004604DDC02091BF0343E062E0CE0103967A |
:100F50000E94C3068B818093040359C02091BF0374 |
:100F600043E06BE089E496E00E94C3068091FE03B3 |
:100F700090914B06892B8093FE038091520645C0C9 |
:100F80002091BF0343E06BE089E496E00E94C30632 |
:100F90008091FE0390914B06892B8093FE038091F4 |
:100FA000520680932E0781E08093C50330C02091C4 |
:100FB000BF0343E062E0CE0103960E94C306809126 |
:100FC000FE039B81892B8093FE038C818F3F21F44C |
:100FD00081E08093BC0302C01092BC0381E0809347 |
:100FE000C6038DC02091BF0343E064E088EB93E02B |
:100FF0000E94C3060CC02091BF0343E064E084EB71 |
:1010000093E00E94C3068091B70380932E078FEF71 |
:101010008093030374C081E08093C40370C081E0B7 |
:101020008093C7036CC02091BF0343E062E0CE0110 |
:1010300003960E94C306809105038823E1F38B8108 |
:101040008F3F61F0863010F085E08B8343E568E7E1 |
:1010500077E08B810E9484028B8102C00E94B202E1 |
:1010600023E548E757E060910805855B0E9451063B |
:1010700046C02091BF0343E063E588E797E00E9404 |
:10108000C3068091580643E568E777E08B560E94D7 |
:101090009802A2E0B0E0809158068B56082E0E947C |
:1010A0007C478091A3079927AA27BB27BC01CD01C4 |
:1010B00024EC39E040E050E00E94E546DC01CB0141 |
:1010C00080938B0390938C03A0938D03B0938E0336 |
:1010D0008091A4079927AA27BB27BC01CD010E94B4 |
:1010E000E546DC01CB018093870390938803A093AE |
:1010F0008903B0938A030E94B2020E94361D1092A7 |
:10110000C20324960FB6F894DEBF0FBECDBFDF91A9 |
:10111000CF910895CF93C82F8A3019F48DE00E94A3 |
:101120008A088091C00085FFFCCFC093C60080E094 |
:1011300090E0CF910895089588E18093C100809157 |
:10114000C00082608093C0008091C100806880935D |
:10115000C1008091C10080648093C1008AE28093C5 |
:10116000C40088EC90E00E94810D90933606809335 |
:1011700035068CED90E00E94810D9093550680938A |
:101180005406089580910503882309F4F7C08091DF |
:10119000C703882371F080910503882351F02BE069 |
:1011A00049E456E06091080587E40E9451061092D8 |
:1011B000C70380915406909155060E94B10D882373 |
:1011C00009F44CC080910503882309F447C080913D |
:1011D000840490918504A0918604B0918704BC0199 |
:1011E000CD012CE630E040E050E00E9459473093BA |
:1011F00042062093410680917C0490917D04A09149 |
:101200007E04B0917F04BC01CD012CE630E040E0CB |
:1012100050E00E9459473093440620934306809142 |
:1012200020048093450680911F048093460628E0A1 |
:1012300041E456E06091080587E70E9451068091DD |
:101240004706853018F086E08093470683E690E0F5 |
:101250000E94810D90935506809354068091350627 |
:10126000909136060E94B10D882321F48091C50328 |
:101270008823B1F080910503882391F022E44CEE9D |
:1012800056E06091080584E40E9451061092C5035F |
:101290008AEF90E00E94810D909336068093350688 |
:1012A000609104036F3F91F0862F992734E0880FF7 |
:1012B000991F3A95E1F78D5F9E4F605D20E1AC018B |
:1012C00081E40E9451068FEF8093040390912E07D2 |
:1012D0009923A1F080910503882381F083E2809314 |
:1012E000090590930A058DE080930B051092050384 |
:1012F00010922E07809109058093C6008091C60345 |
:10130000882351F180910503882331F10E94311324 |
:101310001092C6033091BD03832F8F5F8093BD036E |
:10132000843021F06091BC03662359F026E14AE441 |
:1013300057E060E084E30E9451068FEF8093BD0385 |
:101340000BC024E1829FC0011124875E9C4FAC0139 |
:10135000832F8F5C0E9451068091C403882371F013 |
:1013600080910503882351F02AE047E356E060911D |
:10137000080586E50E9451061092C4030895982F2F |
:1013800080912F07813069F48091FF03E82FFF27B8 |
:10139000E75EFC4F90838F5F8093FF0321E030E096 |
:1013A00005C0892F0E948A08282F3327C901089574 |
:1013B0000F931F93CF93DF938C01EB01672B39F0D1 |
:1013C000F80181918F010E94BF092197C9F7DF9130 |
:1013D000CF911F910F9108950F931F93CF93DF9398 |
:1013E0008C01EB01672B41F0F8010F5F1F4F8491D7 |
:1013F0000E94BF092197C1F7DF91CF911F910F91F3 |
:101400000895CF93C82F181634F480E20E94BF09C4 |
:10141000C1501C16D4F3CF910895CF93C82F18163E |
:1014200034F480E30E94BF09C1501C16D4F3CF915D |
:1014300008952F923F924F925F926F927F928F9278 |
:101440009F92AF92BF92CF92DF92EF92FF920F9353 |
:101450001F93CF93DF93CDB7DEB7E0970FB6F89425 |
:10146000DEBF0FBECDBF26968FAD26972896EEAD78 |
:10147000FFAD28971CA61DA61EA61FA680932F07AA |
:10148000A8E46A2E712C6C0E7D1E5F01C50105C09B |
:10149000053239F00894A11CB11CF5010491002318 |
:1014A000B9F7B501681B790B11F00E94EC09002314 |
:1014B00009F430C20894A11CB11C552458AA252C4B |
:1014C0001FEF59A6F5010894A11CB11C0491053722 |
:1014D00021F0802F80628837F1F450FE0EC0F301B6 |
:1014E00024E030E0620E731E80819181A281B3817D |
:1014F0008CA79DA7AEA7BFA70EC0F301A2E0B0E0E6 |
:101500006A0E7B1E808191819C01442755272CA760 |
:101510003DA74EA75FA7003221F489A5882391F645 |
:101520001BC0033211F438E081C00A3211F00D32D1 |
:1015300089F40A3251F4F30142E050E0640E751E62 |
:10154000208022200CF0BECF219450E1552A8FED4F |
:101550005822B8CF0B3211F409A7B4CF0E32C1F51F |
:10156000F5010894A11CB11C04910A3279F4F3012D |
:10157000A2E0B0E06A0E7B1E60817181BFEF6F3F19 |
:101580007B0714F46FEF7FEF162F9CCF60E070E0C5 |
:10159000802F80538A30A0F4CB01F3E0880F991F8D |
:1015A000FA95E1F7860F971F680F791F600F711D7D |
:1015B00060537040F5010894A11CB11C0491E8CF60 |
:1015C000EFEF6F3F7E0714F46FEF7FEF162F7FCFA3 |
:1015D000003329F454FC76CFF0E25F2A73CF802FDA |
:1015E00081538930D8F460E070E0CB01E3E0880FEC |
:1015F000991FEA95E1F7860F971F680F791F600F13 |
:10160000711D60537040F5010894A11CB11C049138 |
:10161000802F80538A3048F3262E59CF083619F48C |
:1016200024E0522A4FCF0C3619F431E0532A4ACF26 |
:10163000033661F44E010894811C911CF30142E0D1 |
:1016400050E0640E751E808189831BC1043421F033 |
:10165000043611F00936B1F5043411F451E0552A7D |
:1016600050FE0AC0F30184E090E0680E791E2081EC |
:101670003181428153810CC0F30142E050E0640E9D |
:10168000751E808191819C01442737FD4095542F20 |
:101690002CA73DA74EA75FA78CA59DA5AEA5BFA56E |
:1016A000B7FF0DC0B095A095909581959F4FAF4F16 |
:1016B000BF4F8CA79DA7AEA7BFA78DE289A77AE0F1 |
:1016C000472E7BC00F3411F00F3639F40F3411F46C |
:1016D00091E0592A68E0462E6FC00037A1F4F3016B |
:1016E000A2E0B0E06A0E7B1E808191819C014427BC |
:1016F00055272CA73DA74EA75FA750E1452E30E404 |
:10170000532A08E759C00337C1F5F30142E050E01E |
:10171000640E751E808091808114910489F44E01BD |
:101720000894811C911C88E289838EE6F4018183F0 |
:1017300085E78B838CE68C838D8389E28E831F8281 |
:1017400017FD13C0812F992787FD9095AC0160E0AC |
:1017500070E0C4010E947045009729F0D82ED81877 |
:101760001D150CF090C0D12E8EC0F4010190002008 |
:10177000E9F73197DE2ED81886C0053511F0053708 |
:1017800039F4053511F4F1E05F2A4AE0442E14C023 |
:10179000083519F0083709F06CC030E1432E53FECC |
:1017A0000BC02CA53DA54EA55FA521153105410512 |
:1017B000510511F030E4532A19A618AB17FD02C0E9 |
:1017C0004FED542229E2822E912C8C0E9D1E8CA569 |
:1017D0009DA5AEA5BFA50097A105B10521F498A9C7 |
:1017E000992309F43FC0C42CDD24EE24FF243324C4 |
:1017F0002CA53DA54EA55FA52C153D054E055F0505 |
:1018000010F091E0392E6CA57DA58EA59FA5A701AE |
:1018100096010E943747DC01CB01182F8A3010F463 |
:10182000105D04C0195A083509F41F7DD4011E93B8 |
:101830004D016CA57DA58EA59FA5A70196010E94CF |
:1018400037472CA73DA74EA75FA7332081F6B8E006 |
:101850004B1641F453FE06C0103321F080E3F4012F |
:1018600082934F01CE010196D82ED818F8E2DF0EF0 |
:101870000BC0002309F44EC04E010894811C911C3A |
:10188000098381E0D82E19A61D2DC8A8CD18C7FC44 |
:10189000CC2489A5882311F01F5F02C056FC1E5F6F |
:1018A0001C0DE52CFF24C70180739070892B21F457 |
:1018B000822D811B0E94010A89A5882329F061E0FD |
:1018C00070E0CE01899609C0E6FE09C080E38AA7D0 |
:1018D0000BA762E070E0CE018A960E94D809C7018A |
:1018E00080739070809721F4822D811B0E940D0AD5 |
:1018F0008C2D0E940D0A8D2D992787FD9095BC0196 |
:10190000C4010E94D809E4FEC1CD822D811B0E9432 |
:10191000010ABCCDE0960FB6F894DEBF0FBECDBF76 |
:10192000DF91CF911F910F91FF90EF90DF90CF90BB |
:10193000BF90AF909F908F907F906F905F904F90EF |
:101940003F902F9008951F920F920FB60F9211247F |
:101950002F933F935F936F937F938F939F93AF9357 |
:10196000BF93EF93FF938091D203882329F0809156 |
:10197000D20381508093D2038091DA038150809307 |
:10198000DA038F3FB9F489E08093DA0380910A0388 |
:101990008F5F817080930A03882319F481E080931C |
:1019A000D7038091D8039091D90301969093D903DE |
:1019B0008093D8038091D3039091D4030297C8F009 |
:1019C0008091D3039091D40301979093D403809393 |
:1019D000D3038091D3039091D403209106033091D7 |
:1019E000070382239323892B11F021E009C020E013 |
:1019F00007C020E08FEF9FEF9093070380930603CB |
:101A000080910101222331F08A3011F45A9A07C0E3 |
:101A1000479A05C08A3011F45A9801C047988091BE |
:101A2000800783FF5EC086B19927FC01E071F070EA |
:101A300084FF0AC08091D5039091D60301969093BC |
:101A4000D6038093D5034DC08091D5039091D603E2 |
:101A5000892B69F18091D5039091D6038A569140E4 |
:101A600030F58091D5039091D60369E270E00E9431 |
:101A700010478091D5039091D603860F971F9093BE |
:101A8000D6038093D5038091D5039091D6030B970D |
:101A900050F08091D5039091D6030A9790934B0410 |
:101AA00080934A0404C0F0934B04E0934A0480916D |
:101AB0004A0490914B042091480430914904821BC0 |
:101AC000930B845E9D4F68E671E00E942447845B1F |
:101AD000904090934704809346041092D60310924E |
:101AE000D503FF91EF91BF91AF919F918F917F911E |
:101AF0006F915F913F912F910F900FBE0F901F90AC |
:101B000018952091D8033091D903280F391FC901A6 |
:101B1000019608958AE090E00E94810D9093DC0385 |
:101B20008093DB0382E085BD83EA84BD17BC88E730 |
:101B300088BD86E086BD83EC8093B00084E080930E |
:101B4000B1008091700082608093700080916E007F |
:101B5000816080936E008AE08093B3001092B2009F |
:101B600008952091D8033091D903821B930B892FBC |
:101B700099278695807490700895CF93DF930E9483 |
:101B8000810DEC01CE010E94B10D8823D9F3DF91C4 |
:101B9000CF910895CF93DF930E94810DEC0103C094 |
:101BA0008FEE80937A00CE010E94B10D8823C1F39D |
:101BB000DF91CF9108951F920F920FB60F921124CB |
:101BC0008F939F938091080390910903892B11F0C3 |
:101BD0005F9A01C05F9883E08093B00080917000AD |
:101BE0008E7F809370009F918F910F900FBE0F900A |
:101BF0001F9018951F920F920FB60F9211242F93DA |
:101C00003F934F935F936F937F938F939F93AF9384 |
:101C1000BF93CF93DF93EF93FF938091080390914D |
:101C20000903049709F0A6C080E390E09093D103E4 |
:101C30008093D00380910C0390910D039C01220F9F |
:101C4000331F280F391F809179039927880F991F17 |
:101C5000280F391F37FF02C02D5F3F4FC9019595EF |
:101C600087959595879590930D0380930C03EC01D0 |
:101C7000E096D093D103C093D0038091BA0790919E |
:101C80009A072091840430918504409186045091F4 |
:101C9000870480FF18C0892F9927AA27BB27BC017A |
:101CA000CD010E94E54697FF04C06150704C8F4FF4 |
:101CB0009F4F5EE095958795779567955A95D1F7F3 |
:101CC000C60FD71F17C0892F9927AA27BB27BC018A |
:101CD000CD010E94E54697FF04C06150704C8F4FC4 |
:101CE0009F4F4EE095958795779567954A95D1F7E3 |
:101CF000C61BD70BD093D103C093D00380919B0711 |
:101D000043E0849FC00111242091D0033091D1037E |
:101D10002817390740F080919C07849FC001112447 |
:101D20008217930720F49093D1038093D0032091DE |
:101D3000D0033091D1033093170720931607C901C0 |
:101D40006FEF70E00E9410478D9740F4235B3F4F88 |
:101D50003093D1032093D00383E101C080E68093C8 |
:101D60000B038091D0039091D10380958093B300B1 |
:101D700083EC40C08091080390910903892B39F1CD |
:101D80008091080390910903049708F52091D003EE |
:101D90003091D1032F3F310561F058F05F9A83E015 |
:101DA0008093B0002F5F30403093D1032093D00355 |
:101DB00023C083E88093B00080910B038093B3002D |
:101DC00081E090E0909309038093080315C080910F |
:101DD000080390910903892B79F480919D07992735 |
:101DE000880F991F880F991F909309038093080308 |
:101DF0005F9883E08093B00080910803909109037D |
:101E000001979093090380930803FF91EF91DF916D |
:101E1000CF91BF91AF919F918F917F916F915F9182 |
:101E20004F913F912F910F900FBE0F901F901895DB |
:101E300010927C008FEE80937A0008950F931F9389 |
:101E4000CF93DF9303E010E0D8010E947447802D08 |
:101E5000C82FDD27C531D10508F02A97C7BD84E614 |
:101E600090E00E94CA0D8091110390911203825557 |
:101E7000934010F4C0E0D0E0CA3FD105C0F4C7BD24 |
:101E800082E390E00E94CA0D8EE991E09F938F93C8 |
:101E90001F920E94190A80911103909112030F90D2 |
:101EA0000F900F908458934010F02196E5CFD80101 |
:101EB0000C2E0E947C47C0933D078CE291E00E946B |
:101EC000CA0DDF91CF911F910F9108951F93CF936A |
:101ED000C0E0C093DF03C093DE03C093DD031CE8C2 |
:101EE000C33019F41B3008F019E0C0E08091F4030E |
:101EF0009091F5038C5F934024F4809110038150FE |
:101F00000AC08091F4039091F5038750944034F017 |
:101F1000809110038F5F8093100301C0C1E0809116 |
:101F2000F2039091F3038C5F934024F480910F03AC |
:101F300081500AC08091F2039091F303875094403E |
:101F400034F080910F038F5F80930F0301C0CF5F48 |
:101F50008091F0039091F1038C5F934024F4809181 |
:101F60000E0381500AC08091F0039091F1038750D5 |
:101F7000944034F080910E038F5F80930E0301C074 |
:101F8000CF5F88E0809305040E942E198091100392 |
:101F90008A3030F481E08093DF038AE0809310037D |
:101FA00080911003863F30F081E08093DF0385EF5E |
:101FB0008093100380910F038A3030F481E0809386 |
:101FC000DE038AE080930F0380910F03863F30F099 |
:101FD00081E08093DE0385EF80930F0380910E03F1 |
:101FE0008A3030F481E08093DD038AE080930E0331 |
:101FF00080910E03863F30F081E08093DD0385EF12 |
:1020000080930E03809105048823E1F780933807BD |
:102010008FEE80937A00809138078823E1F31A309D |
:1020200020F48AE090E00E94CA0D115009F058CFC8 |
:1020300086E490E00E94CA0DCF911F9108951F92EF |
:102040000F920FB60F921124EF92FF920F931F93EE |
:102050002F933F934F935F936F937F938F939F93B0 |
:10206000AF93BF93CF93DF93EF93FF9310927A00D8 |
:102070008091F703682F77278F5F8093F703653090 |
:10208000710509F48EC066307105BCF462307105CB |
:1020900009F44AC0633071053CF46115710531F1F2 |
:1020A00061307105C1F1AEC26330710509F446C0FB |
:1020B0006430710509F45DC0A5C26830710509F48A |
:1020C000C3C0693071054CF46630710509F482C0F3 |
:1020D0006730710509F49BC095C26930710509F438 |
:1020E000D0C06A30710509F4EBC18CC280917800D0 |
:1020F000909179009093F9038093F80381E08093A5 |
:10210000F6038091E0039091E10301969093E1033F |
:102110008093E0037BC28091780090917900909346 |
:10212000FB038093FA038EC0809178009091790030 |
:102130009093FD038093FC0384E0BFC1809117035B |
:10214000909118039C01220F331F280F391F809193 |
:102150007800909179000E941047260F371F36951E |
:10216000279536952795309318032093170386E01B |
:10217000A4C18091900490919104209178003091B5 |
:102180007900821B930B90933107809330078091E5 |
:102190003007909131079093EF038093EE0387E02F |
:1021A0008CC18091780090917900209192043091B7 |
:1021B0009304821B930B90933C0780933B07809181 |
:1021C0003B0790913C079093ED038093EC031092B2 |
:1021D000F6031CC2809101012091F8033091F903AC |
:1021E0008A3049F48091780090917900820F931F92 |
:1021F0009695879506C08091780090917900820F1E |
:10220000931F9093F1038093F00381E056C1809176 |
:1022100001012091FA033091FB038A3049F4809147 |
:10222000780090917900820F931F9695879506C04C |
:102230008091780090917900820F931F9093F3031F |
:102240008093F20382E039C1809101012091FC0367 |
:102250003091FD038A3049F48091780090917900A3 |
:10226000820F931F9695879506C080917800909174 |
:102270007900820F931F9093F5038093F40385E018 |
:102280001CC18091780090917900AA2797FDA095B4 |
:10229000BA2FBC01CD010E9423467B018C018091A5 |
:1022A0008A0490918B04A0918C04B0918D049C01C0 |
:1022B000AD01C801B7010E947D45DC01CB01BC0125 |
:1022C000CD010E940646DC01CB019093EB03809385 |
:1022D000EA038091EA039091EB0302970CF446C065 |
:1022E00080918A0490918B04A0918C04B0918D040C |
:1022F00020E030E84BE354E4BC01CD010E942D46C0 |
:1023000088230CF088C080918A0490918B04A0915E |
:102310008C04B0918D042AE037ED43EA5CE3BC0104 |
:10232000CD010E947E45DC01CB0180938A0490930D |
:102330008B04A0938C04B0938D0480910B04909136 |
:102340000C04845F914008F066C080918A049091EB |
:102350008B04A0918C04B0918D042DEC3CEC4CECE2 |
:102360005DE3BC01CD010E947E454BC08091EA0334 |
:102370009091EB038F5F9F4F0CF04DC080918A04CA |
:1023800090918B04A0918C04B0918D0420E030E8F2 |
:1023900049E054E4BC01CD010E9430461816DCF53A |
:1023A00080918A0490918B04A0918C04B0918D044B |
:1023B0002AE037ED43EA5CE3BC01CD010E947D4594 |
:1023C000DC01CB0180938A0490938B04A0938C044E |
:1023D000B0938D0480910B0490910C04845F914024 |
:1023E000D0F480918A0490918B04A0918C04B091D8 |
:1023F0008D042DEC3CEC4CEC5DE3BC01CD010E9466 |
:102400007D45DC01CB0180938A0490938B04A093DB |
:102410008C04B0938D0481E08093E4038091780074 |
:102420009091790090933307809332078091EA036B |
:102430009091EB039C01442737FD4095542F8091E8 |
:102440004C0490914D04A0914E04B0914F04820F22 |
:10245000931FA41FB51F80934C0490934D04A09329 |
:102460004E04B0934F0420914C0430914D044091A0 |
:102470004E0450914F0457FF04C021503C4F4F4F22 |
:102480005F4FAAE05595479537952795AA95D1F7BF |
:1024900080914C0490914D04A0914E04B0914F0452 |
:1024A000821B930BA40BB50B80934C0490934D04AB |
:1024B000A0934E04B0934F0483E08093F603A6C02C |
:1024C00080914007909141072091780030917900E8 |
:1024D000820F931F909341078093400780913807A4 |
:1024E0008F5F8093380780913807853008F48AC061 |
:1024F000809178009091790090931203809311035A |
:10250000109238078091E2039091E303BC01F3E05D |
:10251000660F771FFA95E1F7681B790B80918203AC |
:10252000482F552780913407909135072091400717 |
:1025300030914107821B930B20912D0430912E0482 |
:10254000821B930B489F9001499F300D589F300D7F |
:102550001124620F731F77FF02C0695F7F4FE3E0B2 |
:1025600075956795EA95E1F77093E3036093E2034D |
:102570008091400790914107EC01EE27D7FDE0954F |
:10258000FE2F2091130330911403409115035091B5 |
:102590001603DA01C901880F991FAA1FBB1F820FFA |
:1025A000931FA41FB51FC80FD91FEA1FFB1FF7FFFA |
:1025B00003C02396E11DF11D82E0F595E795D795BF |
:1025C000C7958A95D1F7C0931303D0931403E09372 |
:1025D0001503F09316038091130390911403A091B7 |
:1025E0001503B09116039C01809134079091350733 |
:1025F000821B930B90932E0480932D04109241071D |
:10260000109240071092F6031092F7038091F603A0 |
:1026100080937C008091F703882319F08FEE8093DC |
:102620007A00FF91EF91DF91CF91BF91AF919F9190 |
:102630008F917F916F915F914F913F912F911F915A |
:102640000F91FF90EF900F900FBE0F901F90189575 |
:1026500090E2E9E1F3E08FE49193815087FFFCCFB2 |
:1026600008951F93CF93DF938091FE0380FF0FC0E7 |
:1026700080910204882311F0815002C0809173037D |
:10268000809302040E9428138FEF8093BD038091F2 |
:10269000FE0381FF0AC0809102048F5F80930204D1 |
:1026A0000E9428138FEF8093BD038091FE0399272A |
:1026B00080FF04C081FF02C01092020480910204D6 |
:1026C000282F33278A3040F481E18093FF033F9322 |
:1026D0002F9380EA91E007C080E18093FF033F934E |
:1026E0002F9385EA91E09F938F9381E08F930E94CF |
:1026F000190A0F900F900F900F900F908091020485 |
:10270000C82FDD27C530D10509F46AC2C630D1050E |
:10271000ACF4C230D10509F4E9C0C330D10534F4BA |
:10272000209739F1219709F477C087C5C330D105C7 |
:1027300009F44EC1249709F4B7C17FC5C830D1054B |
:1027400009F433C4C930D10544F4C630D10509F4C5 |
:10275000A6C3279709F408C470C5CA30D10509F487 |
:10276000BCC4CA30D1050CF463C42B9709F4FBC474 |
:1027700064C51092FF038AEA91E09F938F9311E062 |
:102780001F930E94190A84E18093FF030F900F901A |
:102790000F9083E690E09F938F9386E490E09F9361 |
:1027A0008F93DF93CF93809101016AE00E940447E9 |
:1027B000892F99279F938F93809101010E9404474D |
:1027C00099279F938F938AEB91E09F938F931F9309 |
:1027D0000E94190A88E28093FF038DB79EB70D9679 |
:1027E0000FB6F8949EBF0FBE8DBF0E94B20299270C |
:1027F0009F938F938FEC91E09F938F931F930E94F1 |
:10280000190A8CE38093FF030F900F900F900F90A5 |
:102810000F908CED91E061C08091800780FF4AC0ED |
:102820001092FF0380912D0490912E049F938F931B |
:102830008CEE91E09F938F9311E01F930E94190AF1 |
:1028400084E18093FF030F900F900F900F900F90F3 |
:1028500080912B0490912C049F938F938BEF91E0A8 |
:102860009F938F931F930E94190A88E28093FF031E |
:102870000F900F900F900F900F90809111039091F7 |
:1028800012039F938F938AE092E09F938F931F93FD |
:102890000E94190A8CE38093FF030F900F900F9012 |
:1028A0000F900F9080913D0799279F938F9389E117 |
:1028B00092E008C484E18093FF0388E292E09F9352 |
:1028C0008F9311E01F930E94190A88E28093FF03FF |
:1028D0000F900F900F908FE292E09F938F931F9332 |
:1028E0000E94190A0F900F900F90ACC41092FF0332 |
:1028F0008DE392E09F938F93C1E0CF930E94190ADA |
:1029000084E18093FF030F900F900F9080918404D7 |
:1029100090918504A0918604B0918704B7FF04C00C |
:1029200081509C4FAF4FBF4FFAE0B595A795979553 |
:102930008795FA95D1F7BF93AF939F938F9387E4D1 |
:1029400092E09F938F93CF930E94190A88E280931D |
:10295000FF038DB79EB707960FB6F8949EBF0FBEC4 |
:102960008DBF80917C0490917D04A0917E04B091F4 |
:102970007F04B7FF04C081509C4FAF4FBF4FEAE0C8 |
:10298000B595A79597958795EA95D1F7BF93AF939E |
:102990009F938F9386E592E09F938F93CF930E94AE |
:1029A000190A8CE38093FF038DB79EB707960FB685 |
:1029B000F8949EBF0FBE8DBF80914A0490914B0446 |
:1029C0009F938F9385E692E09F938F93CF937DC3E0 |
:1029D0001092FF0380914E0790914F079F938F9322 |
:1029E00080914C0790914D079F938F9384E792E0DD |
:1029F0009F938F9311E01F930E94190A84E18093A3 |
:102A0000FF038DB79EB707960FB6F8949EBF0FBE13 |
:102A10008DBF80915207909153079F938F93809120 |
:102A20005007909151079F938F9384E892E09F9372 |
:102A30008F931F930E94190A88E28093FF038DB73A |
:102A40009EB707960FB6F8949EBF0FBE8DBF8091BC |
:102A50005607909157079F938F93809154079091B9 |
:102A600055079F938F9384E992E09F938F931F93D1 |
:102A70000E94190A8CE38093FF038DB79EB70796D7 |
:102A80000FB6F8949EBF0FBE8DBF80915A079091EC |
:102A90005B079F938F9380915807909159079F935D |
:102AA0008F9384EA92E0BBC31092FF038091790771 |
:102AB000E82FFF27EE0FFF1FE65BF84F8081918123 |
:102AC0009F938F9380917807E82FFF27EE0FFF1FCA |
:102AD000E65BF84F808191819F938F9384EB92E026 |
:102AE0009F938F9311E01F930E94190A84E18093B2 |
:102AF000FF038DB79EB707960FB6F8949EBF0FBE23 |
:102B00008DBF80917B07E82FFF27EE0FFF1FE65B4D |
:102B1000F84F808191819F938F9380917A07E82F5E |
:102B2000FF27EE0FFF1FE65BF84F808191819F9397 |
:102B30008F9384EC92E09F938F931F930E94190AC6 |
:102B400088E28093FF038DB79EB707960FB6F8947F |
:102B50009EBF0FBE8DBF80917D07E82FFF27EE0F30 |
:102B6000FF1FE65BF84F808191819F938F93809147 |
:102B70007C07E82FFF27EE0FFF1FE65BF84F8081F1 |
:102B800091819F938F9384ED92E09F938F931F93F6 |
:102B90000E94190A8CE38093FF038DB79EB70796B6 |
:102BA0000FB6F8949EBF0FBE8DBF80917F07E82FB0 |
:102BB000FF27EE0FFF1FE65BF84F808191819F9307 |
:102BC0008F9380917E07E82FFF27EE0FFF1FE65BB4 |
:102BD000F84F808191819F938F9384EE92E01FC381 |
:102BE0001092FF0384EF92E09F938F93C1E0CF9305 |
:102BF0000E94190A809101010F900F900F908A3066 |
:102C000009F060C084E18093FF0380919C0490915F |
:102C10009D049F938F938091F4039091F5032091ED |
:102C20009C0430919D04821B930B9F938F9382E0B1 |
:102C300093E09F938F93CF930E94190A88E2809329 |
:102C4000FF038DB79EB707960FB6F8949EBF0FBED1 |
:102C50008DBF80919A0490919B049F938F93809154 |
:102C6000F2039091F30320919A0430919B04821B0C |
:102C7000930B9F938F9381E193E09F938F93CF93D7 |
:102C80000E94190A8CE38093FF038DB79EB70796C5 |
:102C90000FB6F8949EBF0FBE8DBF8091980490919F |
:102CA00099049F938F938091980490919904209117 |
:102CB000F0033091F103821B930B9F938F9380E27B |
:102CC00093E069C020919C0430919D048B3009F001 |
:102CD00066C084E18093FF03C90137FD0196959595 |
:102CE00087959F938F938091F4039091F5032091A2 |
:102CF0009C0430919D04821B930B9F938F938FE2D2 |
:102D000093E09F938F93CF930E94190A88E2809358 |
:102D1000FF038DB79EB707960FB6F8949EBF0FBE00 |
:102D20008DBF80919A0490919B0497FD0196959593 |
:102D300087959F938F938091F2039091F303209155 |
:102D40009A0430919B04821B930B9F938F938EE385 |
:102D500093E09F938F93CF930E94190A8CE3809303 |
:102D6000FF038DB79EB707960FB6F8949EBF0FBEB0 |
:102D70008DBF809198049091990497FD0196959547 |
:102D800087959F938F9380910008909101089F935E |
:102D90008F938DE493E09F938F93CF9343C284E10D |
:102DA0008093FF038091100399279F938F93C9010C |
:102DB00037FD0196959587959F938F938091F403A6 |
:102DC0009091F50320919C0430919D04821B930BFC |
:102DD0009F938F938CE593E09F938F93CF930E9463 |
:102DE000190A88E28093FF038DB79EB709960FB644 |
:102DF000F8949EBF0FBE8DBF80910F0399279F93BC |
:102E00008F9380919A0490919B0497FD01969595DC |
:102E100087959F938F938091F2039091F303209174 |
:102E20009A0430919B04821B930B9F938F9380E7AE |
:102E300093E09F938F93CF930E94190A8CE3809322 |
:102E4000FF038DB79EB709960FB6F8949EBF0FBECD |
:102E50008DBF80910E0399279F938F938091980443 |
:102E60009091990497FD0196959587959F938F93DF |
:102E700080919804909199042091F0033091F1038E |
:102E8000821B930B9F938F9384E893E09F938F9380 |
:102E9000CF930E94190A8DB79EB70996C8C11092A8 |
:102EA000FF0388E993E09F938F9311E01F930E94A3 |
:102EB000190A84E18093FF030F900F900F90809187 |
:102EC0009204909193049F938F938091EC0390913F |
:102ED000ED039F938F9385EA93E09F938F931F93C6 |
:102EE0000E94190A88E28093FF038DB79EB7079668 |
:102EF0000FB6F8949EBF0FBE8DBF80919004909145 |
:102F000091049F938F938091EE039091EF039F9391 |
:102F10008F9384EB93E09F938F931F930E94190AE2 |
:102F20008CE38093FF038DB79EB707960FB6F89496 |
:102F30009EBF0FBE8DBF80918A0490918B04A0919B |
:102F40008C04B0918D04BC01CD010E940646DC01C9 |
:102F5000CB019F938F938091E2079091E3079F931A |
:102F60008F9383EC93E05BC184E18093FF038091B6 |
:102F70001703909118039F938F9382ED93E09F9393 |
:102F80008F9311E01F930E94190A88E28093FF0338 |
:102F90000F900F900F900F900F9080913804992709 |
:102FA0009F938F9381EE93E08DC01092FF0380EF8B |
:102FB00093E09F938F9311E01F930E94190A84E17D |
:102FC0008093FF030F900F900F9080914604909193 |
:102FD00047049F938F938FEF93E09F938F931F935B |
:102FE0000E94190A88E28093FF030F900F900F90C0 |
:102FF0000F900F9080914A0490914B049F938F9370 |
:103000008EE094E09F938F931F930E94190A8CE3A4 |
:103010008093FF030F900F900F900F900F9080916F |
:103020004804909149049F938F938DE194E04AC0A6 |
:103030001092FF0380913F04909140049F938F93DF |
:103040008CE294E09F938F9311E01F930E94190AE2 |
:1030500084E18093FF030F900F900F900F900F90DB |
:1030600080913D0490913E049F938F9388E394E078 |
:103070009F938F931F930E94190A88E28093FF0306 |
:103080000F900F900F900F900F9080913B049091B4 |
:103090003C049F938F9384E494E09F938F931F93BA |
:1030A0000E94190A8CE38093FF030F900F900F90FA |
:1030B0000F900F908091390490913A049F938F93D1 |
:1030C00080E594E09F938F931F930E94190A0F90BD |
:1030D0000F900F900F900F90B5C01092FF038CE5EA |
:1030E00094E09F938F9311E01F930E94190A84E14B |
:1030F0008093FF030F900F900F9080917903992791 |
:103100009F938F9384E694E09F938F931F930E94E5 |
:10311000190A88E28093FF030F900F900F900F9091 |
:103120000F908091D0039091D1039F938F9382E76A |
:1031300094E09F938F931F930E94190A8CE38093CE |
:10314000FF030F900F900F900F900F9080919C07AE |
:1031500099279F938F9380919B0799279F938F9394 |
:1031600080E894E05CC01092FF038EE894E09F93A7 |
:103170008F9311E01F930E94190A84E18093FF034B |
:103180000F900F900F9080914D06992787FD909595 |
:103190009F938F9380914C06992787FD90959F93DD |
:1031A0008F938EE994E09F938F931F930E94190A47 |
:1031B00088E28093FF038DB79EB707960FB6F89409 |
:1031C0009EBF0FBE8DBF80914E06992787FD9095BB |
:1031D0009F938F9380914F0699279F938F938EEAA9 |
:1031E00094E09F938F931F930E94190A8CE380931E |
:1031F000FF038DB79EB707960FB6F8949EBF0FBE1C |
:103200008DBF8091530699279F938F93809150068D |
:10321000992787FD90959F938F938EEB94E09F93D2 |
:103220008F931F930E94190A8DB79EB707960FB60A |
:10323000F8949EBF0FBE8DBF05C08150809373036D |
:10324000109202041092FE03DF91CF911F91089516 |
:103250001092B9008AE28093B800089585EA8093BD |
:10326000BC0080E090E0089584E98093BC0008955C |
:103270001092B9008093BB0085E88093BC0080E089 |
:1032800090E008950E943419109205048091BB00CB |
:103290001092040480E88093BC001092BD0010924C |
:1032A000BA001092BB001092B9001092B8000E94B0 |
:1032B00028190E942E1980E00E94381908951F9243 |
:1032C0000F920FB60F9211242F933F934F935F935A |
:1032D0006F937F938F939F93AF93BF93EF93FF93DE |
:1032E00080910504282F3327442755278F5F80932B |
:1032F0000504F9012731310508F098C0E85CFF4F5B |
:10330000EE0FFF1F0590F491E02D099480910404C5 |
:10331000880F8E5A7EC080910404282F33278F5F38 |
:103320008093040421303105E1F1223031051CF491 |
:10333000232BA1F17BC022303105B1F123303105BF |
:10334000B1F174C00E94341980910404843018F4DF |
:103350001092050453C01092040450C080910304DD |
:10336000880F8D5A56C080910304E82FFF27EE5B2B |
:10337000F84F8091BB0080838091030499278130AE |
:10338000910579F0823091051CF4892B39F04EC0FB |
:103390008230910549F0039751F048C08091CF07E2 |
:1033A00038C08091D80735C08091F70732C080912E |
:1033B000F9072FC090910304E92FFF27EE5BF84F28 |
:1033C0008091BB008483892F8F5F809303048430B6 |
:1033D00018F11092030420C080E11BC080911003FB |
:1033E00018C082E116C080910F0313C00E943419E7 |
:1033F0008AE090E090939203809391030E942E19AB |
:1034000015C088E906C084E104C080910E0301C0A4 |
:1034100080E80E9438190AC00E9434198AE090E0BE |
:103420009093920380939103109205048091BC00C5 |
:1034300080688093BC00FF91EF91BF91AF919F9105 |
:103440008F917F916F915F914F913F912F910F904D |
:103450000FBE0F901F90189583EC80938100809190 |
:103460006F00806280936F0010929904109298040C |
:1034700010929B0410929A0410929D0410929C0446 |
:1034800008951F920F920FB60F9211240F931F935E |
:103490002F933F934F935F936F937F938F939F935C |
:1034A000AF93BF93CF93DF93EF93FF934091860049 |
:1034B000509187008091060490910704481B590B96 |
:1034C0008091860090918700909307048093060472 |
:1034D000CA018D549440A0910804B0910904835FFF |
:1034E0009A4158F4149714F01092740381E090E01C |
:1034F000909309048093080499C0AA30B1050CF098 |
:1035000095C0CA018B5F9040845B914008F071C008 |
:10351000425D5140FD01EA0FFB1FE65BF84F8081E1 |
:103520009181FA01E81BF90BCF01F7FF03C09095D9 |
:1035300081959F4F06974CF480913804883C28F47D |
:1035400080913804865F80933804FD01EA0FFB1FE9 |
:10355000E65BF84F808191819C01220F331F280F79 |
:10356000391F240F351F37FF02C02D5F3F4FE90180 |
:10357000D595C795D595C795CA0101968C179D0716 |
:1035800014F4219706C041505040C417D5070CF4DD |
:10359000219680913804833CD8F08D010A0F1B1FBF |
:1035A000F801E65BF84F808191819E01281B390B61 |
:1035B000C90163E070E00E942447CB01880F991F86 |
:1035C000860F971F005A184FF8019183808307C018 |
:1035D000AA0FBB1FA05AB84F11961C921E92E091E1 |
:1035E0000804F0910904EE0FFF1FE65BF84FD1834A |
:1035F000C083809108049091090401969093090476 |
:1036000080930804059711F45D9A01C05D9880913C |
:103610000804909109048630910511F45C9A01C068 |
:103620005C98079711F45B9A01C05B98FF91EF914A |
:10363000DF91CF91BF91AF919F918F917F916F91CA |
:103640005F914F913F912F911F910F910F900FBE5E |
:103650000F901F901895CF93DF9381E080937807A8 |
:1036600082E08093790783E080937A0764E0609337 |
:103670007B0745E040937C07F6E0F0937D0787E009 |
:1036800080937E0778E070937F0788E680938007B9 |
:103690009EE1909381078BEF809383078AE080936C |
:1036A00084079093820790938607609385073FE095 |
:1036B0003093870790938807ECE0E0938907709335 |
:1036C0008A0786EE80938B0790938C0780E880931F |
:1036D0008D0780E580938E0756E950938F078EE51E |
:1036E0008093900783E280939107909392071092C2 |
:1036F000930780E2809394071092950710929607A3 |
:1037000010929707109298071092A8071092A90795 |
:103710001092AA071092AB0724E62093990788E23B |
:1037200080939A071092BA0782E380939B07509385 |
:103730009C0740939D0780939E079AE590939F076F |
:103740008093A0071092B9079093A1074093A20716 |
:1037500085E58093A3078093A40780E18093A50764 |
:103760006093A6072093A7078FE58093AC0783EFAC |
:103770008093AE073093AD073093AF078DEF809302 |
:10378000B0072093B1079093B2079093B30790933B |
:10379000B4071092B507F093B6077093B707CFEB55 |
:1037A000D7E0A3E9B3E00D900992E150E1F7DF9192 |
:1037B000CF910895CF93DF9381E08093780782E0E3 |
:1037C0008093790723E020937A07E4E0E0937B0776 |
:1037D00035E030937C0766E060937D0787E0809357 |
:1037E0007E0758E050937F0788E6809380079EE12C |
:1037F000909381078BEF809383078AE080938407FF |
:10380000909382079093860720938507FCE0F093BE |
:10381000870780E1809388076093890750938A0720 |
:1038200086EE80938B0790938C0780E880938D07BA |
:1038300080E580938E0788E780938F078EE58093DD |
:10384000900783E2809391079093920710929307D9 |
:1038500040E24093940710929507109296071092B9 |
:103860009707109298071092A8071092A907109234 |
:10387000AA071092AB0774E67093990788E28093C9 |
:103880009A071092BA0792E390939B0786E9809378 |
:103890009C0730939D0790939E072AE520939F07EE |
:1038A0009093A0071092B9072093A1073093A20725 |
:1038B00085E58093A3078093A4074093A507E09331 |
:1038C000A6078BE48093A7078FE58093AC0783EF6F |
:1038D0008093AE0784E18093AD078093AF078DEFAF |
:1038E0008093B0077093B1072093B2072093B3077A |
:1038F0002093B4071092B5076093B6075093B707AB |
:10390000CFEBD7E0AAE9B3E00D900992F150E1F7CF |
:10391000DF91CF91089581E08093780782E08093D2 |
:10392000790793E090937A07E4E0E0937B0755E012 |
:1039300050937C0776E070937D0787E080937E0745 |
:1039400068E060937F0788EE809380073EE13093C4 |
:1039500081078BEF809383078AE0809384073093FD |
:10396000820730938607909385076093870790E1DD |
:10397000909388077093890760938A0786EE8093F7 |
:103980008B0730938C0780E880938D0744E6409343 |
:103990008E0788E780938F078EE58093900783E2F8 |
:1039A0008093910784E180939207109293079093FC |
:1039B000940710929507109296071092970710920D |
:1039C00098071092A8071092A9071092AA071092C0 |
:1039D000AB074093990788E280939A071092BA0741 |
:1039E00092E390939B0786E980939C0750939D07F1 |
:1039F00090939E072AE520939F079093A00710922B |
:103A0000B9072093A1075093A20785E58093A307E8 |
:103A10008093A40780E28093A507E093A607909384 |
:103A2000A7078FE58093AC0783EF8093AE073093B1 |
:103A3000AD073093AF078DEF8093B0074093B10788 |
:103A40002093B2072093B3072093B4071092B507D1 |
:103A50007093B6076093B707AFEBB7E0E2EAF3E025 |
:103A60008CE001900D928150E1F70895CF93C82F1B |
:103A7000C150CF3F81F080912F04882361F484E608 |
:103A800090E09093D4038093D3038AEF90E00E9458 |
:103A9000BD0DC15080F7CF9108959F92AF92BF9214 |
:103AA000CF92DF92EF92FF920F931F93CF93DF930A |
:103AB00080919804909199042091F0033091F10342 |
:103AC000821B930B90930108809300088091F1076B |
:103AD0009091F2072091F0033091F103821B930B38 |
:103AE00090937707809376078091F2039091F30388 |
:103AF00020919A0430919B04821B930B9093CE07E4 |
:103B00008093CD078091F4039091F50320919C045C |
:103B100030919D04821B930B9093DA078093D90711 |
:103B20008091CD079091CE07909327078093260729 |
:103B30008091FC079091FD077C010027F7FC009520 |
:103B4000102F8091EC039091ED03AA2797FDA0958B |
:103B5000BA2FBC01CD012CE030E040E050E00E94E3 |
:103B6000E546DC01CB01E80EF91E0A1F1B1F17FFFB |
:103B700005C00894E11CF11C011D111D1595079548 |
:103B8000F794E794F092FD07E092FC0780910E080D |
:103B900090910F087C010027F7FC0095102F809171 |
:103BA000EE039091EF03AA2797FDA095BA2FBC01D1 |
:103BB000CD012CE030E040E050E00E94E546DC0121 |
:103BC000CB01E80EF91E0A1F1B1F17FF05C0089442 |
:103BD000E11CF11C011D111D15950795F794E79443 |
:103BE000F0920F08E0920E088091E2079091E307AF |
:103BF0009C01442737FD4095542F8091EA03909112 |
:103C0000EB03AA2797FDA095BA2F280F391F4A1F4B |
:103C10005B1F57FF04C02F5F3F4F4F4F5F4F5595BE |
:103C20004795379527953093E3072093E2078091D6 |
:103C3000EC039091ED036CE070E0869F9001879F0C |
:103C4000300D969F300D1124C9019C01442737FD8A |
:103C50004095542F8091740490917504A09176043E |
:103C6000B0917704820F931FA41FB51F8093740433 |
:103C700090937504A0937604B09377048091EE033B |
:103C80009091EF03869F9001879F300D969F300D96 |
:103C90001124C9019C01442737FD4095542F809180 |
:103CA000700490917104A0917204B0917304820F1A |
:103CB000931FA41FB51F8093700490937104A09369 |
:103CC0007204B09373048091EA079091EB072091FE |
:103CD000EC033091ED03820F931F9093EB078093D9 |
:103CE000EA0780910308909104082091EE03309137 |
:103CF000EF03820F931F9093040880930308809131 |
:103D00008E0490918F04019690938F0480938E047B |
:103D100080916C0490916D04A0916E04B0916F0439 |
:103D2000BC01CD010E9423465B016C0180913207EA |
:103D300090913307AA2797FDA095BA2FBC01CD011A |
:103D40000E9423467B018C0180918A0490918B0410 |
:103D5000A0918C04B0918D049C01AD01C801B70104 |
:103D60000E947D45DC01CB019C01AD01C601B5017E |
:103D70000E947E45DC01CB01BC01CD010E940646BC |
:103D8000DC01CB0180936C0490936D04A0936E04CE |
:103D9000B0936F048091000890910108AA2797FDC5 |
:103DA000A095BA2FC0910A08D0910B08E0910C0899 |
:103DB000F0910D08C80FD91FEA1FFB1FC0930A0816 |
:103DC000D0930B08E0930C08F0930D088091000845 |
:103DD000909101089C01442737FD4095542F809114 |
:103DE000540490915504A0915604B0915704820F49 |
:103DF000931FA41FB51F8093540490935504A09360 |
:103E00005604B0935704C03B33E8D30738E0E307C8 |
:103E100030E0F30764F0C05BD348E840F040C09363 |
:103E20000A08D0930B08E0930C08F0930D088091DA |
:103E30000A0890910B08A0910C08B0910D08B7FFEB |
:103E40000CC080559C47A74FBF4F80930A089093A2 |
:103E50000B08A0930C08B0930D08909026049920AD |
:103E600009F0C3C080912504882309F0BEC0809169 |
:103E7000800786FFBAC08091760790917707AA27BE |
:103E800097FDA095BA2F209164043091650440916C |
:103E9000660450916704BC01CD010E94E546EC0127 |
:103EA000DB0197FF04C0A150B84FCF4FDF4F1BE09D |
:103EB000D595C795B795A7951A95D1F78091180410 |
:103EC000E82EFF2400271127BD01CE01A80197018C |
:103ED0000E94E546DC01CB0180939E0490939F04F1 |
:103EE000A093A004B093A104B7FF04C08150904FE9 |
:103EF000AF4FBF4F5C016D01ACE0D594C794B79450 |
:103F0000A794AA95D1F7A0929E04B0929F04C09264 |
:103F1000A004D092A1048091760790917707AA27F8 |
:103F200097FDA095BA2F20915C0430915D044091DB |
:103F30005E0450915F04BC01CD010E94E54697FFED |
:103F400004C06150784F8F4F9F4FFBE09595879548 |
:103F500077956795FA95D1F7A80197010E94E546F4 |
:103F6000DC01CB018093A2049093A304A093A4044A |
:103F7000B093A504B7FF04C08150904FAF4FBF4F1F |
:103F80009C01AD01ECE05595479537952795EA954D |
:103F9000D1F72093A2043093A3044093A404509338 |
:103FA000A504D601C501D7FE07C0B095A095909590 |
:103FB00081959F4FAF4FBF4F81389105A105B10546 |
:103FC00084F4DA01C90157FF07C0B095A095909518 |
:103FD00081959F4FAF4FBF4F81389105A105B10526 |
:103FE000A4F081E08093430410C01092A2041092C8 |
:103FF000A3041092A4041092A50410929E0410929F |
:104000009F041092A0041092A1048091CD0790917A |
:10401000CE0720919E0430919F04820F931F9093AE |
:10402000CE078093CD0700911704202F3327442714 |
:1040300055278091A2049091A304A091A404B0916B |
:10404000A504BC01CD010E94E5469B01AC0197FF90 |
:1040500004C021503E4F4F4F5F4F79E05595479533 |
:10406000379527957A95D1F78091CD079091CE0716 |
:10407000820F931F9093CE078093CD078091CD0739 |
:104080009091CE079C01442737FD4095542F809195 |
:10409000580490915904A0915A04B0915B04820F86 |
:1040A000931FA41FB51F8093580490935904A093A5 |
:1040B0005A04B0935B048091CD079091CE07209174 |
:1040C000290430912A04821B930B9C01442737FD5D |
:1040D0004095542F80915C0490915D04A0915E0402 |
:1040E000B0915F04820F931FA41FB51F80935C04DF |
:1040F00090935D04A0935E04B0935F04C091870326 |
:10410000D0918803E0918903F0918A03C817D907F9 |
:10411000EA07FB07C4F488EA91E6A0E0B0E08C1B54 |
:104120009D0BAE0BBF0B80935C0490935D04A0933A |
:104130005E04B0935F048093580490935904A09355 |
:104140005A04B0935B0422273327A9012C1B3D0B93 |
:104150004E0B5F0B80915C0490915D04A0915E0416 |
:10416000B0915F0482179307A407B507B4F4CE019A |
:10417000DF01885A9146A040B04080935C04909340 |
:104180005D04A0935E04B0935F0480935804909301 |
:104190005904A0935A04B0935B048091F203909168 |
:1041A000F3030F9734F488E19CEF9093CE0780934C |
:1041B000CD078091F2039091F303079734F480E3E5 |
:1041C00098EF9093CE078093CD07109101011A309C |
:1041D000A9F48091F2039091F303835F934034F04C |
:1041E00088EE93E09093CE078093CD078091F20301 |
:1041F0009091F3038A5F9340DCF014C08091F20346 |
:104200009091F303855E974034F088EE93E09093AD |
:10421000CE078093CD078091F2039091F303835FE3 |
:10422000974034F080ED97E09093CE078093CD07D0 |
:104230008091D9079091DA072091A2043091A304CC |
:10424000821B930B9093DA078093D907202F332793 |
:104250004427552780919E0490919F04A091A0042B |
:10426000B091A104BC01CD010E94E5469B01AC01C7 |
:1042700097FF04C021503E4F4F4F5F4F69E0559567 |
:104280004795379527956A95D1F78091D9079091F1 |
:10429000DA07821B930B9093DA078093D9078091FA |
:1042A000D9079091DA079C01442737FD4095542F98 |
:1042B0008091600490916104A0916204B0916304C4 |
:1042C000820F931FA41FB51F809360049093610415 |
:1042D000A0936204B09363048091D9079091DA07A8 |
:1042E0002091270430912804821B930B9C014427C2 |
:1042F00037FD4095542F8091640490916504A091FE |
:104300006604B0916704820F931FA41FB51F8093AA |
:10431000640490936504A0936604B0936704C0910D |
:104320008B03D0918C03E0918D03F0918E03C8171D |
:10433000D907EA07FB07C4F488EA91E6A0E0B0E0F9 |
:104340008C1B9D0BAE0BBF0B809364049093650494 |
:10435000A0936604B0936704809360049093610413 |
:10436000A0936204B093630422273327A9012C1B76 |
:104370003D0B4E0B5F0B8091640490916504A091FE |
:104380006604B091670482179307A407B507B4F4D5 |
:10439000CE01DF01885A9146A040B040809364046A |
:1043A00090936504A0936604B093670480936004BF |
:1043B00090936104A0936204B09363048091F4032A |
:1043C0009091F5030F9734F488E19CEF9093DA070E |
:1043D0008093D9078091F4039091F503079734F403 |
:1043E00080E398EF9093DA078093D9071A30A9F405 |
:1043F0008091F4039091F503835F934034F088EE4D |
:1044000093E09093DA078093D9078091F403909119 |
:10441000F5038A5F9340DCF014C08091F40390911F |
:10442000F503855E974034F088EE93E09093DA07C9 |
:104430008093D9078091F4039091F503835F9740AF |
:1044400034F080ED97E09093DA078093D9078FEEF0 |
:1044500080937A008091540490915504A091560461 |
:10446000B09157048093680490936904A0936A0400 |
:10447000B0936B048091640490916504A0916604EC |
:10448000B09167048093840490938504A09386047C |
:10449000B093870480915C0490915D04A0915E04C8 |
:1044A000B0915F0480937C0490937D04A0937E047C |
:1044B000B0937F048091600490916104A0916204A4 |
:1044C000B09163048093800490938104A09382044C |
:1044D000B09383048091580490915904A0915A0498 |
:1044E000B0915B048093780490937904A0937A044C |
:1044F000B0937B048091800787FF6EC0992009F0FC |
:104500006BC080912504882309F066C08091D9078B |
:104510009091DA07893C91058CF02091D907309170 |
:10452000DA07220F331F220F331F8091D907909192 |
:10453000DA07820F931F8052934017C08091D907EA |
:104540009091DA0788539F4FA4F42091D9073091B6 |
:10455000DA07220F331F220F331F8091D907909162 |
:10456000DA07820F931F805E9C4F9093DA07809347 |
:10457000D9078091CD079091CE07893C91058CF0A9 |
:104580002091CD073091CE07220F331F220F331F0A |
:104590008091CD079091CE07820F931F8052934058 |
:1045A00017C08091CD079091CE0788539F4FA4F4F8 |
:1045B0002091CD073091CE07220F331F220F331FDA |
:1045C0008091CD079091CE07820F931F805E9C4F04 |
:1045D0009093CE078093CD0780917C07E82FFF272B |
:1045E000EE0FFF1FE65BF84F8081918182599F4F4C |
:1045F00020913F0430914004281739071CF42F5FA5 |
:104600003F4F0CC08081918182599F4F8217930741 |
:104610004CF42115310531F02150304030934004E5 |
:1046200020933F0480917D07E82FFF27EE0FFF1FA7 |
:10463000E65BF84F8081918182599F4F20913D0424 |
:1046400030913E04281739071CF42F5F3F4F0CC0F0 |
:104650008081918182599F4F821793074CF42115D5 |
:10466000310531F02150304030933E0420933D0419 |
:1046700080917E07E82FFF27EE0FFF1FE65BF84FC4 |
:104680008081918182599F4F20913B0430913C045D |
:10469000281739071CF42F5F3F4F0CC08081918190 |
:1046A00082599F4F821793074CF42115310531F041 |
:1046B0002150304030933C0420933B0480917F078D |
:1046C000E82FFF27EE0FFF1FE65BF84F80819181F7 |
:1046D00082599F4F2091390430913A0428173907A5 |
:1046E0001CF42F5F3F4F0CC08081918182599F4FF6 |
:1046F000821793074CF42115310531F021503040D9 |
:1047000030933A042093390480913F0490914004FF |
:1047100097FF05C01092400410923F040AC08F3FDB |
:10472000910539F034F08FEF90E09093400480933E |
:104730003F0480913D0490913E0497FF05C0109284 |
:104740003E0410923D040AC08F3F910539F034F0C9 |
:104750008FEF90E090933E0480933D0480913B0462 |
:1047600090913C0497FF05C010923C0410923B04CA |
:104770000AC08F3F910539F034F08FEF90E09093AD |
:104780003C0480933B048091390490913A0497FF54 |
:1047900005C010923A04109239040AC08F3F910567 |
:1047A00039F034F08FEF90E090933A04809339041D |
:1047B000DF91CF911F910F91FF90EF90DF90CF90FD |
:1047C000BF90AF909F900895809101018D3010F0BF |
:1047D0000E94660F10927A008091F4039091F50385 |
:1047E0009093DA078093D9078091F2039091F303B5 |
:1047F0009093CE078093CD078091F0039091F103C1 |
:1048000090930108809300088091EC039091ED0350 |
:10481000AA2797FDA095BA2FBC01CD012CE030E06E |
:1048200040E050E00E94E546DC01CB019093FD079B |
:104830008093FC078091EE039091EF03AA2797FDE8 |
:10484000A095BA2FBC01CD010E94E546DC01CB0149 |
:1048500090930F0880930E088091EA039091EB03E8 |
:104860009093E3078093E2078FEE80937A00809124 |
:104870007C07E82FFF27EE0FFF1FE65BF84F8081D4 |
:10488000918182599F4F20913F0430914004281715 |
:1048900039071CF42F5F3F4F0CC0808191818259F2 |
:1048A0009F4F821793074CF42115310531F02150A9 |
:1048B00030403093400420933F0480917D07E82FDF |
:1048C000FF27EE0FFF1FE65BF84F80819181825931 |
:1048D0009F4F20913D0430913E04281739071CF466 |
:1048E0002F5F3F4F0CC08081918182599F4F82176B |
:1048F00093074CF42115310531F0215030403093AD |
:104900003E0420933D0480917E07E82FFF27EE0FA1 |
:10491000FF1FE65BF84F8081918182599F4F209164 |
:104920003B0430913C04281739071CF42F5F3F4F9C |
:104930000CC08081918182599F4F821793074CF45C |
:104940002115310531F02150304030933C04209343 |
:104950003B0480917F07E82FFF27EE0FFF1FE65BE8 |
:10496000F84F8081918182599F4F20913904309175 |
:104970003A04281739071CF42F5F3F4F0CC0808181 |
:10498000918182599F4F821793074CF4211531056D |
:1049900031F02150304030933A0420933904809113 |
:1049A0003F049091400497FF05C01092400410927C |
:1049B0003F040AC08F3F910539F034F08FEF90E04B |
:1049C0009093400480933F0480913D0490913E0475 |
:1049D00097FF05C010923E0410923D040AC08F3F1D |
:1049E000910539F034F08FEF90E090933E0480937E |
:1049F0003D0480913B0490913C0497FF05C01092C8 |
:104A00003C0410923B040AC08F3F910539F034F00A |
:104A10008FEF90E090933C0480933B0480913904A5 |
:104A200090913A0497FF05C010923A04109239040D |
:104A30000AC08F3F910539F034F08FEF90E09093EA |
:104A40003A04809339048091A3079927AA27BB27AA |
:104A5000BC01CD0124EC39E040E050E00E94E54685 |
:104A6000DC01CB0180938B0390938C03A0938D0387 |
:104A7000B0938E038091A4079927AA27BB27BC0176 |
:104A8000CD010E94E546DC01CB0180938703909322 |
:104A90008803A0938903B0938A0308951092930426 |
:104AA00010929204109291041092900480E090E091 |
:104AB000A0E0B0E080938A0490938B04A0938C04D0 |
:104AC000B0938D0410929D0410929C0410929B044C |
:104AD00010929A0410929904109298041092F2077E |
:104AE0001092F10710921804109217040E94E42308 |
:104AF00084E690E00E94CA0D0E94E4238091800722 |
:104B000080FF10C08091110390911203875B934046 |
:104B100038F480911103909112038E5E924010F44C |
:104B20000E941E0F4091F4035091F50350939D0491 |
:104B300040939C042091F2033091F30330939B0443 |
:104B400020939A048091F0039091F103909399043B |
:104B5000809398048091F0039091F1039093F20771 |
:104B60008093F10730939704209396045093950413 |
:104B70004093940444E050E0DA010E947447802D91 |
:104B8000853038F180910E0890910F0897FF03C08F |
:104B9000909581959F4F6CE070E00E942447709340 |
:104BA0009104609390048091FC079091FD0797FF1A |
:104BB00003C0909581959F4F6CE070E00E94244760 |
:104BC000709393046093920480913207909133071D |
:104BD00034C0DA010E947447802D9927982F8827C6 |
:104BE000DA0111960E947447202D820F911D909337 |
:104BF000930480939204DA0112960E947447802DE8 |
:104C00009927982F8827DA0113960E947447202D40 |
:104C1000820F911D9093910480939004DA01149671 |
:104C20000E947447802D9927982F8827DA011596BE |
:104C30000E947447202D820F911DAA2797FDA095F1 |
:104C4000BA2FBC01CD010E942346DC01CB01809329 |
:104C50008A0490938B04A0938C04B0938D041092DB |
:104C60006404109265041092660410926704109216 |
:104C70006004109261041092620410926304109216 |
:104C80005C0410925D0410925E0410925F04109216 |
:104C900058041092590410925A0410925B04109216 |
:104CA0005404109255041092560410925704109216 |
:104CB000DA071092D9071092CE071092CD07109202 |
:104CC00001081092000884E690E00E94CA0D8091CD |
:104CD000130390911403A0911503B09116039093C0 |
:104CE0003507809334071092E3031092E203109289 |
:104CF0004C0410924D0410924E0410924F04809177 |
:104D00004A0490914B0490934904809348040E9474 |
:104D10001D4282E390E09093D4038093D30380916B |
:104D2000A3079927AA27BB27BC01CD0124EC39E0B2 |
:104D300040E050E00E94E546DC01CB018856954CEE |
:104D4000AF4FBF4F80938B0390938C03A0938D0341 |
:104D5000B0938E038091A4079927AA27BB27BC0193 |
:104D6000CD010E94E546DC01CB018856954CAF4F42 |
:104D7000BF4F8093870390938803A0938903B093D8 |
:104D80008A03109276031092750380914A049091E1 |
:104D90004B04AA2797FDA095BA2FBC01CD012EE0A8 |
:104DA00036E040E050E00E94E546DC01CB01809314 |
:104DB0000A0890930B08A0930C08B0930D0810926A |
:104DC00042041092410481E0809300010E94FB4460 |
:104DD00080910A04846080930A04089580912F04CE |
:104DE000882321F58093D8078093CF078093F70716 |
:104DF0008093F9078091B803882311F08093CF073F |
:104E00008091B903882311F08093D8078091BA0369 |
:104E1000882311F08093F9078091BB03882311F058 |
:104E20008093F70780910A048C7F03C080910A0465 |
:104E3000816080930A048091CF0799279093070798 |
:104E4000809306078091D80799279093090780934C |
:104E500008078091F907992790930B0780930A0719 |
:104E60008091F707992790930D0780930C07109274 |
:104E70000504109204040E942E1908951F93809136 |
:104E800083078B3F98F08B3F19F480913F040EC04D |
:104E90008C3F19F480913D0409C08D3F19F4809135 |
:104EA0003B0404C08E3F21F4809139048093810338 |
:104EB000809182078B3F98F08B3F19F480913F04DB |
:104EC0000EC08C3F19F480913D0409C08D3F19F448 |
:104ED00080913B0404C08E3F21F48091390480937B |
:104EE000820380918203882329F0843618F084E6B7 |
:104EF00080938203809184078B3F98F08B3F19F455 |
:104F000080913F040EC08C3F19F480913D0409C08C |
:104F10008D3F19F480913B0404C08E3F21F48091B1 |
:104F200039048093800380918003882329F084369C |
:104F300018F084E680938003809186078B3F98F079 |
:104F40008B3F19F480913F040EC08C3F19F480917F |
:104F50003D0409C08D3F19F480913B0404C08E3F8D |
:104F600021F48091390480937F0380918D078B3FDA |
:104F700098F08B3F19F480913F040EC08C3F19F4D8 |
:104F800080913D0409C08D3F19F480913B0404C019 |
:104F90008E3F21F48091390480937E0380918E07A7 |
:104FA0008B3F98F08B3F19F480913F040EC08C3FEB |
:104FB00019F480913D0409C08D3F19F480913B04A0 |
:104FC00004C08E3F21F48091390480937D03809149 |
:104FD0007D038B3010F48AE002C08F3F11F4809380 |
:104FE0007D0380918F078B3F98F08B3F19F4809160 |
:104FF0003F040EC08C3F19F480913D0409C08D3FE1 |
:1050000019F480913B0404C08E3F21F4809139044F |
:1050100080937C03809194078B3F98F08B3F19F429 |
:1050200080913F040EC08C3F19F480913D0409C06B |
:105030008D3F19F480913B0404C08E3F21F4809190 |
:10504000390480937A03809195078B3F98F08B3FCA |
:1050500019F480913F040EC08C3F19F480913D04F7 |
:1050600009C08D3F19F480913B0404C08E3F21F4A8 |
:105070008091390480932004809196078B3F98F0AB |
:105080008B3F19F480913F040EC08C3F19F480913E |
:105090003D0409C08D3F19F480913B0404C08E3F4C |
:1050A00021F48091390480931F04809197078B3FEE |
:1050B00098F08B3F19F480913F040EC08C3F19F497 |
:1050C00080913D0409C08D3F19F480913B0404C0D8 |
:1050D0008E3F21F48091390480931E0480919807BB |
:1050E0008B3F98F08B3F19F480913F040EC08C3FAA |
:1050F00019F480913D0409C08D3F19F480913B045F |
:1051000004C08E3F21F48091390480931D04809166 |
:10511000A8078B3F98F08B3F19F480913F040EC095 |
:105120008C3F19F480913D0409C08D3F19F48091A2 |
:105130003B0404C08E3F21F48091390480931C0409 |
:105140008091A9078B3F98F08B3F19F480913F0421 |
:105150000EC08C3F19F480913D0409C08D3F19F4B5 |
:1051600080913B0404C08E3F21F4809139048093E8 |
:105170001B048091AA078B3F98F08B3F19F4809114 |
:105180003F040EC08C3F19F480913D0409C08D3F4F |
:1051900019F480913B0404C08E3F21F480913904BE |
:1051A00080931A048091AB078B3F98F08B3F19F4E2 |
:1051B00080913F040EC08C3F19F480913D0409C0DA |
:1051C0008D3F19F480913B0404C08E3F21F48091FF |
:1051D000390480931904809199078B3F98F08B3F95 |
:1051E00019F480913F040EC08C3F19F480913D0466 |
:1051F00009C08D3F19F480913B0404C08E3F21F417 |
:10520000809139048093790380919E078B3F98F0B9 |
:105210008B3F19F480913F040EC08C3F19F48091AC |
:105220003D0409C08D3F19F480913B0404C08E3FBA |
:1052300021F480913904809378038091A1078B3FFA |
:1052400098F08B3F19F480913F040EC08C3F19F405 |
:1052500080913D0409C08D3F19F480913B0404C046 |
:105260008E3F21F480913904809318048091A20725 |
:105270008B3F98F08B3F19F480913F040EC08C3F18 |
:1052800019F480913D0409C08D3F19F480913B04CD |
:1052900004C08E3F21F480913904809317048091DB |
:1052A000A7078B3F98F08B3F19F480913F040EC005 |
:1052B0008C3F19F480913D0409C08D3F19F4809111 |
:1052C0003B0404C08E3F21F480913904809377031E |
:1052D0008091AD078B3F98F08B3F19F480913F048C |
:1052E0000EC08C3F19F480913D0409C08D3F19F424 |
:1052F00080913B0404C08E3F21F480913904809357 |
:10530000EC078091EC07823010F481E002C08F3FFF |
:1053100011F48093EC078091AF078B3F98F08B3F9F |
:1053200019F480913F040EC08C3F19F480913D0424 |
:1053300009C08D3F19F480913B0404C08E3F21F4D5 |
:10534000809139048093FE078091FE07823010F42B |
:1053500081E002C08F3F11F48093FE078091B00777 |
:105360008B3F98F08B3F19F480913F040EC08C3F27 |
:1053700019F480913D0409C08D3F19F480913B04DC |
:1053800004C08E3F21F4809139048093D707809127 |
:10539000B1078B3F98F08B3F19F480913F040EC00A |
:1053A0008C3F19F480913D0409C08D3F19F4809120 |
:1053B0003B0404C08E3F21F480913904809310088F |
:1053C0008091B2078B3F98F08B3F19F480913F0496 |
:1053D0000EC08C3F19F480913D0409C08D3F19F433 |
:1053E00080913B0404C08E3F21F480913904809366 |
:1053F000D0078091B3078B3F98F08B3F19F48091D1 |
:105400003F040EC08C3F19F480913D0409C08D3FCC |
:1054100019F480913B0404C08E3F21F4809139043B |
:105420008093DB078091B4078B3F98F08B3F19F492 |
:1054300080913F040EC08C3F19F480913D0409C057 |
:105440008D3F19F480913B0404C08E3F21F480917C |
:105450003904809313088091B5078B3F98F08B3FF8 |
:1054600019F480913F040EC08C3F19F480913D04E3 |
:1054700009C08D3F19F480913B0404C08E3F21F494 |
:10548000809139048093DD078091B8078B3F98F0B5 |
:105490008B3F19F480913F040EC08C3F19F480912A |
:1054A0003D0409C08D3F19F480913B0404C08E3F38 |
:1054B00021F4809139048093110810917A03812F8F |
:1054C000992787FD9095A92FB92FBC01CD010E9486 |
:1054D000234617FF06C020E030E040E853E40E9476 |
:1054E0007E4527E137EB41ED58E30E949D46DC0104 |
:1054F000CB018093830390938403A0938503B0939F |
:10550000860380918B078093FF0780918A078093A1 |
:10551000DC071F9108952F923F924F925F926F92F6 |
:105520007F928F929F92AF92BF92CF92DF92EF9233 |
:10553000FF920F931F93CF93DF93CDB7DEB765979D |
:105540000FB6F894DEBF0FBECDBF0E944D1D309147 |
:1055500001013C3010F4299A01C02998E0903004F0 |
:10556000F0903104FA82E9828091DC0799270A964B |
:10557000E816F90614F49A838983809138048436F6 |
:1055800008F06CC080910303882399F4809106038E |
:10559000909107038F5F9F4F61F488E99AE390939E |
:1055A000D4038093D30380E09CE09093070380931F |
:1055B00006038091C2049091C304009731F00197D3 |
:1055C0009093C3048093C20404C010922F041092DD |
:1055D00045043A3011F4289A01C0289880910B04B0 |
:1055E00090910C04895E9340B0F180919107282F2F |
:1055F00033273A83298381E080934504809178079B |
:10560000A82FBB27AA0FBB1FFD01E05AF84F11823C |
:10561000108280917907282F3327220F331FC90169 |
:10562000805A984FFC0111821082A65BB84F1196E8 |
:105630001C921E92265B384FD90111961C921E9225 |
:1056400080917B07E82FFF27EE0FFF1FE65BF84FE7 |
:1056500011821082B4C210922F04B1C2809138041A |
:105660008D3808F4ACC2109245049091920782E301 |
:10567000989FC00111249093C3048093C204E981D0 |
:10568000FA81B9978CF080912F04882369F080917A |
:105690000B0490910C04FFEF8F3F9F0729F00196B8 |
:1056A00090930C0480930B0480910B0490910C0454 |
:1056B0008F3F910509F038F51092A6041092A704C7 |
:1056C0001092A8041092A9041092AA041092AB049C |
:1056D0001092AC041092AD048A3F9105C9F481E0A8 |
:1056E0008093CA041092AE041092AF041092B004DA |
:1056F0001092B10410925404109255041092560462 |
:105700001092570405C080910A04826080930A04B5 |
:1057100080917A07E82FFF27EE0FFF1FE65BF84F17 |
:1057200080819181813591050CF49BC120912F04DA |
:10573000222309F096C180917B07E82FFF27EE0F07 |
:10574000FF1FE65BF84F808191818C3491050CF44A |
:10575000FBC08091C4048F5F8093C404893C08F42B |
:1057600080C13C3010F4299801C0299A10922F046E |
:105770001092C40410920C0410920B04309178071C |
:10578000E32FFF27EE0FFF1FE65BF84F808191812B |
:1057900087349105B4F480917907E82FFF27EE0F45 |
:1057A000FF1FE65BF84F808191810190F081E02D31 |
:1057B000F7FF03C0F095E195FF4FE734F1050CF4D6 |
:1057C0007AC041E020917907A22FBB27AA0FBB1F07 |
:1057D000A65BB84F8D919C9111978734910544F049 |
:1057E000E32FFF27EE0FFF1FE65BF84F80819181CB |
:1057F0008D919C918734910574F080917807E82F02 |
:10580000FF27EE0FFF1FE65BF84F80819181873401 |
:1058100091050CF042E0E22FFF27EE0FFF1FE65B41 |
:10582000F84F808191818634910574F480917807D6 |
:10583000E82FFF27EE0FFF1FE65BF84F8081918175 |
:10584000873491050CF043E0E22FFF27EE0FFF1F96 |
:10585000E65BF84F808191818A5B9F4F74F4809161 |
:105860007807E82FFF27EE0FFF1FE65BF84F8081D8 |
:105870009181873491050CF044E0E22FFF27EE0F71 |
:10588000FF1FE65BF84F808191818A5B9F4F74F424 |
:1058900080917807E82FFF27EE0FFF1FE65BF84F98 |
:1058A00080819181863491050CF445E0A2E0B0E05E |
:1058B000042E0E947C4780917907E82FFF27EE0F86 |
:1058C000FF1FE65BF84F808191810190F081E02D10 |
:1058D000F7FF03C0F095E195FF4F7497BCF48091FA |
:1058E0007807E82FFF27EE0FFF1FE65BF84F808158 |
:1058F00091818A5B9F4F54F481E08093470688EE44 |
:1059000093E09093D4038093D303ABC00E94B20280 |
:1059100043E568E777E00E9484028091800780FF7A |
:1059200010C08091110390911203875B934038F46B |
:1059300080911103909112038E5E924010F40E94A8 |
:105940001E0F0E944E2586C080819181855B9F4FEE |
:105950000CF085C08091C4048F5F8093C404893C9F |
:1059600008F47FC03C3010F4299801C0299AA4E0C3 |
:10597000B0E08FEF082E0E947C4710922F04109207 |
:10598000C40410920C0410920B040E944E25A4E053 |
:10599000B0E0809192049091930497FF02C08150EF |
:1059A0009F4F892F990F990B082E0E947C47A5E0E5 |
:1059B000B0E08091920490919304082E0E947C475D |
:1059C000A6E0B0E0809190049091910497FF02C00E |
:1059D00081509F4F892F990F990B082E0E947C4769 |
:1059E000A7E0B0E08091900490919104082E0E946D |
:1059F0007C4708E010E080918A0490918B04A0918C |
:105A00008C04B0918D04BC01CD010E940646DC01DE |
:105A1000CB019C0197FF02C021503F4F832F992754 |
:105A200087FD9A95D801082E0E947C4709E010E076 |
:105A300080918A0490918B04A0918C04B0918D0484 |
:105A4000BC01CD010E940646DC01CB01D801082E25 |
:105A50000E947C470E94B2020E94361D02C0209321 |
:105A6000C40480917A07E82FFF27EE0FFF1FE65B43 |
:105A7000F84F808191818B5A9F4F0CF0A0C02091EC |
:105A80007B07E22FFF27EE0FFF1FE65BF84F8081B9 |
:105A90009181855B9F4F0CF072C08091C5048F5F30 |
:105AA0008093C504893C08F46CC088EC8093C504DD |
:105AB00081E090E090930C0480930B0481E080934C |
:105AC0002F041092AE041092AF041092B004109202 |
:105AD000B10410925404109255041092560410927E |
:105AE00057041092500410925104109252041092D4 |
:105AF000530410926404109265041092660410928C |
:105B0000670410925C0410925D0410925E0410927F |
:105B10005F048091840490918504A0918604B091E3 |
:105B200087048093600490936104A0936204B0930F |
:105B3000630480917C0490917D04A0917E04B091D7 |
:105B40007F048093580490935904A0935A04B0930F |
:105B50005B041092A6041092A7041092A80410925D |
:105B6000A9041092AA041092AB041092AC041092F3 |
:105B7000AD0480910A04886080930A0402C01092E8 |
:105B8000C504E22FFF27EE0FFF1FE65BF84F808171 |
:105B900091818C3491058CF08091C6048F5F809345 |
:105BA000C604893C60F010922F0488EC8093C604F0 |
:105BB00010920C0410920B0402C01092C604809143 |
:105BC0007403815080937403809174038F3F29F094 |
:105BD00080914504882309F4F1C30E943E278091F7 |
:105BE000D3049091D404AC01440F551F480F591FA2 |
:105BF000F0907807AF2DBB27AA0FBB1FFD01E65B16 |
:105C0000F84FE0908707CE2CDD24808191818C9D18 |
:105C100080018D9D100D9C9D100D1124400F511F72 |
:105C200057FF02C04D5F5F4F559547955595479576 |
:105C3000A05AB84F80918807682F77278D919C9143 |
:105C4000869F9001879F300D969F300D1124420F43 |
:105C5000531F5093D4044093D3048091FB0490913C |
:105C6000FC042091F7043091F804820F931F481B25 |
:105C7000590B50933704409336048091D50490918A |
:105C8000D604AC01440F551F480F591F00917907E6 |
:105C9000A02FBB27AA0FBB1FFD01E65BF84F808139 |
:105CA00091818C9DF0018D9DF00D9C9DF00D112436 |
:105CB0004E0F5F1F57FF02C04D5F5F4F55954795D1 |
:105CC00055954795A05AB84F8D919C91869F90010C |
:105CD000879F300D969F300D1124420F531F509314 |
:105CE000D6044093D5048091F9049091FA04209150 |
:105CF000F5043091F604820F931F481B590B509303 |
:105D000035044093340480917B07E82FFF27EE0F82 |
:105D1000FF1FE65BF84F80819181909581959F4FA1 |
:105D2000909333048093320480917A07E82FFF2701 |
:105D3000EE0FFF1FE65BF84F8081918188589F4FDF |
:105D4000909331048093300410917D03812F992723 |
:105D500087FD9095A92FB92FBC01CD010E94234644 |
:105D600017FF06C020E030E040E853E40E947E4583 |
:105D700020E030E040E251E40E947E45DC01CB01AE |
:105D800020E030E040E85CE3BC01CD010E949D468C |
:105D9000DC01CB018093050890930608A0930708C7 |
:105DA000B093080810917C03812F992787FD909567 |
:105DB000A92FB92FBC01CD010E94234617FF06C0B1 |
:105DC00020E030E040E853E40E947E4520E030EEE1 |
:105DD0004BE256E40E94C045DC01CB018093F307FF |
:105DE0009093F407A093F507B093F6076091B5037D |
:105DF000662331F08AE090E09093D4038093D3033C |
:105E0000462F552742FF09C080911108282F3327BC |
:105E1000220F331F220F331F13C09A0128703070D6 |
:105E200043FF0EC080911108282F33278CEF9FEF7E |
:105E3000289FA001299F500D389F500D11249A01D1 |
:105E40008091150490911604AC01F3E0440F551FA6 |
:105E5000FA95E1F7481B590B420F531F57FF02C039 |
:105E6000495F5F4FE3E055954795EA95E1F7509319 |
:105E7000160440931504462F552744FF09C080910E |
:105E80001108282F3327220F331F220F331F13C06F |
:105E90009A012072307045FF0EC080911108282FA2 |
:105EA00033278CEF9FEF289FD001299FB00D389F9B |
:105EB000B00D11249D018091130490911404AC0144 |
:105EC00063E0440F551F6A95E1F7481B590B420FD9 |
:105ED000531F57FF02C0495F5F4F83E055954795B9 |
:105EE0008A95E1F750931404409313044091B4034E |
:105EF000842F992783FF03C082E390E007C09C01B1 |
:105F00002470307082FF07C08EEC9FEF90931204D4 |
:105F10008093110404C03093120420931104242FA1 |
:105F2000332721FF09C08091750390917603019674 |
:105F3000909376038093750324FF09C080917503C5 |
:105F400090917603019790937603809375038091E7 |
:105F500015049091160497FD019695958795E0910B |
:105F60003604F0913704E80FF91FF0933704E093FB |
:105F70003604809113049091140497FD0196959531 |
:105F800087956091340470913504680F791F709380 |
:105F90003504609334048091110490911204880FA9 |
:105FA000991F880F991F4091320450913304480F74 |
:105FB000591F50933304409332048091530680FF5D |
:105FC00059C080911108813808F454C080914C0662 |
:105FD000992787FD90952E2D3327829FD001839F8F |
:105FE000B00D929FB00D1124EA0FFB1FF093370400 |
:105FF000E093360480914D06992787FD9095829F06 |
:10600000F001839FF00D929FF00D11246E0F7F1F02 |
:10601000709335046093340480914E06992787FD70 |
:106020009095480F591F5093330440933204809148 |
:106030005006282F332727FD309580918507992713 |
:10604000289FA001299F500D389F500D1124509377 |
:1060500076034093750380914F06282F3327809154 |
:106060003004909131042817390724F43093310417 |
:1060700020933004809130049091310497FF04C044 |
:1060800010923104109230048091800782FF0CC07E |
:1060900080E090E0A0E0B0E08093F3079093F407F5 |
:1060A000A093F507B093F607809105089091060834 |
:1060B000A0910708B091080820E030E040E050E0EF |
:1060C000BC01CD010E942D46882364F480E090E05D |
:1060D000A0E0B0E08093050890930608A09307081D |
:1060E000B09308088091F3079091F407A091F50709 |
:1060F000B091F60720E030E040E050E0BC01CD0177 |
:106100000E942D46882364F480E090E0A0E0B0E097 |
:106110008093F3079093F407A093F507B093F607E5 |
:106120004091360450913704CA0157FD03969C01F3 |
:10613000359527953595279537FF03C030952195DF |
:106140003F4F80910F049091100482179307B4F48D |
:10615000CA0157FF03C0909581959F4F97FD039605 |
:1061600095958795959587959093100480930F0446 |
:106170008536910544F084E690E001C00197909344 |
:10618000100480930F044091340450913504CA01E7 |
:1061900057FD03969C01359527953595279537FF33 |
:1061A00003C0309521953F4F80910D0490910E04CE |
:1061B00082179307B4F4CA0157FF03C090958195E5 |
:1061C0009F4F97FD03969595879595958795909305 |
:1061D0000E0480930D048536910544F084E690E02A |
:1061E00001C0019790930E0480930D0480914504A3 |
:1061F000882341F01092100410920F0410920E04A4 |
:1062000010920D04E02FFF27EE0FFF1FE65BF84F03 |
:1062100040919F07242F33278081918128173907C8 |
:1062200044F48091B90782FF04C081E08093240484 |
:1062300013C0E02FFF27EE0FFF1FE65BF84F842F00 |
:1062400099272091A007821B91092081318128176D |
:10625000390714F41092240440917907E42FFF27A2 |
:10626000EE0FFF1FE65BF84F50919F07852F992790 |
:1062700022273327281B390B8081918182179307AE |
:1062800044F48091B90783FF04C081E08093230424 |
:1062900016C080912304882391F0E42FFF27EE0F8E |
:1062A000FF1FE65BF84F8091A0079927851B910996 |
:1062B000208131818217930714F410922304EF2D6B |
:1062C000FF27EE0FFF1FE65BF84F40919F07242F3B |
:1062D0003327808191812817390744F48091B907C9 |
:1062E00080FF04C081E08093210417C080912104C5 |
:1062F000882399F0EF2DFF27EE0FFF1FE65BF84F85 |
:10630000842F99272091A007821B91092081318138 |
:106310002817390714F41092210440917807E42FCC |
:10632000FF27EE0FFF1FE65BF84F50919F07852F69 |
:10633000992722273327281B390B808191818217C7 |
:10634000930744F48091B90781FF04C081E08093F2 |
:10635000220416C080912204882391F0E42FFF27A5 |
:10636000EE0FFF1FE65BF84F8091A0079927851B72 |
:106370009109208131818217930714F4109222042D |
:1063800080912404882319F480912304811181E0F1 |
:106390008093250480912104882321F48091220494 |
:1063A000882351F081E080932604109225041092F6 |
:1063B00024041092230402C08093260480912504B3 |
:1063C000882321F480912604882351F080919E0730 |
:1063D0009927A981BA818A179B0714F49A83898324 |
:1063E000B0914504BB83BB2341F11092330410925A |
:1063F0003204109237041092360410923504109231 |
:10640000340480E090E0A8ECBFE38093050890930B |
:106410000608A0930708B09308088BE09CEBA2E362 |
:10642000BCE38093F3079093F407A093F507B09330 |
:10643000F60710922504109226048091E6079091A9 |
:10644000E707A091E807B091E90720918404309113 |
:1064500085044091860450918704820F931FA41FE6 |
:10646000B51F8093E6079093E707A093E807B093E2 |
:10647000E9078091ED079091EE07A091EF07B091A9 |
:10648000F00760907C0470907D0480907E04909072 |
:106490007F04860D971DA81DB91D8093ED0790936D |
:1064A000EE07A093EF07B093F0078091DE0790917D |
:1064B000DF07A091E007B091E107E0908004F09041 |
:1064C00081040091820410918304EC82FD820E838A |
:1064D0001F838E0D9F1DA01FB11F8093DE07909319 |
:1064E000DF07A093E007B093E1078091D307909175 |
:1064F000D407A091D507B091D607E0907804F0902A |
:10650000790400917A0410917B04E886F9860A8761 |
:106510001B878E0D9F1DA01FB11F8093D3079093E3 |
:10652000D407A093D507B093D607509026045520E2 |
:1065300029F480912504882309F45FC01092740423 |
:1065400010927504109276041092770410927004E1 |
:106550001092710410927204109273041092E60764 |
:106560001092E7071092E8071092E9071092ED07E2 |
:106570001092EE071092EF071092F0071092DE07CC |
:106580001092DF071092E0071092E1071092D307F4 |
:106590001092D4071092D5071092D6078091640408 |
:1065A00090916504A0916604B091670480936004A3 |
:1065B00090936104A0936204B093630480915C049F |
:1065C00090915D04A0915E04B0915F0480935804A3 |
:1065D00090935904A0935A04B0935B041092E10382 |
:1065E0001092E003109228041092270410922A04BB |
:1065F00010922904552009F0FDC0809125048823BC |
:1066000009F0F8C080918C07E82EFF24002711279D |
:10661000CA01B901A80197010E94594759016A01AD |
:106620008091FC079091FD07AA2797FDA095BA2FAE |
:10663000A81AB90ACA0ADB0AC401B301A801970162 |
:106640000E94594779018A0180910E0890910F08A4 |
:10665000AA2797FDA095BA2FE81AF90A0A0B1B0B77 |
:10666000D601C501D7FE03C00F96A11DB11D5C0167 |
:106670006D0154E0D594C794B794A7945A95D1F777 |
:10668000D801C70117FF03C00F96A11DB11D7C01E2 |
:106690008D0144E015950795F794E7944A95D1F755 |
:1066A00080910F0490911004813491053CF4809105 |
:1066B0000D0490910E0481349105A4F0C601B5013A |
:1066C00023E030E040E050E00E94594759016A0160 |
:1066D000C801B70123E030E040E050E00E94594794 |
:1066E00079018A0180917B07E82FFF27EE0FFF1FBA |
:1066F000E65BF84F808191810190F081E02DF7FFFA |
:1067000003C0F095E195FF4F7A97A4F0C601B5015B |
:1067100023E030E040E050E00E94594759016A010F |
:10672000C801B70123E030E040E050E00E94594743 |
:1067300079018A0121E2A216B104C104D1042CF02E |
:1067400030E2A32EB12CC12CD12C30EEA3163FEF9A |
:10675000B3063FEFC3063FEFD30644F420EEA22E6C |
:106760002FEFB22E2FEFC22E2FEFD22E41E2E416E2 |
:10677000F104010511052CF090E2E92EF12C012D18 |
:10678000112D50EEE5165FEFF5065FEF05075FEFA1 |
:10679000150744F480EEE82E8FEFF82E8FEF082FC8 |
:1067A0008FEF182F8091640490916504A091660486 |
:1067B000B09167048A199B09AC09BD0980936404F0 |
:1067C00090936504A0936604B093670480915C0481 |
:1067D00090915D04A0915E04B0915F048E199F09B1 |
:1067E000A00BB10B80935C0490935D04A0935E04B6 |
:1067F000B0935F048091E0039091E1038F3F910596 |
:1068000009F008F488C5552009F005C580912504D4 |
:10681000882309F000C580914304882309F0FBC454 |
:106820008091E6079091E707A091E807B091E9070A |
:10683000B7FF04C081509F4FAF4FBF4F292E3A2E54 |
:106840004B2E552447FC5A942092E6073092E707D6 |
:106850004092E8075092E9078091ED079091EE078A |
:10686000A091EF07B091F007B7FF04C081509F4F90 |
:10687000AF4FBF4F892F9A2FAB2FBB27A7FDBA95DC |
:106880008C879D87AE87BF878093ED079093EE0737 |
:10689000A093EF07B093F00780918C07E82EFF24B8 |
:1068A00000271127209174043091750440917604DB |
:1068B00050917704C801B7010E94E54697FF04C0D4 |
:1068C00061507F4F8F4F9F4FA72EB82EC92EDD24CA |
:1068D000C7FCDA94A0927404B0927504C092760456 |
:1068E000D092770420917004309171044091720429 |
:1068F00050917304C801B7010E94E54697FF04C098 |
:1069000061507F4F8F4F9F4F672E782E892E99248D |
:1069100087FC9A9460927004709271048092720461 |
:106920009092730480916C0490916D04A0916E0418 |
:10693000B0916F04B7FF04C081509F4FAF4FBF4F5E |
:10694000892F9A2FAB2FBB27A7FDBA9580936C0494 |
:1069500090936D04A0936E04B0936F04D201C101B3 |
:106960008A199B09AC09BD098093BA049093BB04B2 |
:10697000A093BC04B093BD042091A507E22EFF2490 |
:1069800000271127BC01CD01A80197010E9459479A |
:1069900059016A012093CB043093CC044093CD0479 |
:1069A0005093CE048C859D85AE85BF858619970949 |
:1069B000A809B9098093BE049093BF04A093C004B2 |
:1069C000B093C104BC01CD01A80197010E945947B1 |
:1069D0002093CF043093D0044093D1045093D20439 |
:1069E000D601C501D7FE04C081509F4FAF4FBF4FA6 |
:1069F000892F9A2FAB2FBB27A7FDBA959093280418 |
:106A00008093270457FF04C021503F4F4F4F5F4FE3 |
:106A1000BB2757FDBA95A52F942F832F90932A0457 |
:106A20008093290480910F04909110048134910582 |
:106A3000DCF480910D0490910E0481349105A4F44E |
:106A400080917B07E82FFF27EE0FFF1FE65BF84FD3 |
:106A5000808191810190F081E02DF7FF03C0F095D6 |
:106A6000E195FF4F7A97C4F0809127049091280414 |
:106A700097FD019695958795909328048093270418 |
:106A80008091290490912A0497FD01969595879508 |
:106A900090932A04809329048091DE079091DF0768 |
:106AA000A091E007B091E107B7FF04C081509F4F6C |
:106AB000AF4FBF4F892F9A2FAB2FBB27A7FDBA959A |
:106AC0008093DE079093DF07A093E007B093E10780 |
:106AD0008091D3079091D407A091D507B091D607A4 |
:106AE000B7FF04C081509F4FAF4FBF4F892F9A2FE0 |
:106AF000AB2FBB27A7FDBA958093D3079093D407FC |
:106B0000A093D507B093D607809184049091850413 |
:106B1000A0918604B0918704EC80FD800E811F81D6 |
:106B2000E81AF90A0A0B1B0BE092B204F092B304C4 |
:106B30000093B4041093B50480917C0490917D047B |
:106B4000A0917E04B0917F04288539854A855B85B4 |
:106B5000281B390B4A0B5B0B2093B6043093B70408 |
:106B60004093B8045093B904E092BA04F092BB0485 |
:106B70000093BC041093BD042093BE043093BF0463 |
:106B80004093C0045093C1048091600490916104CB |
:106B9000A0916204B09163048E199F09A00BB10B00 |
:106BA0008093600490936104A0936204B0936304A3 |
:106BB0008091580490915904A0915A04B0915B04BB |
:106BC000821B930BA40BB50B80935804909359042C |
:106BD000A0935A04B0935B04209141043091420485 |
:106BE0002138310594F08091980490919904019690 |
:106BF00090939904809398048091F1079091F20703 |
:106C000001969093F2078093F10720583F4F94F438 |
:106C1000809198049091990401979093990480939E |
:106C200098048091F1079091F20701979093F207F1 |
:106C30008093F107A090ED07B090EE07C090EF07AA |
:106C4000D090F007C601B5012AE130E040E050E005 |
:106C50000E94594730931B0720931A071092420451 |
:106C60001092410481E090E09093D8048093D7047F |
:106C70008091DD049091DE04A091DF04B091E004E6 |
:106C80002091E6073091E7074091E8075091E90726 |
:106C9000821B930BA40BB50B815E914BAF4FBF4F83 |
:106CA0008F539C49A040B04008F0FEC0F1E0EF16C1 |
:106CB000F0E1FF06F0E00F07F0E01F070CF46CC0F6 |
:106CC0008091D904882309F463C0D801C70117FF54 |
:106CD00007C088279927DC018E199F09A00BB10BEB |
:106CE000B7FF04C08150904FAF4FBF4F2CE0B59518 |
:106CF000A795979587952A95D1F701969093D804F3 |
:106D00008093D704D801C70117FF03C00796A11DC0 |
:106D1000B11D13E0B595A795979587951A95D1F76D |
:106D20008093CB049093CC04A093CD04B093CE0475 |
:106D300089589341A040B04064F088E893E1A0E016 |
:106D4000B0E08093CB049093CC04A093CD04B09397 |
:106D5000CE042091CB043091CC044091CD045091CD |
:106D6000CE0457FF04C021503F4F4F4F5F4F232F9A |
:106D7000342F452F552747FD5A9580912704909130 |
:106D80002804820F931F909328048093270406C041 |
:106D900081E08093D90402C01092D904E090BA0433 |
:106DA000F090BB040091BC041091BD0420E0E216F9 |
:106DB00020EFF2062FEF02072FEF12070CF071C041 |
:106DC0008091DA04882309F468C0A801970117FFAD |
:106DD00007C022273327A9012E193F09400B510B69 |
:106DE00057FF04C02150304F4F4F5F4FECE0559597 |
:106DF000479537952795EA95D1F78091D7049091DB |
:106E0000D804820F931F9093D8048093D704D8019D |
:106E1000C70117FF03C00796A11DB11D73E0B5950B |
:106E2000A795979587957A95D1F78093CB04909302 |
:106E3000CC04A093CD04B093CE0488579C4EAF4FA2 |
:106E4000BF4F64F488E79CEEAFEFBFEF8093CB04B5 |
:106E50009093CC04A093CD04B093CE042091CB04A6 |
:106E60003091CC044091CD045091CE0457FF04C022 |
:106E700021503F4F4F4F5F4F232F342F452F552722 |
:106E800047FD5A958091270490912804820F931F03 |
:106E9000909328048093270411C081E08093DA0442 |
:106EA0000DC01092DA040AC01092D8041092D704D0 |
:106EB00088EE93E09093900380938F031091A60740 |
:106EC000212F33278091D7049091D80428173907B0 |
:106ED00024F43093D8042093D7044091BA045091FD |
:106EE000BB046091BC047091BD04413084E058073C |
:106EF00080E0680780E0780774F080919C049091AE |
:106F00009D042091D7043091D804820F931F909351 |
:106F10009D0480939C0440505C4F6F4F7F4F74F4EE |
:106F200080919C0490919D042091D7043091D804C5 |
:106F3000821B930B90939D0480939C0481E090E0CE |
:106F40009093D8048093D7041092CF041092D00469 |
:106F50001092D1041092D2048091E1049091E20445 |
:106F6000A091E304B091E4048A199B09AC09BD091E |
:106F7000815E914BAF4FBF4F8F539C49A040B040B3 |
:106F800008F000C1C090BE04D090BF04E090C004DF |
:106F9000F090C104F1E0CF16F0E1DF06F0E0EF067B |
:106FA000F0E0FF060CF46CC08091DB04882309F448 |
:106FB00063C0D701C601F7FE07C088279927DC0107 |
:106FC0008C199D09AE09BF09B7FF04C08150904FCD |
:106FD000AF4FBF4F3CE0B595A795979587953A95EC |
:106FE000D1F701969093D8048093D704D701C601B6 |
:106FF000F7FE03C00796A11DB11D23E0B595A79527 |
:10700000979587952A95D1F78093CF049093D004D4 |
:10701000A093D104B093D20489589341A040B040CA |
:1070200064F088E893E1A0E0B0E08093CF0490930F |
:10703000D004A093D104B093D2042091CF04309116 |
:10704000D0044091D1045091D20457FF04C0215084 |
:107050003F4F4F4F5F4F232F342F452F552747FD6D |
:107060005A958091290490912A04820F931F90933E |
:107070002A048093290406C081E08093DB0402C0C7 |
:107080001092DB0420E0C21620EFD2062FEFE206BA |
:107090002FEFF2060CF073C08091DC04882309F412 |
:1070A0006AC0D701C601F7FE07C088279927DC010F |
:1070B0008C199D09AE09BF099C01AD01B7FF04C041 |
:1070C0002150304F4F4F5F4F8CE055954795379586 |
:1070D00027958A95D1F78091D7049091D804820F93 |
:1070E000931F9093D8048093D704D701C601F7FE6D |
:1070F00003C00796A11DB11D03E0B595A79597950F |
:1071000087950A95D1F78093CF049093D004A093EC |
:10711000D104B093D20488579C4EAF4FBF4F64F454 |
:1071200088E79CEEAFEFBFEF8093CF049093D0043D |
:10713000A093D104B093D2042091CF043091D00415 |
:107140004091D1045091D20457FF04C021503F4FC9 |
:107150004F4F5F4F232F342F452F552747FD5A950B |
:107160008091290490912A04820F931F90932A04FE |
:107170008093290411C081E08093DC040DC010923B |
:10718000DC040AC01092D8041092D70488EE93E071 |
:107190009093900380938F03212F33278091D704FE |
:1071A0009091D8042817390724F43093D8042093F9 |
:1071B000D7044091BE045091BF046091C004709107 |
:1071C000C104413084E0580780E0680780E0780718 |
:1071D00074F080919A0490919B042091D70430918F |
:1071E000D804820F931F90939B0480939A0440507D |
:1071F0005C4F6F4F7F4FCCF480919A0490919B0429 |
:107200002091D7043091D804821B930B90939B0458 |
:1072100080939A040AC010922A04109229041092B2 |
:10722000280410922704109243048091F307909150 |
:10723000F407A091F507B091F60720E030E040E0B8 |
:1072400050E0BC01CD010E942D46882341F41092EC |
:107250002A04109229041092280410922704809185 |
:10726000E6079091E707A091E807B091E9078093BE |
:10727000DD049093DE04A093DF04B093E0048091DA |
:10728000ED079091EE07A091EF07B091F007809382 |
:10729000E1049093E204A093E304B093E404109219 |
:1072A0007404109275041092760410927704109270 |
:1072B0007004109271041092720410927304109270 |
:1072C0006C0410926D0410926E0410926F04109270 |
:1072D000E6071092E7071092E8071092E90710926C |
:1072E000ED071092EE071092EF071092F007109240 |
:1072F000DE071092DF071092E0071092E10710926C |
:10730000D3071092D4071092D5071092D607109287 |
:10731000E1031092E003A0903204B0903304C50161 |
:10732000B7FE04C0882799278A199B0940976CF0FB |
:1073300088EE93E09093900380938F038091800771 |
:1073400084FD03C081E08093CA04D0908907ED2CAE |
:10735000FF2400271127B501882777FD8095982FF6 |
:107360009501B7FE04C0222733272A193B09442779 |
:1073700037FD4095542F0E94E5469B01AC01C801A2 |
:10738000B7010E94E54697FF04C061507E4F8F4FC2 |
:107390009F4FE9E09595879577956795EA95D1F7A1 |
:1073A0009B018D2D99278A9DD0018B9DB00D9A9DB3 |
:1073B000B00D1124CD01B7FD039695958795959550 |
:1073C0008795280F391F442737FD4095542F209368 |
:1073D000AE043093AF044093B0045093B104809155 |
:1073E000540490915504A0915604B0915704821B07 |
:1073F000930BA40BB50B8093540490935504A09366 |
:107400005604B09357048155934CA040B04064F0AB |
:1074100080E593ECA0E0B0E0809354049093550491 |
:10742000A0935604B093570480915404909155044E |
:10743000A0915604B0915704805B9C43AF4FBF4F5F |
:1074400064F480EB9CE3AFEFBFEF80935404909320 |
:107450005504A0935604B093570480914A04909128 |
:107460004B04892B09F455C18091800783FF51C1DA |
:107470008091840490918504A0918604B091870442 |
:10748000B7FF04C081509E4FAF4FBF4F59E0B59535 |
:10749000A795979587955A95D1F76C0197FF04C0EA |
:1074A000D094C194D108D39480917C0490917D04B0 |
:1074B000A0917E04B0917F04B7FF04C081509E4F1D |
:1074C000AF4FBF4F49E0B595A795979587954A95DA |
:1074D000D1F7BC0197FF03C0709561957F4FC61629 |
:1074E000D7060CF46B01B601D7FE02C0695F7F4F6F |
:1074F0001B0133E0359427943A95E1F70894211C59 |
:10750000311C80914A0490914B04845E9D4F7C0114 |
:107510000027F7FC0095102F40900A0850900B08A8 |
:1075200060900C0870900D08C301B2012EE036E0A7 |
:1075300040E050E00E94594749015A01E21AF30A1B |
:10754000040B150BC801B70128E631E040E050E01C |
:107550000E945947DC01CB019C01245B3040E09143 |
:107560008F03F09190033097F1F409E1C016D10434 |
:10757000D4F48091410490914204820F931F909320 |
:107580004204809341048091CA04882361F088EC0E |
:1075900090E09093D4038093D30390924904809217 |
:1075A00048041092CA04C90123E0880F991F2A9544 |
:1075B000E1F7B1010E9424479B01442737FD409524 |
:1075C000542F240D351D461D571D20930A08309356 |
:1075D0000B0840930C0850930D0810917E03612F07 |
:1075E0007727C69EC001C79E900DD69E900D112490 |
:1075F00097FD4F966C0185E0D594C7948A95E1F785 |
:107600006C197D096B0177FD7EC0309709F075C05C |
:10761000E0900F04F090100480910D0490910E04FE |
:10762000E80EF91EF7FE04C087E090E0E80EF91EB0 |
:1076300003E0F594E7940A95E1F7A0E4B0E0EA0EE0 |
:10764000FB1ECA01B9012EE036E040E050E00E9486 |
:107650005947DA01C901209148043091490444276F |
:1076600037FD4095542F821B930BA40BB50B845E02 |
:107670009D4FAF4FBF4FBC01CD0128E631E040E048 |
:1076800050E00E945947DC01CB01845B90408C9D07 |
:10769000F0018D9DF00D9C9DF00D1124CF01B701DF |
:1076A0000E94244783E0189F60011124C616D70664 |
:1076B00014F4B60108C0882799278C199D0968170A |
:1076C00079070CF4BC019B01442737FD4095542FEA |
:1076D0008091540490915504A0915604B0915704A0 |
:1076E000820F931FA41FB51F8093540490935504D9 |
:1076F000A0935604B09357040CC03197F0939003B5 |
:10770000E0938F0306C084EF91E090939003809301 |
:107710008F038091C90481508093C9048F3F09F081 |
:10772000B8C088E18093C90480918C07E82EFF24BB |
:10773000002711278091840490918504A0918604EC |
:10774000B0918704BC01CD01A80197010E9459475F |
:107750003093EF062093EE0680917C0490917D0497 |
:10776000A0917E04B0917F04BC01CD01A8019701D6 |
:107770000E9459473093F1062093F0068091FC0750 |
:107780009091FD079093F3068093F20680910E0886 |
:1077900090910F089093F5068093F406809100086D |
:1077A000909101089093F7068093F60680912D043E |
:1077B00090912E049093F9068093F80680914C04E2 |
:1077C00090914D04A0914E04B0914F04B7FF04C0B6 |
:1077D00081509E4FAF4FBF4F19E0B595A795979534 |
:1077E00087951A95D1F79093FB068093FA068091BE |
:1077F0004A0490914B049093FF068093FE0680917B |
:1078000017039091180390930107809300078091CC |
:107810000A0890910B08A0910C08B0910D08BC01CA |
:10782000CD012EE036E040E050E00E945947309311 |
:107830000507209304078091380499279093030744 |
:10784000809302078091E2079091E30790930F07DE |
:1078500080930E0780914706992790931507809390 |
:1078600014078091D0039091D103909317078093D0 |
:1078700016078091FB049091FC0490932B07809352 |
:107880002A078091F9049091FA0490932D07809330 |
:107890002C0780912604A0900508B0900608C0909F |
:1078A0000708D09008088823A9F08091D907909103 |
:1078B000DA07AA2797FDA095BA2FBC01CD010E9437 |
:1078C0002346DC01CB01A6019501BC01CD010E943C |
:1078D0009D463AC08091840490918504A0918604CD |
:1078E000B0918704BC01CD010E9423467B018C012D |
:1078F0008091F3079091F407A091F507B091F607F6 |
:107900009C01AD01C801B7010E949D467B018C011D |
:107910008091D9079091DA07AA2797FDA095BA2FF1 |
:10792000BC01CD010E942346DC01CB01A6019501DB |
:10793000BC01CD010E949D46DC01CB019C01AD0143 |
:10794000C801B7010E947E45DC01CB01BC01CD011D |
:107950000E940646DC01CB019093DA078093D90799 |
:1079600080912504A0900508B0900608C0900708F3 |
:10797000D09008088823A9F08091CD079091CE0778 |
:10798000AA2797FDA095BA2FBC01CD010E942346DE |
:10799000DC01CB01A6019501BC01CD010E949D46F1 |
:1079A0003AC080917C0490917D04A0917E04B091B6 |
:1079B0007F04BC01CD010E9423467B018C01809194 |
:1079C000F3079091F407A091F507B091F6079C0199 |
:1079D000AD01C801B7010E949D467B018C018091D9 |
:1079E000CD079091CE07AA2797FDA095BA2FBC018D |
:1079F000CD010E942346DC01CB01A6019501BC010B |
:107A0000CD010E949D46DC01CB019C01AD01C80166 |
:107A1000B7010E947E45DC01CB01BC01CD010E9473 |
:107A20000646DC01CB019093CE078093CD07809171 |
:107A3000000890910108AA2797FDA095BA2FBC01D4 |
:107A4000CD010E9423467B018C0180910508909115 |
:107A50000608A0910708B09108089C01AD01BC017F |
:107A6000CD010E947E45DC01CB019C01AD01C80126 |
:107A7000B7010E949D467B018C0180916804909122 |
:107A80006904A0916A04B0916B04BC01CD010E940D |
:107A90002346DC01CB014090F3075090F40760903F |
:107AA000F5077090F607A3019201BC01CD010E9479 |
:107AB0009D46DC01CB0120E030E040E05FE3BC010B |
:107AC000CD010E949D46DC01CB019C01AD01C801A6 |
:107AD000B7010E947E45DC01CB01BC01CD010E94B3 |
:107AE0000646DC01CB019093010880930008809149 |
:107AF000D9079091DA07909319078093180780911E |
:107B0000CD079091CE0790931B0780931A07809121 |
:107B1000D9079091DA078150904434F080E090E4E6 |
:107B20009093DA078093D9078091D9079091DA076B |
:107B30008050904C34F480E090EC9093DA0780937E |
:107B4000D9078091CD079091CE078150904434F0B1 |
:107B500080E090E49093CE078093CD078091CD078D |
:107B60009091CE078050904C34F480E090EC90934C |
:107B7000CE078093CD078091000890910108815035 |
:107B8000904434F080E090E49093010880930008E2 |
:107B900080910008909101088050904C34F480E06E |
:107BA00090EC909301088093000889819A81880F56 |
:107BB000991F880F991F9A8389838091800799273D |
:107BC00080FFF0C02091810381FF0EC0223310F5A9 |
:107BD00080912D0490912E04449790932C048093CF |
:107BE0002B041092440419C0809175039091760380 |
:107BF000820F911D209185073327829FD001839F9B |
:107C0000B00D929FB00D1124CD01449790932C0498 |
:107C100080932B0481E080934404BB81BB2321F03B |
:107C200010922C0410922B0400912D0410912E041C |
:107C300020912B0430912C04201731070CF0B2C096 |
:107C400080914404882309F4ADC0021B130B80917A |
:107C500080039927089FF001099FF00D189FF00DF0 |
:107C60001124CF01F7FD03968C0115950795159505 |
:107C70000795E980FA80E01AF10A87018091E20312 |
:107C80009091E30397FD019695958795081B190B35 |
:107C9000C0904C04D0904D04E0904E04F0904F04FE |
:107CA000F7FE08C02FE730E040E050E0C20ED31EE0 |
:107CB000E41EF51E67E0F594E794D794C7946A959F |
:107CC000D1F780917F03282F332744275527C701F9 |
:107CD000B6010E94E54697FF04C0615E7F4F8F4F5B |
:107CE0009F4F55E095958795779567955A95D1F76C |
:107CF00031E0693173071CF068E171E006C04EEFB6 |
:107D0000683E740714F468EE7EEF061B170B809133 |
:107D1000C7049091C8049C0144E0220F331F4A9588 |
:107D2000E1F7281B390B200F311F37FF02C0215FFD |
:107D30003F4F14E0359527951A95E1F73093C80425 |
:107D40002093C70480918107482F5527440F551F62 |
:107D5000440F551F2417350794F489819A8184179D |
:107D6000950724F05093C8044093C704A981BA81B1 |
:107D7000A417B50724F4B093C804A093C704809156 |
:107D8000C7049091C804E981FA81E817F90724F43F |
:107D9000F093C804E093C704E090C704F090C804CF |
:107DA000FA82E9823090FF07832D9927880F991F67 |
:107DB000880F991F8055904009811A81801791077B |
:107DC00014F49A83898329813A813093FD062093A4 |
:107DD000FC068091AE049091AF04A091B004B091E4 |
:107DE000B104F2E0880F991FAA1FBB1FFA95D1F7C3 |
:107DF0008090000890900108881A990A213A31056C |
:107E00008CF0C90137FD01969595879588159905E0 |
:107E10000CF44C01909581959F4F8816990694F427 |
:107E20004C0110C031E5831691041CF070E5872EDB |
:107E3000912C40EB84164FEF940624F460EB862ED1 |
:107E40006FEF962E232D3327220F331F220F331F60 |
:107E5000C901A981BA818A1B9B0B881599050CF46D |
:107E60004C01E981FA81E21BF30B8E169F060CF49C |
:107E70004F018091D9079091DA07E0903604F09095 |
:107E80003704FD8AEC8A8E199F099093E507809349 |
:107E9000E40720E030E040E050E0C301B2010E947E |
:107EA0002D462091A6043091A7044091A80450913A |
:107EB000A904882309F448C0CA01B9010E942346D5 |
:107EC0005B016C018091840490918504A0918604EB |
:107ED000B0918704BC01CD010E942346DC01CB0197 |
:107EE000A3019201BC01CD010E949D467B018C0142 |
:107EF0002C893D89C901AA2797FDA095BA2FBC01FD |
:107F0000CD010E942346DC01CB019C01AD01C801DB |
:107F1000B7010E947D45DC01CB019C01AD01C6018A |
:107F2000B5010E947E45DC01CB01BC01CD010E9460 |
:107F30000646DC01CB018093A6049093A704A0938E |
:107F4000A804B093A90414C08091E4079091E507B8 |
:107F5000AA2797FDA095BA2F280F391F4A1F5B1F2C |
:107F60002093A6043093A7044093A8045093A90437 |
:107F70008091A6049091A704A091A804B091A904AF |
:107F800081509A4FA040B04064F080E09AEFA0E0AA |
:107F9000B0E08093A6049093A704A093A804B093A4 |
:107FA000A9048091A6049091A704A091A804B0917F |
:107FB000A90480509640AF4FBF4F64F480E096E034 |
:107FC000AFEFBFEF8093A6049093A704A093A804FB |
:107FD000B093A9048091E4079091E507AA2797FD43 |
:107FE000A095BA2FBC01CD010E9423467B018C01D4 |
:107FF0008091A6049091A704A091A804B091A9042F |
:10800000BC01CD010E942346DC01CB0120918303FA |
:10801000309184034091850350918603288B398BDE |
:108020004A8B5B8B9C01AD01688979898A899B8920 |
:108030000E949D46DC01CB019C01AD01C801B70146 |
:108040000E947E45DC01CB01BC01CD010E940646A9 |
:10805000DC01CB018C0120907703622D77278827E4 |
:108060009927940197FE04C022273327281939093C |
:1080700037FF02C02F5F3F4F3595279549815A81C1 |
:10808000240F351F442737FD4095542F0E94E546A5 |
:1080900097FF04C0615C7F4F8F4F9F4F26E09595FF |
:1080A0008795779567952A95D1F79B01601771079A |
:1080B0000CF48B01309521953F4F021713070CF4F8 |
:1080C000890129813A81200F311F280D391DC901ED |
:1080D00037FD03969C01359527953595279537FFF4 |
:1080E00003C020E030E006C0832D99278217930754 |
:1080F0000CF49C013090DC07832D99272817390751 |
:108100000CF49C012093CF0729813A81201B310B6D |
:10811000280D391DC90137FD03969C01359527951A |
:108120003595279537FF03C020E030E007C08091E8 |
:10813000FF079927821793070CF49C01832D992739 |
:10814000281739070CF49C012093D8078091CD079C |
:108150009091CE07A0913404B0913504BD8BAC8BC7 |
:108160008A1B9B0B9093CC078093CB0720E030E0D9 |
:1081700040E050E0C301B2010E942D462091AA04C4 |
:108180003091AB044091AC045091AD04882309F4C4 |
:1081900048C0CA01B9010E9423465B016C0180916D |
:1081A0007C0490917D04A0917E04B0917F04BC0179 |
:1081B000CD010E942346DC01CB01A3019201BC0149 |
:1081C000CD010E949D467B018C01EC89FD89CF0188 |
:1081D000AA2797FDA095BA2FBC01CD010E94234686 |
:1081E000DC01CB019C01AD01C801B7010E947D45B6 |
:1081F000DC01CB019C01AD01C601B5010E947E45A9 |
:10820000DC01CB01BC01CD010E940646DC01CB01A3 |
:108210008093AA049093AB04A093AC04B093AD04F4 |
:1082200014C08091CB079091CC07AA2797FDA09509 |
:10823000BA2F280F391F4A1F5B1F2093AA043093BF |
:10824000AB044093AC045093AD048091AA04909188 |
:10825000AB04A091AC04B091AD0481509A4FA04002 |
:10826000B04064F080E09AEFA0E0B0E08093AA0410 |
:108270009093AB04A093AC04B093AD048091AA0496 |
:108280009091AB04A091AC04B091AD0480509640A5 |
:10829000AF4FBF4F64F480E096E0AFEFBFEF809345 |
:1082A000AA049093AB04A093AC04B093AD04809166 |
:1082B000CB079091CC07AA2797FDA095BA2FBC01B8 |
:1082C000CD010E9423467B018C018091AA049091EC |
:1082D000AB04A091AC04B091AD04BC01CD010E94EF |
:1082E0002346DC01CB019C01AD01688979898A892B |
:1082F0009B890E949D46DC01CB019C01AD01C80118 |
:10830000B7010E947E45DC01CB01BC01CD010E947A |
:108310000646DC01CB018C01622D7727882799273F |
:10832000940197FE04C0222733272819390937FF03 |
:1083300002C02F5F3F4F3595279549815A81240F01 |
:10834000351F442737FD4095542F0E94E54697FF7F |
:1083500004C0615C7F4F8F4F9F4FF6E095958795E6 |
:1083600077956795FA95D1F79B01601771070CF423 |
:108370008B01309521953F4F021713070CF48901AB |
:1083800029813A81200F311F28193909C90137FD88 |
:1083900003969C01359527953595279537FF03C0A2 |
:1083A00020E030E007C08091FF07992782179307EC |
:1083B0000CF49C01832D9927281739070CF49C0194 |
:1083C0002093F90729813A81201B310B281939099B |
:1083D000C90137FD03969C0135952795359527955D |
:1083E00037FF03C020E030E007C08091FF079927E6 |
:1083F000821793070CF49C01832D992728173907BE |
:108400000CF49C012093F70765960FB6F894DEBF35 |
:108410000FBECDBFDF91CF911F910F91FF90EF90D5 |
:10842000DF90CF90BF90AF909F908F907F906F9094 |
:108430005F904F903F902F9008958091F10490911C |
:10844000F204A091F304B091F4048093E9049093B2 |
:10845000EA04A093EB04B093EC048091ED049091B6 |
:10846000EE04A091EF04B091F0048093E5049093A2 |
:10847000E604A093E704B093E80408951092FC0486 |
:108480001092FB041092FA041092F904089584B13A |
:10849000806A84B93D9A82E58CBD1DBC459A81E015 |
:1084A000809314088AEA8093180883E88093190857 |
:1084B0008AE080931A0810921C0810921B081092F0 |
:1084C0001E0810921D0810923A080895F8948091A1 |
:1084D000840490918504A0918604B0918704BC0126 |
:1084E000CD012CE630E040E050E00E945947309347 |
:1084F0001C0820931B0880917C0490917D04A0911E |
:108500007E04B0917F04BC01CD012CE630E040E058 |
:1085100050E00E94594730931E0820931D08809117 |
:108520000A0890910B08A0910C08B0910D08BC01AD |
:10853000CD012EE036E040E050E00E9459473093F4 |
:10854000240820932308E0918E04F0918F048091F9 |
:10855000EA079091EB07BF010E9424472CE030E02E |
:10856000629FA001639F500D729F500D1124509384 |
:10857000200840931F088091030890910408BF01D0 |
:108580000E942447629FA001639F500D729F500D6F |
:108590001124509322084093210810928F041092C6 |
:1085A0008E041092EB071092EA07109204081092C2 |
:1085B000030880911A0899278B30910509F468C047 |
:1085C0008C3091051CF40A9741F0E4C08C30910581 |
:1085D00009F4D7C00D97D1F1DDC0809120048093BC |
:1085E0002B0880911F0480932C0880911E04809397 |
:1085F0002D0880911D0480932E0880911C04809387 |
:108600002F0880911B048093300880911A04809376 |
:108610003108809119048093320880910A04809374 |
:108620003308837F80930A04809117039091180385 |
:10863000809334088091900780933508A2E0B0E0E1 |
:108640000E947447802D80933608A4C08091D7077C |
:1086500080932B088091100880932C088091D0077C |
:1086600080932D088091DB0780932E08809113085A |
:1086700080932F088091DD07809330088091B607A2 |
:10868000809331088091B707809332088FE076C0DD |
:1086900080917A07E82FFF27EE0FFF1FE65BF84F68 |
:1086A0000190F081E02DE038F1051CF0EFE7F0E0FB |
:1086B00006C05FEFE138F50714F4E1E8FFEFE0935F |
:1086C0002B0880917B07E82FFF27EE0FFF1FE65B4B |
:1086D000F84F0190F081E02DE038F1051CF0EFE754 |
:1086E000F0E006C06FEFE138F60714F4E1E8FFEFC1 |
:1086F000E0932C0880917907E82FFF27EE0FFF1FEA |
:10870000E65BF84F0190F081E02DE038F1051CF0B8 |
:10871000EFE7F0E006C08FEFE138F80714F4E1E886 |
:10872000FFEFE0932D0880917807E82FFF27EE0FE9 |
:10873000FF1FE65BF84F0190F081E02DE038F10576 |
:108740001CF0EFE7F0E006C02FEFE138F20714F479 |
:10875000E1E8FFEFE0932E0880913F0480932F081B |
:1087600080913D048093300880913B0480933108D0 |
:1087700080913904809332088091380480933308C3 |
:1087800009C080914706863018F01092470685E0B0 |
:1087900080932B08789480913A08882309F456C076 |
:1087A00040913C0850913D08CA0181509E4F8F5F17 |
:1087B0009340B0F420913E0830913F08C9018150A8 |
:1087C0009E4F8F5F934060F48091800785FF08C0C3 |
:1087D0005093FC044093FB043093FA042093F90473 |
:1087E000809142089091430821E08936920724F451 |
:1087F00090934B0480934A0480914A0490914B04D7 |
:108800002091480430914904821B930B845E9D4F54 |
:1088100068E671E00E942447845B9040909347048F |
:108820008093460480914608282F33278091D303F4 |
:108830009091D4038217930788F480914706882388 |
:1088400069F43093D4032093D30308951092FC0469 |
:108850001092FB041092FA041092F904089580918A |
:108860001408882309F43BC0459888E198E0909368 |
:108870001608809315089091FD04E92FFF27E45511 |
:10888000FC4F9F5F9093FD04808180931A08953080 |
:1088900010F01092FD04109214080E94664281E0CC |
:1088A0008093170800000000000000000000000096 |
:1088B00000000000000000000000000000000000B8 |
:1088C00000000000000000000000000000000000A8 |
:1088D0000000000080911808809337088EBD08952D |
:1088E00030911408332309F085C00DB407FE82C00F |
:1088F00084E08093D203459A2EB58091FF04992796 |
:108900008130910589F0823091051CF4892B21F08A |
:108910003EC00297B9F03BC0309339082093000560 |
:108920002138A9F581E008C0253549F4809100057A |
:10893000820F8093000582E08093FF0428C030936B |
:10894000FF0425C080913908E82FFF27EC5AF74F24 |
:1089500020838F5F80933908909100058931A0F0C2 |
:10896000291769F4ABE3B8E0E4E5F8E089E10190A8 |
:108970000D928150E1F781E080933A0802C0309374 |
:108980003A081092FF0403C0920F909300052091C3 |
:108990001708203208F028C04598000000000000A9 |
:1089A00000000000000000000000000000000000C7 |
:1089B00000000000000000000000000000000000B7 |
:1089C00000000000000000000000E0911508F09198 |
:1089D0001608E20FF11D80818EBD809137089081CD |
:1089E000890F8093370803C081E0809314082F5FBC |
:1089F00020931708089587B18C6087B942984398EF |
:108A00001092020580E88093B203109201058093D2 |
:108A1000B1030895809107058150809307058F3F2A |
:108A200009F05DC084E0809307059091AD079B3FFE |
:108A300020F08091EC07873E08F59B3F20F0809165 |
:108A4000EC078A30E8F0809102058150809302059E |
:108A50008F3FB9F48091EC0781508093020580919B |
:108A6000B203813011F480E801C086958093B2038F |
:108A70008091B2039091AC07892311F0429A01C012 |
:108A800042989091AF079B3F20F08091FE07873E70 |
:108A900018F59B3F30F08091FE078A3010F4439820 |
:108AA0000895809101058150809301058F3FB9F4AD |
:108AB0008091FE078150809301058091B103813040 |
:108AC00011F480E801C086958093B1038091B103D1 |
:108AD0009091AE07892311F0439A08954398089521 |
:108AE000FC014150504030F001900616D1F731970B |
:108AF000CF0108958827992708955058192EEFD04F |
:108B000001D0D2C0BA176207730784079507B1F185 |
:108B100088F40EF410940B2EBA2FA02D062E622F7F |
:108B2000202D072E732F302D082E842F402D092E37 |
:108B3000952F502DFF275523B9F0591B49F0573E6B |
:108B400098F0469537952795A795F0405395C9F726 |
:108B500076F0BA0F621F731F841F30F487957795E4 |
:108B60006795B795F040939517FA0F2E0895BF1BA0 |
:108B7000BB27BA0B620B730B840BF6CFDEF6DBC0A0 |
:108B8000AED001D091C0552359F0992369F09F5779 |
:108B90005F57951B33F442F4903811F4915805C097 |
:108BA0009BC091589F3F09F4C6C0BB271124621790 |
:108BB0007307840730F4660F771F881FBB1F91501F |
:108BC00098F311D00F920FD00F920DD0A0E8261776 |
:108BD000370748071B0609F0A048BA2F602D7F9180 |
:108BE0008F9100240895A0E800246217730784077A |
:108BF000B10528F0621B730B840BB1090A2A660FBA |
:108C0000771F881FBB1FA69581F7089597FB73D028 |
:108C10009F3738F0FEE9F91B982F872F762F6B2F9F |
:108C200005C086C09695879577956795F150D0F7E2 |
:108C30003EF490958095709561957F4F8F4F9F4F33 |
:108C40000895E89403C097FB0EF4F3DFB62F672F67 |
:108C5000782F892F9EE9002427C00ED05EF004C033 |
:108C60000BD026F001C008D019F020F48FEF089542 |
:108C700080E0089581E0089597FB092E052600F80D |
:108C8000689430D0E89407FC07C062177307840724 |
:108C9000950721F008F400940794989408959A9504 |
:108CA000BB0F661F771F881F11249923A1F088230B |
:108CB000B2F79F3F59F0BB0F48F421F4002011F4A4 |
:108CC00060FF04C06F5F7F4F8F4F9F4F881F979546 |
:108CD000879597F908952CC09FEF80EC0895052E95 |
:108CE000092607FA440F551F5F3F79F0AA27A517F9 |
:108CF00008F051E04795880F991F9F3F31F0BB273F |
:108D0000B91708F091E0879508959F919F911124DC |
:108D1000E3CF97FB880F991F9F3F31F0BB27B9170F |
:108D200008F091E0879508959F919F911124D4CFE9 |
:108D300066277727882799270895D1DF01D0B4CFF8 |
:108D4000992339F0552329F09F575F57950F13F456 |
:108D50009AF1F1CF91589F3FE1F3629FA12D0F92BD |
:108D6000BB27639FA00DB11DEE27729FA00DB11D03 |
:108D7000EE1FAF93AA27649FB00DE11D739FB00D46 |
:108D8000E11DAA1F6627829FB00DE11DA61F552772 |
:108D9000749FE00DA11D551F839FE00DA11D561F5F |
:108DA000849FA00D511D852F7A2F6E2F1F900F903D |
:108DB00088231AF4939539F48FCF000C111CBB1F34 |
:108DC000661F771F881F01280895629FD001739F37 |
:108DD000F001829FE00DF11D649FE00DF11D929F57 |
:108DE000F00D839FF00D749FF00D659FF00D992796 |
:108DF000729FB00DE11DF91F639FB00DE11DF91FBA |
:108E0000BD01CF0111240895991B79E004C0991F79 |
:108E1000961708F0961B881F7A95C9F780950895D4 |
:108E2000AA1BBB1B51E107C0AA1FBB1FA617B70790 |
:108E300010F0A61BB70B881F991F5A95A9F78095AC |
:108E40009095BC01CD01089597FB092E07260AD005 |
:108E500077FD04D0E5DF06D000201AF47095619507 |
:108E60007F4F0895F6F7909581959F4F0895A1E261 |
:108E70001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F94 |
:108E8000FF1FA217B307E407F50720F0A21BB30BDF |
:108E9000E40BF50B661F771F881F991F1A9469F75B |
:108EA00060957095809590959B01AC01BD01CF01B7 |
:108EB000089597FB092E05260ED057FD04D0D7DF65 |
:108EC0000AD0001C38F450954095309521953F4FBD |
:108ED0004F4F5F4F0895F6F7909580957095619587 |
:108EE0007F4F8F4F9F4F0895F999FECFB2BDA1BD1F |
:108EF000F89A119600B40895F999FECFB2BDA1BDBC |
:108F000000BC11960FB6F894FA9AF99A0FBE08951C |
:108F1000010A01496E74656772616C4E69636B206A |
:108F2000202020496E74656772616C526F6C6C20F2 |
:108F30002020204163634E69636B20202020202085 |
:108F4000202020416363526F6C6C20202020202061 |
:108F50002020204779726F476965722020202020E9 |
:108F6000202020486F6568656E5765727420202048 |
:108F70002020204163635A20202020202020202010 |
:108F80002020204761732020202020202020202026 |
:108F90002020204B6F6D7061737356616C75652076 |
:108FA0002020205370616E6E756E67202020202077 |
:108FB000202020456D7066616E67202020202020D3 |
:108FC00020202045727361747A6B6F6D70617373CA |
:108FD0002020204D6F746F725F566F726E65202077 |
:108FE0002020204D6F746F725F48696E74656E202B |
:108FF0002020204D6F746F725F4C696E6B73202060 |
:109000002020204D6F746F725F5265636874732007 |
:109010002020204163635F5A202020202020202030 |
:1090200020202044697374616E6365202020202015 |
:109030002020204F736442617220202020202020B5 |
:109040002020204D4B334D61672043616C53746188 |
:10905000746520536572766F202020202020202008 |
:109060002020204E69636B202020202020202020FB |
:10907000202020526F6C6C202020202020202020D7 |
:1090800020202020202020202020202020202020E0 |
:1090900020202020202020202020202020202020D0 |
:1090A00020202020202020202020202020202020C0 |
:1090B00020202020202020202020202020202020B0 |
:1090C00020202020202020202020202020202020A0 |
:1090D0002020202020202020202020202020202090 |
:1090E0002020202020202020202020202020202080 |
:1090F0002020204750535F4E69636B2020202020A2 |
:109100002020204750535F526F6C6C20202020207D |
:1091100020202064FF01FFFF28000180640073739A |
:1091200073FF03007D0000640048616C6C6F205782 |
:10913000656C7400000000000000000000000000EA |
:10914000000000000000000000000000000000001F |
:10915000000000000000000000000000000000000F |
:1091600000000000000000000000000000000000FF |
:1091700000000000000000000001020304050607D3 |
:1091800008090A0B01ECFF6446640A029696403A0D |
:1091900010FB3017B7D13890D0030090D00300F403 |
:1091A00001640053706F727400004E6F726D616CD9 |
:1091B0000000426567696E6E657200000A0B0D0B58 |
:0491C0000C0101009D |
:00000001FF |
/tags/V0.70d/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 |
/tags/V0.70d/Kopter-Tool/MikroKopter-Tool.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/V0.70d/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. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/tags/V0.70d/Settings.h |
---|
--- tags/V0.70d/_Settings.h (nonexistent) |
+++ tags/V0.70d/_Settings.h (revision 930) |
@@ -0,0 +1,44 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/tags/V0.70d/analog.c |
---|
0,0 → 1,181 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state); |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
// AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(StartLuftdruck - tmpLuftdruck - HoehenWert))/8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/tags/V0.70d/analog.h |
---|
0,0 → 1,26 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/tags/V0.70d/eeprom.c |
---|
0,0 → 1,218 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;//CFG_HOEHEN_SCHALTER |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 15; // Wert : 1-6 |
EE_Parameter.Stick_D = 30; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 12; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/tags/V0.70d/fc.c |
---|
0,0 → 1,1280 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
volatile int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
float GyroFaktor; |
float IntegralFaktor; |
volatile int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
float Ki = FAKTOR_I; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_ExternalControl; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
unsigned char MikroKopterFlags = 0; |
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) |
//############################################################################ |
{ |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
AdNeutralGierBias = AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
//DebugOut.Analog[26] = MesswertNick; |
DebugOut.Analog[28] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
ErsatzKompass += MesswertGier; |
Mess_Integral_Gier += MesswertGier; |
// Mess_Integral_Gier2 += MesswertGier; |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 4096L; |
tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(AdWertRoll < 15) MesswertRoll = -1000; |
if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertRoll > 1010) MesswertRoll = +1000; |
if(AdWertRoll > 1017) MesswertRoll = +2000; |
} |
else |
{ |
if(AdWertRoll > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(AdWertNick < 15) MesswertNick = -1000; |
if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +1000; |
if(AdWertNick > 1017) MesswertNick = +2000; |
} |
else |
{ |
if(AdWertNick > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
if(PlatinenVersion >= 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(!MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
} else MikroKopterFlags |= FLAG_MOTOR_RUN; |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_NaviGpsModeControl,EE_Parameter.NaviGpsModeControl,0,255); |
CHK_POTI(Parameter_NaviGpsGain,EE_Parameter.NaviGpsGain,0,255); |
CHK_POTI(Parameter_NaviGpsP,EE_Parameter.NaviGpsP,0,255); |
CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255); |
CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255); |
CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 20 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
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; |
MikroKopterFlags |= FLAG_START; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
int tmp_int; |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
// StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
// StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
/* if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick) |
MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--; |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll) |
MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--; |
*/ |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN); |
IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN); |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Digitale Steuerung per DubWise |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define KEY_VALUE (Parameter_ExternalControl * 4) //(Poti3 * 8) |
if(DubWiseKeys[1]) beeptime = 10; |
if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickNick = (ExternStickNick * 7 + tmp_int) / 8; |
if(DubWiseKeys[1] & DUB_KEY_LEFT) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_RIGHT) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickRoll = (ExternStickRoll * 7 + tmp_int) / 8; |
if(DubWiseKeys[0] & 8) ExternStickGier = 50;else |
if(DubWiseKeys[0] & 4) ExternStickGier =-50;else ExternStickGier = 0; |
if(DubWiseKeys[0] & 2) ExternHoehenValue++; |
if(DubWiseKeys[0] & 16) ExternHoehenValue--; |
StickNick += (STICK_GAIN * ExternStickNick) / 8; |
StickRoll += (STICK_GAIN * ExternStickRoll) / 8; |
StickGier += STICK_GAIN * ExternStickGier; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) {Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = (float) 100 / (256.0 / STICK_GAIN); |
IntegralFaktor = (float) 120 / (44000 / STICK_GAIN); |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll) |
{ |
long tmp_long, tmp_long2; |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
/*DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
*/ |
//DebugOut.Analog[21] = MittelIntegralNick / 26; |
//MittelIntegralRoll = MittelIntegralRoll; |
//DebugOut.Analog[28] = ausgleichNick; |
/* |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} |
//DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[29] = (MaxStickNick + MaxStickRoll); |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
//DebugOut.Analog[25] = KompassSignalSchlecht; |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
// r = KompassRichtung; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[2] = Mittelwert_AccNick; |
DebugOut.Analog[3] = Mittelwert_AccRoll; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = (Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[10] = SenderOkay; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
// DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
// DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
DebugOut.Analog[20] = ServoValue; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
DebugOut.Analog[21] = MesswertNick; |
DebugOut.Analog[22] = MesswertRoll; |
// Maximalwerte abfangen |
#define MAX_SENSOR (4096*STICK_GAIN) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//OCR0B = 180 - (Poti1 + 120) / 4; |
//DruckOffsetSetting = OCR0B; |
GasMischanteil *= STICK_GAIN; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
} |
else |
HoehenReglerAktiv = 1; |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ |
h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
// h -= (HoeheD * Parameter_Luftdruck_D)/(8/STICK_GAIN); // D-Anteil |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/tags/V0.70d/fc.h |
---|
0,0 → 1,172 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1450L // Abhängigkeit wzischen GyroIntegral und Winkel |
#define GIER_GRAD_FAKTOR 1550L // Abhängigkeit wzischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
extern unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
#define STRUCT_PARAM_LAENGE 83 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
extern unsigned char Parameter_NaviGpsGain; |
extern unsigned char Parameter_NaviGpsP; |
extern unsigned char Parameter_NaviGpsI; |
extern unsigned char Parameter_NaviGpsD; |
extern unsigned char Parameter_NaviGpsACC; |
#endif //_FC_H |
/tags/V0.70d/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File></Project> |
/tags/V0.70d/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/tags/V0.70d/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/tags/V0.70d/led.c |
---|
0,0 → 1,49 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing > 230)) {if(EE_Parameter.J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing < 10)) {if(EE_Parameter.J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.J16Bitmask) J16_ON; else J16_OFF; |
} |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing > 230)) {if(EE_Parameter.J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing < 10)) {if(EE_Parameter.J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/tags/V0.70d/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/tags/V0.70d/main.c |
---|
0,0 → 1,289 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
LED_Init(); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
//unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
SPI_MasterInit(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
VersionInfo.Hardware = 1; // FlightCtrl |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 71 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
printf("\n\rACC nicht abgeglichen!"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
DubWiseKeys[0] = 0; |
DubWiseKeys[1] = 0; |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
/* if(SendVersionToNavi) |
{ |
SPI_StartTransmitPacket(SPI_CMD_VERSION);//# |
SendVersionToNavi = 0; |
} |
else SPI_StartTransmitPacket(SPI_CMD_VALUE);//# |
*/ |
SPI_StartTransmitPacket();//# |
SendSPI = 4; |
timer = SetDelay(20); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/tags/V0.70d/main.h |
---|
0,0 → 1,103 |
#ifndef _MAIN_H |
#define _MAIN_H |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if(PlatinenVersion == 10) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if(PlatinenVersion == 10) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if(PlatinenVersion < 12) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if(PlatinenVersion < 12) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#include "led.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/tags/V0.70d/makefile |
---|
0,0 → 1,431 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 70 |
VERSION_INDEX = 3 |
VERSION_KOMPATIBEL = 8 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
ifeq ($(VERSION_INDEX), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)g |
endif |
ifeq ($(VERSION_INDEX), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)h |
endif |
ifeq ($(VERSION_INDEX), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)i |
endif |
ifeq ($(VERSION_INDEX), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)j |
endif |
ifeq ($(VERSION_INDEX), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)k |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).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 |
/tags/V0.70d/menu.c |
---|
0,0 → 1,141 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 11,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); RemotePollDisplayLine = -1; } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); RemotePollDisplayLine = -1;} |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if(PlatinenVersion == 11) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/tags/V0.70d/menu.h |
---|
0,0 → 1,6 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/tags/V0.70d/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 |
/tags/V0.70d/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); |
} |
/tags/V0.70d/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/tags/V0.70d/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
// if((signal > (int) Parameter_UserParam2 * 10) && (signal < 8000)) |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
// tmp = (7 * (PPM_in[index]) + signal) / 8; |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/tags/V0.70d/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 |
/tags/V0.70d/spi.c |
---|
0,0 → 1,268 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_CAL_COMPASS}; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
SPI_RxDataValid = 0; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
static unsigned char i =0; |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / 108); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 108); |
ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc); |
ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc); |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = Parameter_NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = Parameter_NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = Parameter_NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = Parameter_NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = Parameter_NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = 15; // MaxRadius |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_CAL_COMPASS: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
break; |
} |
sei(); |
if (SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_CMD_OSD_DATA: |
// ToFlightCtrl.Param.Byte[0] = OsdBar; |
// ToFlightCtrl.Param.Int[1] = Distance; |
break; |
case SPI_CMD_GPS_POS: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.Longitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.Latitude; |
break; |
case SPI_CMD_GPS_TARGET: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.TargetLongitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.TargetLatitude; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/tags/V0.70d/spi.h |
---|
0,0 → 1,123 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_CAL_COMPASS 12 |
#define SPI_CMD_PARAMETER1 13 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_CMD_OSD_DATA 100 |
#define SPI_CMD_GPS_POS 101 |
#define SPI_CMD_GPS_TARGET 102 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned char BeepTime; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter; |
//#define SPI_CMD_VALUE 0x03 |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/tags/V0.70d/timer0.c |
---|
0,0 → 1,198 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0; |
volatile unsigned int ServoState = 40; |
unsigned int BeepMuster = 0xffff; |
unsigned int ServoValue = 0; |
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(SendSPI) SendSPI--; |
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 < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// 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 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
// TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); // clk/256 |
TCCR2B=(0<<CS20)|(0<<CS21)|(1<<CS22); // clk/64 |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OVERFLOW2) |
{ |
if (ServoState > 0) PORTD |= 0x80; |
else PORTD &= ~0x80; |
TCCR2A =3; |
TIMSK2 &= ~_BV(TOIE2); |
} |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char postPulse = 0x80; |
static int filterServo = 100; |
#define MULTIPLIER 4 |
if(ServoState == 4) |
{ |
ServoValue = 0x0030; // Offset Part1 |
filterServo = (filterServo * 3 + (int) Parameter_ServoNickControl * 2)/4; |
ServoValue += filterServo; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) ((long)EE_Parameter.ServoNickComp * IntegralNick) / 128L )/ (512L/MULTIPLIER); |
else ServoValue -= ((long) ((long)EE_Parameter.ServoNickComp * IntegralNick) / 128L) / (512L/MULTIPLIER); |
if((ServoValue) < ((int)EE_Parameter.ServoNickMin*3)) ServoValue = (int)EE_Parameter.ServoNickMin*3; |
else if((ServoValue) > ((int)EE_Parameter.ServoNickMax*3)) ServoValue = (int)EE_Parameter.ServoNickMax*3; |
DebugOut.Analog[20] = ServoValue; |
if ((ServoValue % 255) < 45) { ServoValue+= 77; postPulse = 0x60 - 77; } else postPulse = 0x60; |
OCR2A = 255-(ServoValue % 256); |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
} |
else if ((ServoState > 0) && (ServoState < 4)) |
{ |
if(ServoValue > 255) |
{ PORTD |= 0x80; |
TCCR2A =3; |
ServoValue -= 255; |
} |
else |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
OCR2A = postPulse; // Offset Part2 |
ServoState = 1; |
} |
} |
else if (ServoState == 0) |
{ |
ServoState = (int) EE_Parameter.ServoNickRefresh * MULTIPLIER; |
PORTD&=~0x80; |
TCCR2A = 3; |
} |
ServoState--; |
} |
/tags/V0.70d/timer0.h |
---|
0,0 → 1,17 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI; |
/tags/V0.70d/twimaster.c |
---|
0,0 → 1,204 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
case 8: // Gyro-Offset |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/tags/V0.70d/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/tags/V0.70d/uart.c |
---|
0,0 → 1,423 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char RemotePollDisplayLine = 0; |
unsigned char NurKanalAnforderung = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char DubWiseKeys[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
int Debug_Timer,Kompass_Timer; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Empfang ", //10 |
"Ersatzkompass ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
" ", |
"Distance ", |
"OsdBar ", |
"MK3Mag CalState ", |
"Servo ", //20 |
"Nick ", |
"Roll ", |
" ", |
" ", |
" ", //25 |
" ", |
" ", |
" ", |
" ", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
Decode64((unsigned char *) &tmp_int_arr1[0],sizeof(tmp_int_arr1),3,AnzahlEmpfangsBytes); |
KompassValue = tmp_int_arr1[0]; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
DebugTextAnforderung = tmp_char_arr2[0]; |
PcZugriff = 255; |
break; |
case 'b': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
DebugDataAnforderung = 1; |
PcZugriff = 255; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
PcZugriff = 255; |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
ConfirmFrame = DubWiseKeys[3]; |
PcZugriff = 255; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
while(!UebertragungAbgeschlossen); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
Kompass_Timer = SetDelay(220); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &ExternControl,sizeof(ExternControl)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / 108); // etwa in 0,1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / 108); // etwa in 0,1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w',MeineSlaveAdresse,(unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A',DebugTextAnforderung + '0',(unsigned char *) ANALOG_TEXT[DebugTextAnforderung],16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz ohne CRC bestätigen |
{ |
SendeBuffer[0] = '#'; |
SendeBuffer[1] = ConfirmFrame; |
SendeBuffer[2] = '\r'; |
UebertragungAbgeschlossen = 0; |
ConfirmFrame = 0; |
UDR = SendeBuffer[0]; |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++RemotePollDisplayLine == 4 || NurKanalAnforderung) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
RemotePollDisplayLine = -1; |
} |
else SendOutData('0' + RemotePollDisplayLine,0,(unsigned char *)&DisplayBuff[20 * RemotePollDisplayLine],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/tags/V0.70d/uart.h |
---|
0,0 → 1,117 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
#define DUB_KEY_UP 4 |
#define DUB_KEY_DOWN 8 |
#define DUB_KEY_RIGHT 32 |
#define DUB_KEY_LEFT 16 |
#define DUB_KEY_FIRE 64 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
extern unsigned char DubWiseKeys[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Hardware; |
unsigned char Rserved[6]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/tags/V0.70d/version.txt |
---|
0,0 → 1,158 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
/tags/V0.70d |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |