/branches/V0.69k-Bus-Dietmar/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/V0.69k-Bus-Dietmar/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; |
} |
/branches/V0.69k-Bus-Dietmar/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/V0.69k-Bus-Dietmar/Hex-Files/Flight-Ctrl_MEGA644_V0_69k.hex |
---|
0,0 → 1,2212 |
:100000000C9432020C944D020C944D020C944D024F |
:100010000C944D020C944D020C944D020C944D0224 |
:100020000C944D020C94940D0C944D020C944D02C2 |
:100030000C9425180C944D020C944D020C944D0216 |
:100040000C944D020C944D020C945D0C0C944D02DA |
:100050000C94FD040C944D020C94C7040C944D02B6 |
:100060000C94990E0C944D020C944F170C944D0265 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A000256320000A0D3D3D3D3D3D3D3D3D3D3D2F |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D000A0D496E69742E2045455069 |
:1000D000524F4D3A2047656E6572696572652044DE |
:1000E000656661756C742D506172616D65746572C1 |
:1000F0002E2E2E000A0D414343206E696368742042 |
:1001000061626765676C696368656E21000A0D420C |
:10011000656E75747A6520506172616D6574657283 |
:100120007361747A202564000A0D4162676C656909 |
:100130006368204C756674647275636B73656E7367 |
:100140006F722E2E004F4B0A0D000A0D5374657509 |
:100150006572756E673A200048656164696E67482C |
:100160006F6C64004E65757472616C000A0A0D0054 |
:100170002E005B25695D005B25695D002B204D69C4 |
:100180006B726F4B6F70746572202B0048573A5634 |
:1001900025642E25642053573A25642E2564256353 |
:1001A0000053657474696E673A20256420002863E3 |
:1001B0002920486F6C676572204275737300486F21 |
:1001C0006568653A202020202025356900536F6C32 |
:1001D0006C486F6568653A20253569004C75667412 |
:1001E000647275636B3A20253569004F666620207E |
:1001F000202020203A20253569004B65696E652056 |
:100200000048F668656E726567656C756E670061BB |
:100210006B742E204C616765004E69636B3A202039 |
:100220002020202025356900526F6C6C3A20202058 |
:10023000202020253569004B6F6D706173733A2063 |
:100240002020253569004B313A25346920204B3276 |
:100250003A25346920004B333A25346920204B3449 |
:100260003A25346920004B353A25346920204B3635 |
:100270003A25346920004B373A25346920204B3821 |
:100280003A25346920004E693A2534692020526F9E |
:100290003A253469200047733A253469202047699C |
:1002A0003A253469200050313A25346920205032F3 |
:1002B0003A253469200050333A25346920205034DF |
:1002C0003A25346920004779726F202D2053656EDE |
:1002D000736F72004E69636B2025346920282533C3 |
:1002E000692900526F6C6C202534692028253369F8 |
:1002F000290047696572202534692028253369293A |
:10030000004E69636B202534692028253369290054 |
:10031000526F6C6C202534692028253369290047E9 |
:1003200069657220253469202825336929004143F5 |
:1003300043202D2053656E736F72004E69636B20EE |
:1003400025346920282533692900526F6C6C2025DB |
:10035000346920282533692900486F6368202534D3 |
:1003600069202825336929005370616E6E756E67A8 |
:100370003A202025356900456D70662E5065676509 |
:100380006C3A253569004B6F6D70617373202020C6 |
:1003900020202020005269636874756E673A20201F |
:1003A000253569004D657373776572743A20202591 |
:1003B00035690053746172743A202020202025355D |
:1003C0006900506F7469313A202025336900506FFD |
:1003D0007469323A202025336900506F7469333ACA |
:1003E000202025336900506F7469343A202025336A |
:1003F0006900536572766F202000536574706F69D1 |
:100400006E742020253369005374656C6C756E67BB |
:100410003A202533690052616E67653A2533692DAC |
:100420002533690045787465726E436F6E74726F20 |
:100430006C2020004E693A2534692020526F3A25FD |
:100440003469200047733A253469202047693A25EA |
:100450003469200048693A253469202043663A25EA |
:100460003469200011241FBECFEFD0E1DEBFCDBF25 |
:1004700013E0A0E0B1E0E8E7F7E802C005900D92D4 |
:10048000AA3AB107D9F718E0AAEAB3E001C01D9271 |
:10049000AC33B107E1F70C94BB020C940000FB01F4 |
:1004A000863008F085E0489FD0011124AC59BF4F39 |
:1004B000842F9927019724F00E94A8430192FACF34 |
:1004C0000895282FFB01863008F025E0429FD001D7 |
:1004D0001124AC59BF4F842F9927019724F0019024 |
:1004E0000E94B043FACFA2E0B0E0022E0E94B043D7 |
:1004F0000895A2E0B0E09D010E94A843802D8630BF |
:1005000028F082E0D901082E0E94B043992708956F |
:1005100080916107E82FFF27EE0FFF1FEB5CF84F7C |
:10052000808191818D5E9F4F14F010920201808135 |
:1005300091818A5B9F4FBCF480910201882399F4DA |
:1005400081E080930201809132068F5F80933206B2 |
:10055000853038F088EE93E09093CA038093C90306 |
:1005600002C00E94C01A809132069927909300071A |
:100570008093FF060895CFEFD0E1DEBFCDBF14B862 |
:1005800015B897EEE92E93E0F92E8EEC9FEFE80E6A |
:10059000F91EF7FEFACF88EEE82E83E0F82E189BBE |
:1005A00002C08BE001C08AE08093010181E887B935 |
:1005B0008FEF88B98BE184B981E085B98EE38AB980 |
:1005C000579A87EF8BB984B7877F84BF809160008B |
:1005D0008861809360001092600080ED97E09093B6 |
:1005E000CA038093C9031092250410922404109228 |
:1005F0003A0710923907109227041092260410929D |
:10060000290410922804809101018A3011F428985D |
:1006100001C0289A0E94440D0E9456080E9410189A |
:100620000E944B0E0E9418170E94303F789410923F |
:10063000220685E48093230687E0809324068BE6D8 |
:1006400090E09F938F9385E490E09F938F931F9208 |
:100650001F92809101016AE00E943843892F9927F7 |
:100660009F938F93809101010E94384399279F9314 |
:100670008F9380E790E09F938F931F920E94D309FE |
:100680008DB79EB70D960FB6F8949EBF0FBE8DBF67 |
:1006900084EA90E09F938F931F920E94D309299A36 |
:1006A0000F900F900F9001E010E0D8010E94A84336 |
:1006B000802D863461F185EC90E09F938F931F929B |
:1006C0000E94D3090E940F19C0E00F900F900F9065 |
:1006D000C23039F0C33019F40E94301A04C0C4305B |
:1006E00010F00E949F1947E461E677E08C2F0E948A |
:1006F0006102CF5FC63060F3A2E0B0E083E0082E75 |
:100700000E94B04386E4D801082E0E94B043A4E0C2 |
:10071000B0E00E94A843802D853050F084EF90E037 |
:100720009F938F931F920E94D3090F900F900F9069 |
:100730000E94790247E461E677E00E944F020E943E |
:10074000790299279F938F938DE091E09F938F93E8 |
:100750001F920E94D309809169070F900F900F900C |
:100760000F900F9080FF20C088E291E09F938F93BD |
:100770001F920E94D30988EE93E00E943B0D7C01FA |
:100780000E94510E0F900F900F90C7010E946A0DAA |
:100790008823D9F385E491E09F938F931F920E9461 |
:1007A000D3090F900F900F900E943B1C8091010184 |
:1007B0008A3011F4289801C0289A80ED97E0909330 |
:1007C000CA038093C90385E5809334068AE491E0E7 |
:1007D0009F938F931F920E94D309809169070F9076 |
:1007E0000F900F9082FF03C088E591E002C084E67D |
:1007F00091E09F938F931F920E94D3090F900F90C7 |
:100800000F908CE691E09F938F931F920E94D309E3 |
:100810000E94A21188E893E190938B0380938A034E |
:1008200081E0809333060F900F900F908091CD035D |
:10083000882309F4A4C01092CD0380913206882346 |
:1008400019F00E94880202C00E94A9270E947A24FF |
:10085000209101012A3011F4289801C0289A809132 |
:100860000303882321F081508093030312C08093F7 |
:10087000AA038093AB0380933E0610920804109263 |
:1008800007041092060410920504109204041092BA |
:10089000030480912A04882329F080912A0481503E |
:1008A00080932A0480918A0390918B03892B01F510 |
:1008B00085E090E090938B0380938A030E94321727 |
:1008C00080910603909107038F5F9F4FF9F4809109 |
:1008D00021048823D9F080E197E29093CA038093A2 |
:1008E000C90380E890E090930703809306030EC04D |
:1008F00080918A0390918B03019790938B0380934F |
:100900008A032A3011F4289801C0289A8091CD03D7 |
:10091000882321F080912104882311F40E947C080F |
:100920000E94E706C7010E946A0D882341F1809169 |
:100930007907282F33278091100390911103821794 |
:1009400093079CF480910603909107038F5F9F4F5C |
:1009500061F480E797E19093CA038093C90380E034 |
:1009600093E090930703809306030E94D84084E0AD |
:100970008093C80384E190E00E943B0D7C0180914C |
:10098000C803882309F052CF0E9419414FCF1F920C |
:100990000F920FB60F9211248F939F93EF93FF93B3 |
:1009A000809105038823E1F48091BE039091BF03F9 |
:1009B00001969093BF038093BE03FC01EC50FB4F64 |
:1009C000E081ED3019F08639910539F41092BF03BA |
:1009D0001092BE0381E080930503E093C60004C03B |
:1009E0001092BF031092BE03FF91EF919F918F91E0 |
:1009F0000F900FBE0F901F9018951F920F920FB679 |
:100A00000F9211242F933F934F935F938F939F9354 |
:100A1000AF93BF93EF93FF9390E08091C6008093D4 |
:100A2000B9035091C403563910F09093C5038091D7 |
:100A3000B9038D3009F05FC08091C503823009F0A1 |
:100A40005AC09093C503852F99278F5B994FFC015E |
:100A5000329740812091C0033091C103241B31099A |
:100A6000DC0111978C91281B3109C9019F7090936B |
:100A7000C1038093C00346E0969587954A95E1F7B8 |
:100A8000982F935C9093C2032F733070235C209354 |
:100A9000C3038081981729F48C91281711F491E0F1 |
:100AA00006C090E08091B6038F5F8093B60380917B |
:100AB000B803882309F06EC0992309F46BC081E064 |
:100AC0008093B8035093B503E52FFF27EF5BF94FF1 |
:100AD0008DE0808380914306823509F05BC088E118 |
:100AE00090E02CE00FB6F894A895809360000FBEBC |
:100AF000209360004FC02091C503822F9927813039 |
:100B00009105F9F0823091051CF4892B21F040C049 |
:100B1000029711F13DC08091B903833239F480917D |
:100B2000B803882319F481E08093C5038091B90349 |
:100B30008093410681E08093C4038091B903992793 |
:100B400022C02F5F2093C503E52FFF27EF5BF94FEE |
:100B50008091B903808309C0E52FFF27EF5BF94F30 |
:100B60008091B9038083563920F45F5F5093C403AA |
:100B700002C01092C5032091B9038091C0039091E7 |
:100B8000C103820F911D9093C1038093C00302C0E3 |
:100B90001092C503FF91EF91BF91AF919F918F91FB |
:100BA0005F914F913F912F910F900FBE0F901F902B |
:100BB0001895AC01A0E0B0E09D01A817B90748F472 |
:100BC000E4EFF4E08191280F311D1196A417B507C9 |
:100BD000C8F33F70FD01EC50FB4FC90156E09695FC |
:100BE00087955A95E1F7835C80831196FD01EC505F |
:100BF000FB4F2F733070822F835C8083AB50BB4FD1 |
:100C00008DE08C93109205038091F4048093C600CC |
:100C100008951F93CF93DF93382FEA01722F10E0CE |
:100C200083E28093F4046093F5043093F604A3E028 |
:100C3000B0E0772309F458C0772311F4972F07C049 |
:100C4000FE01E10FF11D1F5F9081715011F4472FDC |
:100C50000EC0FE01E10FF11D1F5F4081715039F0A0 |
:100C6000FE01E10FF11D1F5F6081715001C0672F10 |
:100C7000FD01EC50FB4F892F86958695835C808320 |
:100C80001196FD01EC50FB4F892F992783709070CE |
:100C900024E0880F991F2A95E1F755279A0194E0DF |
:100CA000369527959A95E1F7822B835C8083119680 |
:100CB000FD01EC50FB4F4F705070440F551F440F17 |
:100CC000551F862F992726E0969587952A95E1F757 |
:100CD000842B835C80831196FD01EC50FB4F6F7376 |
:100CE000635C60831196A5CFCD010E94D905DF9189 |
:100CF000CF911F9108951F93CF93DF93EC0110E0E4 |
:100D0000662309F460C0A22FBB271297E42FFF27A8 |
:100D1000EF5BF94F30813D534F5FE42FFF27EF5BCF |
:100D2000F94F50815D534F5FE42FFF27EF5BF94F81 |
:100D300070817D534F5FE42FFF27EF5BF94FE08118 |
:100D4000ED534F5F842F9927A817B907E4F1832F3C |
:100D50009927880F991F880F991F352F32953F705B |
:100D6000382B852F99278F709070F4E0880F991F8A |
:100D7000FA95E1F7572F56955695582B872F9927B7 |
:100D80008370907076E0880F991F7A95E1F78E2B2B |
:100D900061506F3FC1F0FE01E10FF11D30831F5F15 |
:100DA00061506F3F81F0FE01E10FF11D50831F5F25 |
:100DB00061506F3F41F0FE01E10FF11D80831F5F25 |
:100DC000662309F0A3CFDF91CF911F910895CF93B0 |
:100DD000DF93CDB7DEB724970FB6F894DEBF0FBE12 |
:100DE000CDBF8091B803882309F445C180914306A3 |
:100DF00099278836910509F494C089369105C4F481 |
:100E00008236910509F462C08336910544F48B342F |
:100E1000910559F18136910509F44CC02AC18336F8 |
:100E2000910509F467C08736910509F4B2C021C164 |
:100E3000813791054CF48C3691050CF0D4C08B367B |
:100E4000910509F492C015C18437910509F484C055 |
:100E5000853791052CF48137910509F49EC009C1AD |
:100E60008637910509F491C004C12091B50343E090 |
:100E700062E0CE0101960E947B0689819A8190935F |
:100E80003D0480933C0480913C0490913D0420916A |
:100E90003A0430913B04821B930B845E9D4F68E6BD |
:100EA00071E00E945843845B904090933904809392 |
:100EB0003804DFC02091B50343E062E0CE01039621 |
:100EC0000E947B068B81809304035BC02091B50355 |
:100ED00043E06BE084E396E00E947B068091F1039F |
:100EE00090913606892B8093F10380913D06809383 |
:100EF0001907BFC02091B50343E06BE084E396E09F |
:100F00000E947B068091F10390913606892B809395 |
:100F1000F10380913D068093190781E08093BB0324 |
:100F200030C02091B50343E062E0CE0103960E94F9 |
:100F30007B068091F1039B81892B8093F1038C8147 |
:100F40008F3F21F481E08093B20302C01092B2037C |
:100F500081E08093BC038DC02091B50343E064E041 |
:100F60008EEA93E00E947B060CC02091B50343E01B |
:100F700064E08AEA93E00E947B068091AD0380934F |
:100F800019078FEF8093030374C081E08093BA0345 |
:100F900070C081E08093BD036CC02091B50343E035 |
:100FA00062E0CE0103960E947B06809105038823B0 |
:100FB000E1F38B818F3F61F0863010F085E08B8309 |
:100FC00047E461E677E08B810E944F028B8102C08B |
:100FD0000E94790227E441E657E06091F304855BC3 |
:100FE0000E94090646C02091B50343E067E481E60C |
:100FF00097E00E947B068091430647E461E677E034 |
:101000008B560E946102A2E0B0E0809143068B56AD |
:10101000082E0E94B04380918C079927AA27BB27EE |
:10102000BC01CD0124EC39E040E050E00E941943BE |
:10103000DC01CB018093840390938503A093860306 |
:10104000B093870380918D079927AA27BB27BC01FE |
:10105000CD010E941943DC01CB0180938003909362 |
:101060008103A0938203B09383030E9479020E94BC |
:10107000C01A1092B80324960FB6F894DEBF0FBEC4 |
:10108000CDBFDF91CF910895CF93C82F8A3019F447 |
:101090008DE00E9444088091C00085FFFCCFC09382 |
:1010A000C60080E090E0CF910895089588E1809394 |
:1010B000C1008091C00082608093C0008091C10017 |
:1010C00080688093C1008091C10080648093C100DA |
:1010D0008AE28093C40088EC90E00E943B0D9093DC |
:1010E0002106809320068CED90E00E943B0D9093AA |
:1010F000400680933F06089580910503882309F4F4 |
:10110000F7C08091BD03882371F080910503882387 |
:1011100051F02BE044E356E06091F30487E40E9431 |
:1011200009061092BD0380913F06909140060E94EF |
:101130006A0D882309F44CC080910503882309F4C3 |
:1011400047C08091760490917704A0917804B09183 |
:101150007904BC01CD012CE630E040E050E00E9473 |
:101160008D4330932D0620932C0680916E04909130 |
:101170006F04A0917004B0917104BC01CD012CE604 |
:1011800030E040E050E00E948D4330932F062093E2 |
:101190002E06809112048093300680911104809372 |
:1011A000310628E04CE256E06091F30487E70E94A4 |
:1011B000090680913206853018F086E08093320669 |
:1011C00083E690E00E943B0D9093400680933F069B |
:1011D00080912006909121060E946A0D882321F4B7 |
:1011E0008091BB038823B1F080910503882391F09F |
:1011F00022E447ED56E06091F30484E40E9409067E |
:101200001092BB038AEF90E00E943B0D9093210661 |
:1012100080932006609104036F3F91F0862F9927F9 |
:1012200034E0880F991F3A95E1F78D5F9E4F605D1E |
:1012300020E1AC0181E40E9409068FEF8093040352 |
:10124000909119079923A1F080910503882381F0DB |
:1012500083E28093F4049093F5048DE08093F60488 |
:1012600010920503109219078091F4048093C60030 |
:101270008091BC03882351F180910503882331F1CB |
:101280000E94AB111092BC033091B303832F8F5F88 |
:101290008093B303843021F06091B203662359F048 |
:1012A00026E145E357E060E084E30E9409068FEF02 |
:1012B0008093B3030BC024E1829FC00111248E5E92 |
:1012C0009C4FAC01832F8F5C0E9409068091BA036A |
:1012D000882371F080910503882351F02AE042E2CF |
:1012E00056E06091F30486E50E9409061092BA0365 |
:1012F0000895982F80911A07813069F48091F20344 |
:10130000E82FFF27EE5EFC4F90838F5F8093F20300 |
:1013100021E030E005C0892F0E944408282F3327A0 |
:10132000C90108950F931F93CF93DF938C01EB01B5 |
:10133000672B39F0F80181918F010E94790921977B |
:10134000C9F7DF91CF911F910F9108950F931F93CC |
:10135000CF93DF938C01EB01672B41F0F8010F5F16 |
:101360001F4F84910E9479092197C1F7DF91CF9196 |
:101370001F910F910895CF93C82F181634F480E26F |
:101380000E947909C1501C16D4F3CF910895CF93D0 |
:10139000C82F181634F480E30E947909C1501C1636 |
:1013A000D4F3CF9108952F923F924F925F926F9214 |
:1013B0007F928F929F92AF92BF92CF92DF92EF92E5 |
:1013C000FF920F931F93CF93DF93CDB7DEB7E097D4 |
:1013D0000FB6F894DEBF0FBECDBF26968FAD269711 |
:1013E0002896EEADFFAD28971CA61DA61EA61FA62B |
:1013F00080931A07A8E46A2E712C6C0E7D1E5F0183 |
:10140000C50105C0053239F00894A11CB11CF501D5 |
:1014100004910023B9F7B501681B790B11F00E9404 |
:10142000A609002309F430C20894A11CB11C55245C |
:1014300058AA252C1FEF59A6F5010894A11CB11C30 |
:101440000491053721F0802F80628837F1F450FE37 |
:101450000EC0F30124E030E0620E731E80819181A2 |
:10146000A281B3818CA79DA7AEA7BFA70EC0F30131 |
:10147000A2E0B0E06A0E7B1E808191819C0144272E |
:1014800055272CA73DA74EA75FA7003221F489A5B9 |
:10149000882391F61BC0033211F438E081C00A3270 |
:1014A00011F00D3289F40A3251F4F30142E050E0B8 |
:1014B000640E751E208022200CF0BECF219450E1D6 |
:1014C000552A8FED5822B8CF0B3211F409A7B4CFAB |
:1014D0000E32C1F5F5010894A11CB11C04910A3229 |
:1014E00079F4F301A2E0B0E06A0E7B1E60817181A5 |
:1014F000BFEF6F3F7B0714F46FEF7FEF162F9CCF8A |
:1015000060E070E0802F80538A30A0F4CB01F3E0DC |
:10151000880F991FFA95E1F7860F971F680F791FBB |
:10152000600F711D60537040F5010894A11CB11C3F |
:101530000491E8CFEFEF6F3F7E0714F46FEF7FEF7A |
:10154000162F7FCF003329F454FC76CFF0E25F2AC8 |
:1015500073CF802F81538930D8F460E070E0CB01E5 |
:10156000E3E0880F991FEA95E1F7860F971F680F50 |
:10157000791F600F711D60537040F5010894A11C24 |
:10158000B11C0491802F80538A3048F3262E59CF06 |
:10159000083619F424E0522A4FCF0C3619F431E002 |
:1015A000532A4ACF033661F44E010894811C911CE2 |
:1015B000F30142E050E0640E751E808189831BC1F7 |
:1015C000043421F0043611F00936B1F5043411F475 |
:1015D00051E0552A50FE0AC0F30184E090E0680E05 |
:1015E000791E20813181428153810CC0F30142E098 |
:1015F00050E0640E751E808191819C01442737FD67 |
:101600004095542F2CA73DA74EA75FA78CA59DA55D |
:10161000AEA5BFA5B7FF0DC0B095A09590958195DB |
:101620009F4FAF4FBF4F8CA79DA7AEA7BFA78DE21F |
:1016300089A77AE0472E7BC00F3411F00F3639F4BA |
:101640000F3411F491E0592A68E0462E6FC000373C |
:10165000A1F4F301A2E0B0E06A0E7B1E80819181CB |
:101660009C01442755272CA73DA74EA75FA750E113 |
:10167000452E30E4532A08E759C00337C1F5F3017A |
:1016800042E050E0640E751E8080918081149104C8 |
:1016900089F44E010894811C911C88E289838EE6AE |
:1016A000F401818385E78B838CE68C838D8389E2CB |
:1016B0008E831F8217FD13C0812F992787FD909578 |
:1016C000AC0160E070E0C4010E94A441009729F0E1 |
:1016D000D82ED8181D150CF090C0D12E8EC0F40154 |
:1016E00001900020E9F73197DE2ED81886C0053525 |
:1016F00011F0053739F4053511F4F1E05F2A4AE0BD |
:10170000442E14C0083519F0083709F06CC030E1D8 |
:10171000432E53FE0BC02CA53DA54EA55FA521155C |
:1017200031054105510511F030E4532A19A618ABD3 |
:1017300017FD02C04FED542229E2822E912C8C0E0F |
:101740009D1E8CA59DA5AEA5BFA50097A105B105C1 |
:1017500021F498A9992309F43FC0C42CDD24EE2478 |
:10176000FF2433242CA53DA54EA55FA52C153D05D2 |
:101770004E055F0510F091E0392E6CA57DA58EA574 |
:101780009FA5A70196010E946B43DC01CB01182F96 |
:101790008A3010F4105D04C0195A083509F41F7D11 |
:1017A000D4011E934D016CA57DA58EA59FA5A70113 |
:1017B00096010E946B432CA73DA74EA75FA733203D |
:1017C00081F6B8E04B1641F453FE06C0103321F009 |
:1017D00080E3F40182934F01CE010196D82ED818F0 |
:1017E000F8E2DF0E0BC0002309F44EC04E0108944E |
:1017F000811C911C098381E0D82E19A61D2DC8A833 |
:10180000CD18C7FCCC2489A5882311F01F5F02C026 |
:1018100056FC1E5F1C0DE52CFF24C70180739070E1 |
:10182000892B21F4822D811B0E94BB0989A5882365 |
:1018300029F061E070E0CE01899609C0E6FE09C09A |
:1018400080E38AA70BA762E070E0CE018A960E942F |
:101850009209C70180739070809721F4822D811BBB |
:101860000E94C7098C2D0E94C7098D2D992787FDDD |
:101870009095BC01C4010E949209E4FEC1CD822D65 |
:10188000811B0E94BB09BCCDE0960FB6F894DEBF69 |
:101890000FBECDBFDF91CF911F910F91FF90EF90C1 |
:1018A000DF90CF90BF90AF909F908F907F906F9080 |
:1018B0005F904F903F902F9008951F920F920FB618 |
:1018C0000F9211242F933F935F936F937F938F9386 |
:1018D0009F93AF93BF93EF93FF938091C8038823A7 |
:1018E00029F08091C80381508093C8038091D00370 |
:1018F00081508093D0038F3FB9F489E08093D00367 |
:10190000809108038F5F817080930803882319F406 |
:1019100081E08093CD038091CE039091CF03019617 |
:101920009093CF038093CE038091C9039091CA0313 |
:101930000297C8F08091C9039091CA0301979093D0 |
:10194000CA038093C9038091C9039091CA0320916F |
:1019500006033091070382239323892B11F021E0A2 |
:1019600009C020E007C020E08FEF9FEF90930703AE |
:101970008093060380910101222331F08A3011F413 |
:101980005A9A07C0479A05C08A3011F45A9801C084 |
:1019900047988091690783FF5EC086B19927FC0153 |
:1019A000E071F07084FF0AC08091CB039091CC036A |
:1019B00001969093CC038093CB034DC08091CB03D1 |
:1019C0009091CC03892B69F18091CB039091CC034A |
:1019D0008A56914030F58091CB039091CC0369E217 |
:1019E00070E00E9444438091CB039091CC03860F1A |
:1019F000971F9093CC038093CB038091CB0390915E |
:101A0000CC030B9750F08091CB039091CC030A97B5 |
:101A100090933D0480933C0404C0F0933D04E09314 |
:101A20003C0480913C0490913D0420913A04309113 |
:101A30003B04821B930B845E9D4F68E671E00E941D |
:101A40005843845B904090933904809338041092FB |
:101A5000CC031092CB03FF91EF91BF91AF919F9177 |
:101A60008F917F916F915F913F912F910F900FBE5A |
:101A70000F901F9018952091CE033091CF03280F1F |
:101A8000391FC901019608958AE090E00E943B0D3C |
:101A90009093D2038093D10382E085BD83EA84BD15 |
:101AA00017BC88E788BD96E096BD83EC8093B000B4 |
:101AB0009093B1008091700082608093700080915B |
:101AC0006E00816080936E008AE08093B300109274 |
:101AD000B20008952091CE033091CF03821B930B67 |
:101AE000892F99278695807490700895CF93DF93FE |
:101AF0000E943B0DEC01CE010E946A0D8823D9F3B0 |
:101B0000DF91CF910895CF93DF930E943B0DEC01BD |
:101B100003C08FEE80937A00CE010E946A0D882365 |
:101B2000C1F3DF91CF9108951F920F920FB60F92DC |
:101B300011240F931F932F933F934F935F936F93B2 |
:101B40007F938F939F93AF93BF93CF93DF93EF9345 |
:101B5000FF93809109038150809309038F3F09F01F |
:101B600081C083E88093B00080917203082F112711 |
:101B70001093C7030093C603809196076091830773 |
:101B8000A0917604B0917704C0917804D091790443 |
:101B900080FF24C07727882799279D01AE01D7FFB2 |
:101BA00004C021583F4F4F4F5F4FA7E055954795D1 |
:101BB00037952795AA95D1F70E94194397FF04C03E |
:101BC00061507E4F8F4F9F4FF9E0959587957795A0 |
:101BD0006795FA95D1F7060F171F23C07727882737 |
:101BE00099279D01AE01D7FF04C021583F4F4F4FA9 |
:101BF0005F4FE7E05595479537952795EA95D1F7DB |
:101C00000E94194397FF04C061507E4F8F4F9F4F32 |
:101C100039E095958795779567953A95D1F7061BA5 |
:101C2000170B1093C7030093C6038091840799276D |
:101C30002091C6033091C7032817390734F08091EB |
:101C4000850799278217930724F49093C7038093FD |
:101C5000C6038091C6038093B3008091860780936A |
:101C6000090304C083E08093B0005F98FF91EF9177 |
:101C7000DF91CF91BF91AF919F918F917F916F91A4 |
:101C80005F914F913F912F911F910F910F900FBE38 |
:101C90000F901F90189510927C008FEE80937A0021 |
:101CA00008950F931F93CF93DF9303E010E0D801C3 |
:101CB0000E94A843802DC82FDD27C531D10508F02B |
:101CC0002A97C7BD84E690E00E94830D80910A03A5 |
:101CD00090910B038255934010F4C0E0D0E0CA3FCE |
:101CE000D105C0F4C7BD82E390E00E94830D80E778 |
:101CF00091E09F938F931F920E94D30980910A03D2 |
:101D000090910B030F900F900F908458934010F018 |
:101D10002196E5CFD8010C2E0E94B043C09328072E |
:101D20008CE291E00E94830DDF91CF911F910F9182 |
:101D300008951F920F920FB60F921124EF92FF9207 |
:101D40000F931F932F933F934F935F936F937F93C3 |
:101D50008F939F93AF93BF93CF93DF93EF93FF93B3 |
:101D600010927A008091EA03682F77278F5F809323 |
:101D7000EA036530710509F48EC066307105BCF464 |
:101D80006230710509F44AC0633071053CF4611595 |
:101D9000710531F161307105C1F1AEC26330710579 |
:101DA00009F446C06430710509F45DC0A5C268300D |
:101DB000710509F4C3C0693071054CF466307105D2 |
:101DC00009F482C06730710509F49BC095C269307F |
:101DD000710509F4D0C06A30710509F4EBC18CC2F9 |
:101DE00080917800909179009093EC038093EB03BD |
:101DF00081E08093E9038091D3039091D40301960D |
:101E00009093D4038093D3037BC280917800909108 |
:101E100079009093EE038093ED038EC0809178005B |
:101E2000909179009093F0038093EF0384E0BFC119 |
:101E300080911003909111039C01220F331F280FF2 |
:101E4000391F80917800909179000E944443260FB9 |
:101E5000371F369527953695279530931103209394 |
:101E6000100386E0A4C180918204909183042091A4 |
:101E7000780030917900821B930B90931C0780931C |
:101E80001B0780911B0790911C079093E20380939E |
:101E9000E10387E08CC180917800909179002091D6 |
:101EA000840430918504821B930B909327078093C1 |
:101EB000260780912607909127079093E00380934F |
:101EC000DF031092E9031CC2809101012091EB0312 |
:101ED0003091EC038A3049F4809178009091790038 |
:101EE000820F931F9695879506C0809178009091F8 |
:101EF0007900820F931F9093E4038093E30381E0C2 |
:101F000056C1809101012091ED033091EE038A309A |
:101F100049F48091780090917900820F931F9695F3 |
:101F2000879506C08091780090917900820F931F69 |
:101F30009093E6038093E50382E039C1809101012B |
:101F40002091EF033091F0038A3049F480917800BA |
:101F500090917900820F931F9695879506C0809186 |
:101F6000780090917900820F931F9093E8038093FB |
:101F7000E70385E01CC18091780090917900AA2741 |
:101F800097FDA095BA2FBC01CD010E9457427B015D |
:101F90008C0180917C0490917D04A0917E04B0918D |
:101FA0007F049C01AD01C801B7010E94B141DC0171 |
:101FB000CB01BC01CD010E943A42DC01CB019093E0 |
:101FC000DE038093DD038091DD039091DE030297B1 |
:101FD0000CF446C080917C0490917D04A0917E0415 |
:101FE000B0917F0420E030E84BE354E4BC01CD0124 |
:101FF0000E94614288230CF088C080917C049091FB |
:102000007D04A0917E04B0917F042AE037ED43EA7D |
:102010005CE3BC01CD010E94B241DC01CB018093A5 |
:102020007C0490937D04A0937E04B0937F04809100 |
:10203000FD039091FE03845F914008F066C080919B |
:102040007C0490917D04A0917E04B0917F042DECDE |
:102050003CEC4CEC5DE3BC01CD010E94B2414BC0B5 |
:102060008091DD039091DE038F5F9F4F0CF04DC098 |
:1020700080917C0490917D04A0917E04B0917F04B6 |
:1020800020E030E849E054E4BC01CD010E94644204 |
:102090001816DCF580917C0490917D04A0917E045B |
:1020A000B0917F042AE037ED43EA5CE3BC01CD0147 |
:1020B0000E94B141DC01CB0180937C0490937D04AC |
:1020C000A0937E04B0937F048091FD039091FE0362 |
:1020D000845F9140D0F480917C0490917D04A09124 |
:1020E0007E04B0917F042DEC3CEC4CEC5DE3BC0134 |
:1020F000CD010E94B141DC01CB0180937C0490931F |
:102100007D04A0937E04B0937F0481E08093D70385 |
:10211000809178009091790090931E0780931D071D |
:102120008091DD039091DE039C01442737FD4095AB |
:10213000542F80913E0490913F04A0914004B091AF |
:102140004104820F931FA41FB51F80933E049093F8 |
:102150003F04A0934004B093410420913E04309189 |
:102160003F04409140045091410457FF04C0215066 |
:102170003C4F4F4F5F4FAAE05595479537952795B0 |
:10218000AA95D1F780913E0490913F04A09140041C |
:10219000B0914104821B930BA40BB50B80933E04BA |
:1021A00090933F04A0934004B093410483E0809354 |
:1021B000E903A6C080912B0790912C07209178000D |
:1021C00030917900820F931F90932C0780932B07F7 |
:1021D000809123078F5F80932307809123078530A9 |
:1021E00008F48AC0809178009091790090930B0355 |
:1021F00080930A03109223078091D5039091D60310 |
:10220000BC01F3E0660F771FFA95E1F7681B790BC5 |
:1022100080917B03482F552780911F0790912007BD |
:1022200020912B0730912C07821B930B20911F04C8 |
:1022300030912004821B930B489F9001499F300DE1 |
:10224000589F300D1124620F731F77FF02C0695F22 |
:102250007F4FE3E075956795EA95E1F77093D603B4 |
:102260006093D50380912B0790912C07EC01EE270A |
:10227000D7FDE095FE2F20910C0330910D03409186 |
:102280000E0350910F03DA01C901880F991FAA1F8D |
:10229000BB1F820F931FA41FB51FC80FD91FEA1FB2 |
:1022A000FB1FF7FF03C02396E11DF11D82E0F595AA |
:1022B000E795D795C7958A95D1F7C0930C03D0932E |
:1022C0000D03E0930E03F0930F0380910C039091A4 |
:1022D0000D03A0910E03B0910F039C0180911F0785 |
:1022E00090912007821B930B9093200480931F04EE |
:1022F00010922C0710922B071092E9031092EA0318 |
:102300008091E90380937C008091EA03882319F08F |
:102310008FEE80937A00FF91EF91DF91CF91BF9183 |
:10232000AF919F918F917F916F915F914F913F916D |
:102330002F911F910F91FF90EF900F900FBE0F9074 |
:102340001F90189590E2E2E1F3E08FE491938150C1 |
:1023500087FFFCCF08951F93CF93DF938091F10304 |
:1023600080FF0FC08091F503882311F0815002C0D7 |
:1023700080916C038093F5030E94A2118FEF8093EC |
:10238000B3038091F10381FF0AC08091F5038F5F51 |
:102390008093F5030E94A2118FEF8093B303809185 |
:1023A000F103992780FF04C081FF02C01092F5035A |
:1023B0008091F503282F33278A3040F481E1809300 |
:1023C000F2033F932F9382E791E007C080E180936F |
:1023D000F2033F932F9387E791E09F938F9381E0E0 |
:1023E0008F930E94D3090F900F900F900F900F9032 |
:1023F0008091F503C82FDD27C530D10509F46AC2E5 |
:10240000C630D105ACF4C230D10509F4E9C0C330FF |
:10241000D10534F4209739F1219709F477C0FDC430 |
:10242000C330D10509F44EC1249709F4B7C1F5C4EE |
:10243000C830D10509F4A9C3C930D10544F4C63068 |
:10244000D10509F41CC3279709F47EC3E6C4CA303A |
:10245000D10509F432C4CA30D1050CF4D9C32B9785 |
:1024600009F471C4DAC41092F2038CE791E09F93EF |
:102470008F9311E01F930E94D30984E18093F203AC |
:102480000F900F900F908BE690E09F938F9385E4D1 |
:1024900090E09F938F93DF93CF93809101016AE047 |
:1024A0000E943843892F99279F938F938091010130 |
:1024B0000E94384399279F938F938CE891E09F93D4 |
:1024C0008F931F930E94D30988E28093F2038DB704 |
:1024D0009EB70D960FB6F8949EBF0FBE8DBF0E949B |
:1024E000790299279F938F9381EA91E09F938F932D |
:1024F0001F930E94D3098CE38093F2030F900F90F7 |
:102500000F900F900F908EEA91E061C08091690763 |
:1025100080FF4AC01092F20380911F049091200422 |
:102520009F938F938EEB91E09F938F9311E01F9376 |
:102530000E94D30984E18093F2030F900F900F90D3 |
:102540000F900F9080911D0490911E049F938F9384 |
:102550008DEC91E09F938F931F930E94D30988E2A3 |
:102560008093F2030F900F900F900F900F90809137 |
:102570000A0390910B039F938F938CED91E09F93AF |
:102580008F931F930E94D3098CE38093F2030F90E3 |
:102590000F900F900F900F908091280799279F938D |
:1025A0008F938BEE91E07EC384E18093F2038AEFF8 |
:1025B00091E09F938F9311E01F930E94D30988E2CB |
:1025C0008093F2030F900F900F9081E092E09F9321 |
:1025D0008F931F930E94D3090F900F900F9022C4E6 |
:1025E0001092F2038FE092E09F938F93C1E0CF931C |
:1025F0000E94D30984E18093F2030F900F900F9013 |
:102600008091760490917704A0917804B091790438 |
:10261000B7FF04C081509C4FAF4FBF4F6AE0B595E4 |
:10262000A795979587956A95D1F7BF93AF939F9399 |
:102630008F9389E192E09F938F93CF930E94D30968 |
:1026400088E28093F2038DB79EB707960FB6F89491 |
:102650009EBF0FBE8DBF80916E0490916F04A091BC |
:102660007004B0917104B7FF04C081509C4FAF4F0C |
:10267000BF4F5AE0B595A795979587955A95D1F78D |
:10268000BF93AF939F938F9388E292E09F938F9332 |
:10269000CF930E94D3098CE38093F2038DB79EB74A |
:1026A00007960FB6F8949EBF0FBE8DBF80913C0475 |
:1026B00090913D049F938F9387E392E09F938F9334 |
:1026C000CF93F3C21092F2038091390790913A07A9 |
:1026D0009F938F9380913707909138079F938F93A3 |
:1026E00086E492E09F938F9311E01F930E94D30999 |
:1026F00084E18093F2038DB79EB707960FB6F894E6 |
:102700009EBF0FBE8DBF80913D0790913E079F9366 |
:102710008F9380913B0790913C079F938F9386E521 |
:1027200092E09F938F931F930E94D30988E2809336 |
:10273000F2038DB79EB707960FB6F8949EBF0FBEF3 |
:102740008DBF80914107909142079F938F93809115 |
:102750003F07909140079F938F9386E692E09F9367 |
:102760008F931F930E94D3098CE38093F2038DB75C |
:102770009EB707960FB6F8949EBF0FBE8DBF80918F |
:102780004507909146079F938F93809143079091BF |
:1027900044079F938F9386E792E031C31092F20330 |
:1027A00080916207E82FFF27EE0FFF1FEB5CF84FC9 |
:1027B000808191819F938F9380916107E82FFF27FC |
:1027C000EE0FFF1FEB5CF84F808191819F938F93F9 |
:1027D00086E892E09F938F9311E01F930E94D309A4 |
:1027E00084E18093F2038DB79EB707960FB6F894F5 |
:1027F0009EBF0FBE8DBF80916407E82FFF27EE0FAD |
:10280000FF1FEB5CF84F808191819F938F938091A4 |
:102810006307E82FFF27EE0FFF1FEB5CF84F808167 |
:1028200091819F938F9386E992E09F938F931F935B |
:102830000E94D30988E28093F2038DB79EB7079672 |
:102840000FB6F8949EBF0FBE8DBF80916607E82F2C |
:10285000FF27EE0FFF1FEB5CF84F808191819F9364 |
:102860008F9380916507E82FFF27EE0FFF1FEB5C2A |
:10287000F84F808191819F938F9386EA92E09F9396 |
:102880008F931F930E94D3098CE38093F2038DB73B |
:102890009EB707960FB6F8949EBF0FBE8DBF80916E |
:1028A0006807E82FFF27EE0FFF1FEB5CF84F8081D2 |
:1028B00091819F938F9380916707E82FFF27EE0FF9 |
:1028C000FF1FEB5CF84F808191819F938F9386EB84 |
:1028D00092E095C21092F20386EC92E09F938F9360 |
:1028E000C1E0CF930E94D309809101010F900F9016 |
:1028F0000F908A3009F05AC084E18093F2038091EE |
:102900008E0490918F049F938F938091E703909111 |
:10291000E80320918E0430918F04821B930B9F93C8 |
:102920008F9384ED92E09F938F93CF930E94D3096E |
:1029300088E28093F2038DB79EB707960FB6F8949E |
:102940009EBF0FBE8DBF80918C0490918D049F938C |
:102950008F938091E5039091E60320918C04309150 |
:102960008D04821B930B9F938F9383EE92E09F9332 |
:102970008F93CF930E94D3098CE38093F2038DB79A |
:102980009EB707960FB6F8949EBF0FBE8DBF80917D |
:102990008A0490918B049F938F938091D407909198 |
:1029A000D5079F938F9382EF92E065C084E1809377 |
:1029B000F20380918E0490918F0497FD0196959576 |
:1029C00087959F938F938091E7039091E8032091DF |
:1029D0008E0430918F04821B930B9F938F9381E021 |
:1029E00093E09F938F93CF930E94D30988E28093C3 |
:1029F000F2038DB79EB707960FB6F8949EBF0FBE31 |
:102A00008DBF80918C0490918D0497FD01969595D2 |
:102A100087959F938F938091E5039091E603209192 |
:102A20008C0430918D04821B930B9F938F9380E1D4 |
:102A300093E09F938F93CF930E94D3098CE380936D |
:102A4000F2038DB79EB707960FB6F8949EBF0FBEE0 |
:102A50008DBF80918A0490918B0497FD0196959586 |
:102A600087959F938F938091D4079091D5079F93DB |
:102A70008F938FE193E09F938F93CF93C3C1109275 |
:102A8000F2038EE293E09F938F9311E01F930E94D5 |
:102A9000D30984E18093F2030F900F900F908091FF |
:102AA0008404909185049F938F938091DF0390918C |
:102AB000E0039F938F938BE393E09F938F931F93F8 |
:102AC0000E94D30988E28093F2038DB79EB70796E0 |
:102AD0000FB6F8949EBF0FBE8DBF80918204909177 |
:102AE00083049F938F938091E1039091E2039F93DE |
:102AF0008F938AE493E09F938F931F930E94D3094F |
:102B00008CE38093F2038DB79EB707960FB6F894C7 |
:102B10009EBF0FBE8DBF80917C0490917D04A091DB |
:102B20007E04B0917F04BC01CD010E943A42DC01D9 |
:102B3000CB019F938F938091BA079091BB079F938E |
:102B40008F9389E593E05BC184E18093F2038091E8 |
:102B50001003909111039F938F9388E693E09F93C6 |
:102B60008F9311E01F930E94D30988E28093F203B0 |
:102B70000F900F900F900F900F9080912A0499273B |
:102B80009F938F9387E793E08DC01092F20386E8BE |
:102B900093E09F938F9311E01F930E94D30984E1E8 |
:102BA0008093F2030F900F900F90809138049091D2 |
:102BB00039049F938F9385E993E09F938F931F939D |
:102BC0000E94D30988E28093F2030F900F900F9038 |
:102BD0000F900F9080913C0490913D049F938F93B0 |
:102BE00084EA93E09F938F931F930E94D3098CE311 |
:102BF0008093F2030F900F900F900F900F908091A1 |
:102C00003A0490913B049F938F9383EB93E04AC0E7 |
:102C10001092F20380913104909132049F938F932C |
:102C200082EC93E09F938F9311E01F930E94D3094E |
:102C300084E18093F2030F900F900F900F900F900C |
:102C400080912F04909130049F938F938EEC93E0AA |
:102C50009F938F931F930E94D30988E28093F2037E |
:102C60000F900F900F900F900F9080912D049091E6 |
:102C70002E049F938F938AED93E09F938F931F93DE |
:102C80000E94D3098CE38093F2030F900F900F9072 |
:102C90000F900F9080912B0490912C049F938F9311 |
:102CA00086EE93E09F938F931F930E94D3090F901A |
:102CB0000F900F900F900F90B5C01092F20382EF1B |
:102CC00093E09F938F9311E01F930E94D30984E1B7 |
:102CD0008093F2030F900F900F90809172039927C9 |
:102CE0009F938F938AEF93E09F938F931F930E94FC |
:102CF000D30988E28093F2030F900F900F900F900A |
:102D00000F908091C6039091C7039F938F9388E0A3 |
:102D100094E09F938F931F930E94D3098CE3809339 |
:102D2000F2030F900F900F900F900F9080918507F6 |
:102D300099279F938F938091840799279F938F93CF |
:102D400086E194E05CC01092F20384E294E09F93E9 |
:102D50008F9311E01F930E94D30984E18093F203C3 |
:102D60000F900F900F9080913806992787FD9095CE |
:102D70009F938F9380913706992787FD90959F9316 |
:102D80008F9384E394E09F938F931F930E94D309C2 |
:102D900088E28093F2038DB79EB707960FB6F8943A |
:102DA0009EBF0FBE8DBF80913906992787FD9095F4 |
:102DB0009F938F9380913A0699279F938F9384E4F2 |
:102DC00094E09F938F931F930E94D3098CE3809389 |
:102DD000F2038DB79EB707960FB6F8949EBF0FBE4D |
:102DE0008DBF80913E0699279F938F9380913B06DC |
:102DF000992787FD90959F938F9384E594E09F9307 |
:102E00008F931F930E94D3098DB79EB707960FB675 |
:102E1000F8949EBF0FBE8DBF05C0815080936C0398 |
:102E20001092F5031092F103DF91CF911F91089555 |
:102E30001092B9008AE28093B800089585EA8093E1 |
:102E4000BC0080E090E0089584E98093BC00089580 |
:102E50001092B9008093BB0085E88093BC0080E0AD |
:102E600090E008950E9424171092F8038091BB000F |
:102E70001092F70380E88093BC001092BD0010927E |
:102E8000BA001092BB001092B9001092B8000E94D4 |
:102E900018170E941E1780E00E94281708951F929D |
:102EA0000F920FB60F9211242F933F934F935F937E |
:102EB0006F937F938F939F93AF93BF93EF93FF9302 |
:102EC0008091F803282F33278F5F8093F8032330F6 |
:102ED000310509F446C0243031054CF42130310568 |
:102EE000D1F0223031057CF5232B81F083C02530D1 |
:102EF0003105E1F1253031050CF441C026303105B2 |
:102F0000F1F12730310509F45AC074C08091F703FC |
:102F1000880F8E5A51C08091F703282F33278F5F77 |
:102F20008093F7032130310509F43EC0223031058A |
:102F30001CF4232BB1F15EC022303105C1F12330E6 |
:102F40003105C1F157C00E9424178091F7038430E6 |
:102F500018F41092F80302C01092F7030E941E1793 |
:102F600049C08091F603880F8D5A26C08091F603E0 |
:102F7000E82FFF27E35DF84F8091BB0080838091AD |
:102F8000F60399278130910579F0823091051CF480 |
:102F9000892B39F02FC08230910549F0039751F009 |
:102FA00029C08091AB0708C08091B20705C080910D |
:102FB000CC0702C08091CE070E9428171BC09091B9 |
:102FC000F603E92FFF27E35DF84F8091BB00848370 |
:102FD000892F8F5F8093F603843010F01092F603F0 |
:102FE0000E9424178AE090E090938B0380938A03D9 |
:102FF0001092F8038091BC0080688093BC00FF9120 |
:10300000EF91BF91AF919F918F917F916F915F9160 |
:103010004F913F912F910F900FBE0F901F901895D9 |
:1030200083EC8093810080916F00806280936F00B9 |
:1030300010928B0410928A0410928D0410928C04CA |
:1030400010928F0410928E0408951F920F920FB663 |
:103050000F9211240F931F932F933F934F935F93DE |
:103060006F937F938F939F93AF93BF93CF93DF9390 |
:10307000EF93FF9340918600509187008091F90370 |
:103080009091FA03481B590B80918600909187001C |
:103090009093FA038093F903CA018D549440A09150 |
:1030A000FB03B091FC03835F9A4158F4149714F02A |
:1030B00010926D0381E090E09093FC038093FB03FA |
:1030C00099C0AA30B1050CF095C0CA018B5F904041 |
:1030D000845B914008F071C0425D5140FD01EA0FF0 |
:1030E000FB1FEB5CF84F80819181FA01E81BF90B23 |
:1030F000CF01F7FF03C0909581959F4F06974CF441 |
:1031000080912A04883C28F480912A04865F809369 |
:103110002A04FD01EA0FFB1FEB5CF84F80819181CF |
:103120009C01220F331F280F391F240F351F37FF33 |
:1031300002C02D5F3F4FE901D595C795D595C7953D |
:10314000CA0101968C179D0714F4219706C04150BF |
:103150005040C417D5070CF4219680912A04833C73 |
:10316000D8F08D010A0F1B1FF801EB5CF84F80812E |
:1031700091819E01281B390BC90163E070E00E9418 |
:103180005843CB01880F991F860F971F055B184F77 |
:10319000F8019183808307C0AA0FBB1FA55BB84FBE |
:1031A00011961C921E92E091FB03F091FC03EE0F2E |
:1031B000FF1FEB5CF84FD183C0838091FB0390919C |
:1031C000FC0301969093FC038093FB03059711F495 |
:1031D0005D9A01C05D988091FB039091FC0386305D |
:1031E000910511F45C9A01C05C98079711F45B9A01 |
:1031F00001C05B98FF91EF91DF91CF91BF91AF91AB |
:103200009F918F917F916F915F914F913F912F91FE |
:103210001F910F910F900FBE0F901F90189581E096 |
:103220008093610782E08093620783E08093630765 |
:1032300054E05093640735E03093650786E080934F |
:10324000660787E08093670728E02093680788E691 |
:10325000809369079EE190936A078BEF80936C07D8 |
:103260008AE080936D0790936B0790936F0750935C |
:103270006E078FE080937007909371076CE0609306 |
:1032800072072093730786EE8093740790937507F7 |
:1032900080E88093760780E58093770746E940933E |
:1032A00078078EE58093790783E280937A0790937D |
:1032B0007B0710927C0780E280937D078DEF8093DF |
:1032C0007E0724E620937F079AE5909380079093EA |
:1032D0008107909391079093920710929307109211 |
:1032E00094072093820788E28093830710929607C1 |
:1032F00082E3809384074093850730938607809309 |
:103300008707909388078093890710929507909379 |
:103310008A0730938B0720938C0720938D0780E1D9 |
:1033200080938E0750938F0720939007ABE9B7E007 |
:10333000ECE8F3E001900D926150E1F7089581E02F |
:103340008093610782E08093620743E040936307C4 |
:1033500074E07093640755E05093650736E030934E |
:10336000660787E08093670728E02093680788E670 |
:10337000809369079EE190936A078BEF80936C07B7 |
:103380008AE080936D0790936B0790936F0740934B |
:103390006E076CE06093700780E180937107309353 |
:1033A00072072093730786EE8093740790937507D6 |
:1033B00080E88093760780E58093770788E780939D |
:1033C00078078EE58093790783E280937A0790935C |
:1033D0007B0710927C0740E240937D078DEF80933E |
:1033E0007E0734E630937F072AE5209380072093F9 |
:1033F00081072093910720939207109293071092D0 |
:1034000094073093820788E280938307109296078F |
:1034100092E39093840786E980938507509386070B |
:1034200090938707209388079093890710929507B8 |
:1034300020938A0750938B0730938C0730938D0726 |
:1034400040938E0770938F078BE480939007ABE9CE |
:10345000B7E0E3E9F3E001900D926150E1F70895E0 |
:1034600081E08093610782E08093620743E04093AC |
:10347000630764E06093640755E05093650736E0A6 |
:103480003093660787E08093670728E020936807FA |
:1034900088EE809369079EE190936A078BEF809393 |
:1034A0006C078AE080936D0790936B0790936F078A |
:1034B00040936E072093700740E14093710730936B |
:1034C00072072093730786EE8093740790937507B5 |
:1034D00080E88093760734E63093770788E7809317 |
:1034E00078078EE58093790783E280937A0784E1F9 |
:1034F00080937B0710927C0740937D078DEF80932C |
:103500007E0730937F079AE5909380079093810719 |
:1035100090939107909392071092930710929407BB |
:103520003093820788E2809383071092960722E304 |
:103530002093840786E9809385075093860720931C |
:103540008707909388072093890710929507909397 |
:103550008A0750938B0730938C0730938D0780E256 |
:1035600080938E0760938F0720939007ABE9B7E0B5 |
:10357000EBE9F3E08CE001900D928150E1F70895C2 |
:10358000CF93C82FC150CF3F81F080912104882371 |
:1035900061F484E690E09093CA038093C9038AEFB4 |
:1035A00090E00E94760DC15080F7CF91089510925F |
:1035B0007A008091E7039091E8039093B407809399 |
:1035C000B3078091E5039091E6039093AA07809357 |
:1035D000A9078091E3039091E4039093D50780932A |
:1035E000D4078091DF039091E003AA2797FDA0956F |
:1035F000BA2FBC01CD012CE030E040E050E00E9449 |
:103600001943DC01CB019093D2078093D1078091BD |
:10361000E1039091E203AA2797FDA095BA2FBC0180 |
:10362000CD010E941943DC01CB019093E207809306 |
:10363000E1078091DD039091DE039093BB078093B7 |
:10364000BA078FEE80937A0080916507E82FFF27F5 |
:10365000EE0FFF1FEB5CF84F8081918182599F4FE5 |
:103660002091310430913204281739071CF42F5F60 |
:103670003F4F0CC08081918182599F4F82179307E1 |
:103680004CF42115310531F0215030403093320493 |
:103690002093310480916607E82FFF27EE0FFF1F6C |
:1036A000EB5CF84F8081918182599F4F20912F04CC |
:1036B00030913004281739071CF42F5F3F4F0CC09E |
:1036C0008081918182599F4F821793074CF4211575 |
:1036D000310531F0215030403093300420932F04D5 |
:1036E00080916707E82FFF27EE0FFF1FEB5CF84F75 |
:1036F0008081918182599F4F20912D0430912E0419 |
:10370000281739071CF42F5F3F4F0CC0808191812F |
:1037100082599F4F821793074CF42115310531F0E0 |
:103720002150304030932E0420932D04809168075F |
:10373000E82FFF27EE0FFF1FEB5CF84F8081918190 |
:1037400082599F4F20912B0430912C042817390760 |
:103750001CF42F5F3F4F0CC08081918182599F4F95 |
:10376000821793074CF42115310531F02150304078 |
:1037700030932C0420932B048091310490913204D7 |
:1037800097FF05C010923204109231040AC08F3F97 |
:10379000910539F034F08FEF90E0909332048093EC |
:1037A000310480912F049091300497FF05C010924E |
:1037B000300410922F040AC08F3F910539F034F085 |
:1037C0008FEF90E09093300480932F0480912D042C |
:1037D00090912E0497FF05C010922E0410922D0494 |
:1037E0000AC08F3F910539F034F08FEF90E090934D |
:1037F0002E0480932D0480912B0490912C0497FF2C |
:1038000005C010922C0410922B040AC08F3F910522 |
:1038100039F034F08FEF90E090932C0480932B04D8 |
:1038200080918C079927AA27BB27BC01CD0124ECE6 |
:1038300039E040E050E00E941943DC01CB01809365 |
:10384000840390938503A0938603B09387038091AC |
:103850008D079927AA27BB27BC01CD010E941943D8 |
:10386000DC01CB018093800390938103A0938203BA |
:10387000B0938303089510928504109284041092EB |
:1038800083041092820480E090E0A0E0B0E0809396 |
:103890007C0490937D04A0937E04B0937F041092E7 |
:1038A0008F0410928E0410928D0410928C0410924A |
:1038B0008B0410928A0410920A04109209040E9448 |
:1038C000D71A84E690E00E94830D0E94D71A809157 |
:1038D000690780FF10C080910A0390910B03875BFA |
:1038E000934038F480910A0390910B038E5E9240CE |
:1038F00010F40E94510E8091E7039091E803909399 |
:103900008F0480938E048091E5039091E603909359 |
:103910008D0480938C048091E3039091E403909351 |
:103920008B0480938A0480918C0490918D049093F1 |
:1039300089048093880480918E0490918F049093E1 |
:1039400087048093860444E050E0DA010E94A84393 |
:10395000802D853078F18091E1079091E207809188 |
:10396000E1079091E20797FF03C0909581959F4FE3 |
:103970006CE070E00E94584370938304609382046B |
:103980008091D1079091D2078091D1079091D20771 |
:1039900097FF03C0909581959F4F6CE070E00E9467 |
:1039A0005843709385046093840480911D0790911F |
:1039B0001E0734C0DA010E94A843802D9927982F52 |
:1039C0008827DA0111960E94A843202D820F911DAD |
:1039D0009093850480938404DA0112960E94A84390 |
:1039E000802D9927982F8827DA0113960E94A843E3 |
:1039F000202D820F911D9093830480938204DA011D |
:103A000014960E94A843802D9927982F8827DA01C1 |
:103A100015960E94A843202D820F911DAA2797FD7D |
:103A2000A095BA2FBC01CD010E945742DC01CB0109 |
:103A300080937C0490937D04A0937E04B0937F04D4 |
:103A40001092560410925704109258041092590480 |
:103A50001092520410925304109254041092550480 |
:103A600010924E0410924F04109250041092510480 |
:103A700010924A0410924B0410924C0410924D0480 |
:103A80001092460410924704109248041092490480 |
:103A90001092B4071092B3071092AA071092A907C8 |
:103AA0001092D5071092D40780910C0390910D03CA |
:103AB000A0910E03B0910F039093200780931F07EE |
:103AC0001092D6031092D50310923E0410923F0438 |
:103AD000109240041092410480913C0490913D0466 |
:103AE00090933B0480933A040E94063F82E390E067 |
:103AF0009093CA038093C90380918C079927AA27C2 |
:103B0000BB27BC01CD0124EC39E040E050E00E942D |
:103B10001943DC01CB018856954CAF4FBF4F8093C2 |
:103B2000840390938503A0938603B09387038091C9 |
:103B30008D079927AA27BB27BC01CD010E941943F5 |
:103B4000DC01CB018856954CAF4FBF4F809380036B |
:103B500090938103A0938203B093830310926F0329 |
:103B600010926E0380913C0490913D04AA2797FD2A |
:103B7000A095BA2FBC01CD012EE036E040E050E028 |
:103B80000E941943DC01CB018093DD079093DE078F |
:103B9000A093DF07B093E00710923404109233042F |
:103BA00081E08093000108959F92AF92BF92CF92DF |
:103BB000DF92EF92FF920F931F93CF93DF93809149 |
:103BC0008A0490918B042091E3033091E403821BDB |
:103BD000930B9093D5078093D4078091E503909140 |
:103BE000E60320918C0430918D04821B930B9093FB |
:103BF000AA078093A9078091E7039091E803209199 |
:103C00008E0430918F04821B930B9093B4078093A2 |
:103C1000B3078091A9079091AA0790931207809308 |
:103C200011078091D1079091D2077C010027F7FC02 |
:103C30000095102F8091DF039091E003AA2797FD54 |
:103C4000A095BA2FBC01CD012CE030E040E050E05F |
:103C50000E941943DC01CB01E80EF91E0A1F1B1F4D |
:103C600017FF05C00894E11CF11C011D111D1595DD |
:103C70000795F794E794F092D207E092D1078091EC |
:103C8000E1079091E2077C010027F7FC0095102FD7 |
:103C90008091E1039091E203AA2797FDA095BA2FA6 |
:103CA000BC01CD012CE030E040E050E00E9419431F |
:103CB000DC01CB01E80EF91E0A1F1B1F17FF05C010 |
:103CC0000894E11CF11C011D111D15950795F79431 |
:103CD000E794F092E207E092E1078091BA079091B1 |
:103CE000BB079C01442737FD4095542F8091DD038D |
:103CF0009091DE03AA2797FDA095BA2F280F391FB0 |
:103D00004A1F5B1F57FF04C02F5F3F4F4F4F5F4F4E |
:103D100055954795379527953093BB072093BA075C |
:103D20008091DF039091E0036CE070E0869F90014A |
:103D3000879F300D969F300D1124C9019C014427A7 |
:103D400037FD4095542F8091660490916704A091AF |
:103D50006804B0916904820F931FA41FB51F80935C |
:103D6000660490936704A0936804B09369048091FB |
:103D7000E1039091E203869F9001879F300D969F0B |
:103D8000300D1124C9019C01442737FD4095542F63 |
:103D90008091620490916304A0916404B0916504E1 |
:103DA000820F931FA41FB51F809362049093630436 |
:103DB000A0936404B09365048091C2079091C307F7 |
:103DC0002091DF033091E003820F931F9093C3078C |
:103DD0008093C2078091D6079091D7072091E10385 |
:103DE0003091E203820F931F9093D7078093D607F9 |
:103DF0008091800490918104019690938104809336 |
:103E0000800480915E0490915F04A0916004B09161 |
:103E10006104BC01CD010E9457425B016C0180919D |
:103E20001D0790911E07AA2797FDA095BA2FBC01E8 |
:103E3000CD010E9457427B018C0180917C049091BE |
:103E40007D04A0917E04B0917F049C01AD01C80166 |
:103E5000B7010E94B141DC01CB019C01AD01C6015B |
:103E6000B5010E94B241DC01CB01BC01CD010E9431 |
:103E70003A42DC01CB0180935E0490935F04A093EF |
:103E80006004B09361048091D4079091D507AA276C |
:103E900097FDA095BA2FC091DD07D091DE07E09184 |
:103EA000DF07F091E007C80FD91FEA1FFB1FC0937F |
:103EB000DD07D093DE07E093DF07F093E007809102 |
:103EC000D4079091D5079C01442737FD4095542F86 |
:103ED0008091460490914704A0914804B091490410 |
:103EE000820F931FA41FB51F80934604909347042D |
:103EF000A0934804B09349048091D4079091D507CA |
:103F00009C01442737FD4095542F809142049091A5 |
:103F10004304A0914404B0914504820F931FA41F51 |
:103F2000B51F8093420490934304A0934404B0933C |
:103F30004504C03B33E8D30738E0E30730E0F3073C |
:103F400064F0C05BD348E840F040C093DD07D093F5 |
:103F5000DE07E093DF07F093E0078091DD079091A3 |
:103F6000DE07A091DF07B091E007B7FF0CC08055D6 |
:103F70009C47A74FBF4F8093DD079093DE07A09328 |
:103F8000DF07B093E00790901804992009F0C3C0B0 |
:103F900080911704882309F0BEC08091690786FFCD |
:103FA000BAC08091D4079091D507AA2797FDA09514 |
:103FB000BA2F2091560430915704409158045091E3 |
:103FC0005904BC01CD010E9419439B01AC0197FF2C |
:103FD00004C02150384F4F4F5F4F6BE055954795C8 |
:103FE000379527956A95D1F780910A04E82EFF242A |
:103FF00000271127CA01B901A80197010E9419439E |
:10400000DC01CB018093900490939104A0939204DF |
:10401000B0939304B7FF04C08150904FAF4FBF4F90 |
:104020005C016D013CE0D594C794B794A7943A9590 |
:10403000D1F7A0929004B0929104C0929204D092D1 |
:1040400093048091D4079091D507AA2797FDA09556 |
:10405000BA2F20914E0430914F044091500450915A |
:104060005104BC01CD010E94194397FF04C0615067 |
:10407000784F8F4F9F4F2BE0959587957795679554 |
:104080002A95D1F7A80197010E941943DC01CB01C1 |
:104090008093940490939504A0939604B09397040E |
:1040A000B7FF04C08150904FAF4FBF4F9C01AD018F |
:1040B0001CE055954795379527951A95D1F720938C |
:1040C0009404309395044093960450939704D6013A |
:1040D000C501D7FE07C0B095A095909581959F4FDB |
:1040E000AF4FBF4F81389105A105B10584F4DA01C6 |
:1040F000C90157FF07C0B095A095909581959F4F36 |
:10410000AF4FBF4F81389105A105B105A4F081E003 |
:104110008093350410C0109294041092950410926C |
:1041200096041092970410929004109291041092A9 |
:104130009204109293048091A9079091AA0720916C |
:10414000900430919104820F931F9093AA0780935B |
:10415000A90700910904202F332744275527809170 |
:10416000940490919504A0919604B0919704BC0199 |
:10417000CD010E9419439B01AC0197FF04C021505F |
:104180003E4F4F4F5F4FC9E055954795379527955F |
:10419000CA95D1F78091A9079091AA07820F931F22 |
:1041A0009093AA078093A9078091A9079091AA07E5 |
:1041B0009C01442737FD4095542F80914A049091EB |
:1041C0004B04A0914C04B0914D04820F931FA41F87 |
:1041D000B51F80934A0490934B04A0934C04B09372 |
:1041E0004D048091A9079091AA0720911B0430915A |
:1041F0001C04821B930B9C01442737FD4095542FD0 |
:1042000080914E0490914F04A0915004B0915104BC |
:10421000820F931FA41FB51F80934E0490934F04E9 |
:10422000A0935004B0935104C0918003D0918103B6 |
:10423000E0918203F0918303C817D907EA07FB07CF |
:10424000C4F488EA91E6A0E0B0E08C1B9D0BAE0BB5 |
:10425000BF0B80934E0490934F04A0935004B093EF |
:10426000510480934A0490934B04A0934C04B09360 |
:104270004D0422273327A9012C1B3D0B4E0B5F0B4E |
:1042800080914E0490914F04A0915004B09151043C |
:1042900082179307A407B507B4F4CE01DF01885A4B |
:1042A0009146A040B04080934E0490934F04A09359 |
:1042B0005004B093510480934A0490934B04A0930C |
:1042C0004C04B0934D048091E5039091E6030F9761 |
:1042D00034F488E19CEF9093AA078093A90780911A |
:1042E000E5039091E603079734F480E398EF909309 |
:1042F000AA078093A907109101011A30A9F48091AF |
:10430000E5039091E603835F934034F088EE93E0F9 |
:104310009093AA078093A9078091E5039091E60303 |
:104320008A5F9340DCF014C08091E5039091E6032E |
:10433000855E974034F088EE93E09093AA078093CF |
:10434000A9078091E5039091E603835F974034F0DD |
:1043500080ED97E09093AA078093A9078091B30717 |
:104360009091B4072091940430919504821B930B93 |
:104370009093B4078093B307202F33274427552702 |
:104380008091900490919104A0919204B091930433 |
:10439000BC01CD010E9419439B01AC0197FF04C0F1 |
:1043A00021503E4F4F4F5F4FB9E055954795379598 |
:1043B0002795BA95D1F78091B3079091B407821BE6 |
:1043C000930B9093B4078093B3078091B3079091B8 |
:1043D000B4079C01442737FD4095542F8091520427 |
:1043E00090915304A0915404B0915504820F931FEF |
:1043F000A41FB51F8093520490935304A0935404B8 |
:10440000B09355048091B3079091B407209119049B |
:1044100030911A04821B930B9C01442737FD409571 |
:10442000542F8091560490915704A0915804B09154 |
:104430005904820F931FA41FB51F809356049093B5 |
:104440005704A0935804B0935904C0918403D091A9 |
:104450008503E0918603F0918703C817D907EA071F |
:10446000FB07C4F488EA91E6A0E0B0E08C1B9D0B4A |
:10447000AE0BBF0B8093560490935704A09358043F |
:10448000B09359048093520490935304A09354041E |
:10449000B093550422273327A9012C1B3D0B4E0B4B |
:1044A0005F0B8091560490915704A0915804B091ED |
:1044B000590482179307A407B507B4F4CE01DF01AE |
:1044C000885A9146A040B040809356049093570478 |
:1044D000A0935804B09359048093520490935304CA |
:1044E000A0935404B09355048091E7039091E8039E |
:1044F0000F9734F488E19CEF9093B4078093B3074F |
:104500008091E7039091E803079734F480E398EFF4 |
:104510009093B4078093B3071A30A9F48091E7030E |
:104520009091E803835F934034F088EE93E090939A |
:10453000B4078093B3078091E7039091E8038A5F03 |
:104540009340DCF014C08091E7039091E803855E0E |
:10455000974034F088EE93E09093B4078093B307CC |
:104560008091E7039091E803835F974034F080EDFA |
:1045700097E09093B4078093B3078FEE80937A000F |
:104580008091460490914704A0914804B091490459 |
:1045900080935A0490935B04A0935C04B0935D04F1 |
:1045A0008091560490915704A0915804B0915904F9 |
:1045B0008093760490937704A0937804B093790461 |
:1045C00080914E0490914F04A0915004B0915104F9 |
:1045D00080936E0490936F04A0937004B093710461 |
:1045E0008091520490915304A0915404B0915504C9 |
:1045F0008093720490937304A0937404B093750431 |
:1046000080914A0490914B04A0914C04B0914D04C8 |
:1046100080936A0490936B04A0936C04B0936D0430 |
:104620008091690787FF6EC0992009F06BC0809167 |
:104630001704882309F066C08091B3079091B407EE |
:10464000893C91058CF02091B3073091B407220F7B |
:10465000331F220F331F8091B3079091B407820F4D |
:10466000931F8052934017C08091B3079091B40775 |
:1046700088539F4FA4F42091B3073091B407220FC1 |
:10468000331F220F331F8091B3079091B407820F1D |
:10469000931F805E9C4F9093B4078093B3078091E3 |
:1046A000A9079091AA07893C91058CF02091A90750 |
:1046B0003091AA07220F331F220F331F8091A907C1 |
:1046C0009091AA07820F931F8052934017C0809148 |
:1046D000A9079091AA0788539F4FA4F42091A90796 |
:1046E0003091AA07220F331F220F331F8091A90791 |
:1046F0009091AA07820F931F805E9C4F9093AA0708 |
:104700008093A90780916507E82FFF27EE0FFF1F11 |
:10471000EB5CF84F8081918182599F4F2091310449 |
:1047200030913204281739071CF42F5F3F4F0CC01B |
:104730008081918182599F4F821793074CF42115F4 |
:10474000310531F021503040309332042093310450 |
:1047500080916607E82FFF27EE0FFF1FEB5CF84FF5 |
:104760008081918182599F4F20912F043091300494 |
:10477000281739071CF42F5F3F4F0CC080819181AF |
:1047800082599F4F821793074CF42115310531F060 |
:10479000215030403093300420932F0480916707DC |
:1047A000E82FFF27EE0FFF1FEB5CF84F8081918110 |
:1047B00082599F4F20912D0430912E0428173907DC |
:1047C0001CF42F5F3F4F0CC08081918182599F4F15 |
:1047D000821793074CF42115310531F021503040F8 |
:1047E00030932E0420932D0480916807E82FFF2733 |
:1047F000EE0FFF1FEB5CF84F8081918182599F4F34 |
:1048000020912B0430912C04281739071CF42F5FBA |
:104810003F4F0CC08081918182599F4F821793072F |
:104820004CF42115310531F02150304030932C04E7 |
:1048300020932B04809131049091320497FF05C09E |
:1048400010923204109231040AC08F3F910539F062 |
:1048500034F08FEF90E09093320480933104809194 |
:104860002F049091300497FF05C0109230041092ED |
:104870002F040AC08F3F910539F034F08FEF90E09C |
:104880009093300480932F0480912D0490912E04F6 |
:1048900097FF05C010922E0410922D040AC08F3F7E |
:1048A000910539F034F08FEF90E090932E048093CF |
:1048B0002D0480912B0490912C0497FF05C0109239 |
:1048C0002C0410922B040AC08F3F910539F034F06C |
:1048D0008FEF90E090932C0480932B04DF91CF9185 |
:1048E0001F910F91FF90EF90DF90CF90BF90AF900E |
:1048F0009F90089580912104882301F58093B20749 |
:104900008093AB078093CC078093CE078091AE0352 |
:10491000882311F08093AB078091AF03882311F0B7 |
:104920008093B2078091B003882311F08093CE0763 |
:104930008091B103882311F08093CC078091AB075D |
:1049400099279093F2068093F1068091B2079927F8 |
:104950009093F4068093F3068091CE079927909365 |
:10496000F6068093F5068091CC0799279093F80678 |
:104970008093F7061092F8031092F7030E941E1717 |
:1049800008951F9380916C078B3F98F08B3F19F42B |
:10499000809131040EC08C3F19F480912F0409C01E |
:1049A0008D3F19F480912D0404C08E3F21F4809135 |
:1049B0002B0480937A0380917A03882321F08F3F20 |
:1049C00011F480937A0380916B078B3F98F08B3FB3 |
:1049D00019F4809131040EC08C3F19F480912F049A |
:1049E00009C08D3F19F480912D0404C08E3F21F43D |
:1049F00080912B0480937B0380917B03882329F093 |
:104A0000843618F084E680937B0380916D078B3F9A |
:104A100098F08B3F19F4809131040EC08C3F19F44B |
:104A200080912F0409C08D3F19F480912D0404C09A |
:104A30008E3F21F480912B04809379038091790338 |
:104A4000882329F0843618F084E6809379038091D6 |
:104A50006F078B3F98F08B3F19F4809131040EC0A3 |
:104A60008C3F19F480912F0409C08D3F19F4809177 |
:104A70002D0404C08E3F21F480912B048093780391 |
:104A800080917803882321F08F3F11F4809378037D |
:104A9000809176078B3F98F08B3F19F48091310419 |
:104AA0000EC08C3F19F480912F0409C08D3F19F47A |
:104AB00080912D0404C08E3F21F480912B048093BB |
:104AC000770380917703882321F08F3F11F480933F |
:104AD0007703809177078B3F98F08B3F19F4809193 |
:104AE00031040EC08C3F19F480912F0409C08D3F12 |
:104AF00019F480912D0404C08E3F21F480912B0481 |
:104B000080937603809176038B3010F48AE002C0A4 |
:104B10008F3F11F480937603809178078B3F98F054 |
:104B20008B3F19F4809131040EC08C3F19F48091B1 |
:104B30002F0409C08D3F19F480912D0404C08E3FCD |
:104B400021F480912B048093750380917503882351 |
:104B500021F08F3F11F48093750380917D078B3F87 |
:104B600098F08B3F19F4809131040EC08C3F19F4FA |
:104B700080912F0409C08D3F19F480912D0404C049 |
:104B80008E3F21F480912B048093730380917303F3 |
:104B9000882321F08F3F11F48093730380917E0767 |
:104BA0008B3F98F08B3F19F4809131040EC08C3FFD |
:104BB00019F480912F0409C08D3F19F480912D04C0 |
:104BC00004C08E3F21F480912B04809312048091C5 |
:104BD0001204882321F08F3F11F4809312048091F6 |
:104BE0007F078B3F98F08B3F19F4809131040EC002 |
:104BF0008C3F19F480912F0409C08D3F19F48091E6 |
:104C00002D0404C08E3F21F480912B048093110465 |
:104C100080911104882321F08F3F11F480931104B7 |
:104C2000809180078B3F98F08B3F19F4809131047D |
:104C30000EC08C3F19F480912F0409C08D3F19F4E8 |
:104C400080912D0404C08E3F21F480912B04809329 |
:104C5000100480911004882321F08F3F11F4809379 |
:104C60001004809181078B3F98F08B3F19F480915D |
:104C700031040EC08C3F19F480912F0409C08D3F80 |
:104C800019F480912D0404C08E3F21F480912B04EF |
:104C900080930F0480910F04882321F08F3F11F43B |
:104CA00080930F04809191078B3F98F08B3F19F40C |
:104CB000809131040EC08C3F19F480912F0409C0FB |
:104CC0008D3F19F480912D0404C08E3F21F4809112 |
:104CD0002B0480930E0480910E04882321F08F3FD3 |
:104CE00011F480930E04809192078B3F98F08B3FD4 |
:104CF00019F4809131040EC08C3F19F480912F0477 |
:104D000009C08D3F19F480912D0404C08E3F21F419 |
:104D100080912B0480930D0480910D04882321F051 |
:104D20008F3F11F480930D04809193078B3F98F08F |
:104D30008B3F19F4809131040EC08C3F19F480919F |
:104D40002F0409C08D3F19F480912D0404C08E3FBB |
:104D500021F480912B0480930C0480910C0488230F |
:104D600021F08F3F11F480930C04809194078B3FC6 |
:104D700098F08B3F19F4809131040EC08C3F19F4E8 |
:104D800080912F0409C08D3F19F480912D0404C037 |
:104D90008E3F21F480912B0480930B0480910B04AF |
:104DA000882321F08F3F11F480930B0480918207B8 |
:104DB0008B3F98F08B3F19F4809131040EC08C3FEB |
:104DC00019F480912F0409C08D3F19F480912D04AE |
:104DD00004C08E3F21F480912B0480937203809154 |
:104DE0007203882321F08F3F11F480937203809126 |
:104DF00087078B3F98F08B3F19F4809131040EC0E8 |
:104E00008C3F19F480912F0409C08D3F19F48091D3 |
:104E10002D0404C08E3F21F480912B0480937103F4 |
:104E200080917103882321F08F3F11F480937103E7 |
:104E300080918A078B3F98F08B3F19F48091310461 |
:104E40000EC08C3F19F480912F0409C08D3F19F4D6 |
:104E500080912D0404C08E3F21F480912B04809317 |
:104E60000A0480910A04882321F08F3F11F4809373 |
:104E70000A0480918B078B3F98F08B3F19F4809147 |
:104E800031040EC08C3F19F480912F0409C08D3F6E |
:104E900019F480912D0404C08E3F21F480912B04DD |
:104EA0008093090480910904882321F08F3F11F435 |
:104EB00080930904809190078B3F98F08B3F19F401 |
:104EC000809131040EC08C3F19F480912F0409C0E9 |
:104ED0008D3F19F480912D0404C08E3F21F4809100 |
:104EE0002B048093700380917003882321F08F3FFF |
:104EF00011F48093700310917303812F992787FD1C |
:104F00009095A92FB92FBC01CD010E94574217FFE0 |
:104F100006C020E030E040E853E40E94B24127E1BF |
:104F200037EB41ED58E30E94D142DC01CB01809385 |
:104F30007C0390937D03A0937E03B0937F038091C5 |
:104F400074078093D307809173078093B5071F91EF |
:104F500008952F923F924F925F926F927F928F921D |
:104F60009F92AF92BF92CF92DF92EF92FF920F93F8 |
:104F70001F93CF93DF93CDB7DEB765970FB6F89445 |
:104F8000DEBF0FBECDBF0E94D41D299AE09022043F |
:104F9000F0902304FA82E9828091B50799270A9656 |
:104FA000E816F90614F49A83898380912A048436DA |
:104FB00008F06EC080910303882399F48091060362 |
:104FC000909107038F5F9F4F61F488E99AE3909374 |
:104FD000CA038093C90380E09CE090930703809309 |
:104FE00006038091B4049091B504009731F00197C5 |
:104FF0009093B5048093B40404C0109221041092DD |
:105000003704809101018A3011F4289A01C0289850 |
:105010008091FD039091FE03895E9340B0F18091F1 |
:105020007A07282F33273A83298381E08093370436 |
:1050300080916107A82FBB27AA0FBB1FFD01E55B6D |
:10504000F84F1182108280916207282F3327220F98 |
:10505000331FC901855B984FFC0111821082AB5C44 |
:10506000B84F11961C921E922B5C384FD9011196A5 |
:105070001C921E9280916407E82FFF27EE0FFF1FFE |
:10508000EB5CF84F118210828BC21092210488C20F |
:1050900080912A048D3808F483C2109237049091CD |
:1050A0007B0782E3989FC00111249093B5048093FD |
:1050B000B404E981FA81B9976CF08091FD03909175 |
:1050C000FE03FFEF8F3F9F0729F001969093FE03A9 |
:1050D0008093FD038091FD039091FE038F3F910526 |
:1050E00009F0B0F4109298041092990410929A0466 |
:1050F00010929B0410929C0410929D0410929E04A6 |
:1051000010929F048A3F910519F481E08093BC04BA |
:1051100080916307E82FFF27EE0FFF1FEB5CF84F2E |
:1051200080819181813591050CF491C120912104F8 |
:10513000222309F08CC180916407E82FFF27EE0F2E |
:10514000FF1FEB5CF84F808191818C3491050CF44A |
:10515000F5C08091B6048F5F8093B604893C08F453 |
:1051600076C129982093B6041092FE031092FD0395 |
:1051700030916107E32FFF27EE0FFF1FEB5CF84F25 |
:105180008081918187349105B4F480916207E82F82 |
:10519000FF27EE0FFF1FEB5CF84F8081918101909C |
:1051A000F081E02DF7FF03C0F095E195FF4FE73464 |
:1051B000F1050CF47AC041E020916207A22FBB27D1 |
:1051C000AA0FBB1FAB5CB84F8D919C911197873490 |
:1051D000910544F0E32FFF27EE0FFF1FEB5CF84F24 |
:1051E000808191818D919C918734910574F080919B |
:1051F0006107E82FFF27EE0FFF1FEB5CF84F808160 |
:105200009181873491050CF042E0E22FFF27EE0FE9 |
:10521000FF1FEB5CF84F808191818634910574F417 |
:1052200080916107E82FFF27EE0FFF1FEB5CF84F1F |
:1052300080819181873491050CF043E0E22FFF27B4 |
:10524000EE0FFF1FEB5CF84F808191818A5B9F4FCF |
:1052500074F480916107E82FFF27EE0FFF1FEB5CCE |
:10526000F84F80819181873491050CF044E0E22F62 |
:10527000FF27EE0FFF1FEB5CF84F808191818A5B67 |
:105280009F4F74F480916107E82FFF27EE0FFF1FF7 |
:10529000EB5CF84F80819181863491050CF445E0F8 |
:1052A000A2E0B0E0042E0E94B04380916207E82F94 |
:1052B000FF27EE0FFF1FEB5CF84F8081918101907B |
:1052C000F081E02DF7FF03C0F095E195FF4F749753 |
:1052D000BCF480916107E82FFF27EE0FFF1FEB5C06 |
:1052E000F84F808191818A5B9F4F54F481E08093D5 |
:1052F000320688EE93E09093CA038093C903A7C057 |
:105300000E94790247E461E677E00E944F028091B3 |
:10531000690780FF10C080910A0390910B03875B9F |
:10532000934038F480910A0390910B038E5E924073 |
:1053300010F40E94510E0E943B1C82C0808191811A |
:10534000855B9F4F0CF081C08091B6048F5F809386 |
:10535000B604893C08F47BC02998A4E0B0E08FEF44 |
:10536000082E0E94B043209321042093B60410928B |
:10537000FE031092FD030E943B1CA4E0B0E080916C |
:1053800084049091850497FF02C081509F4F892F1C |
:10539000990F990B082E0E94B043A5E0B0E08091D0 |
:1053A000840490918504082E0E94B043A6E0B0E0EA |
:1053B000809182049091830497FF02C081509F4F97 |
:1053C000892F990F990B082E0E94B043A7E0B0E0F7 |
:1053D0008091820490918304082E0E94B04308E0DB |
:1053E00010E080917C0490917D04A0917E04B091A6 |
:1053F0007F04BC01CD010E943A42DC01CB019C013B |
:1054000097FF02C021503F4F832F992787FD9A9520 |
:10541000D801082E0E94B04309E010E080917C047E |
:1054200090917D04A0917E04B0917F04BC01CD01D8 |
:105430000E943A42DC01CB01D801082E0E94B04301 |
:105440000E9479020E94C01A02C02093B604809183 |
:105450006307E82FFF27EE0FFF1FEB5CF84F8081FB |
:1054600091818B5A9F4F0CF09BC020916407E22FD3 |
:10547000FF27EE0FFF1FEB5CF84F80819181855B6A |
:105480009F4F0CF06DC08091B7048F5F8093B7047D |
:10549000893C08F467C088EC8093B70481E090E011 |
:1054A0009093FE038093FD0381E08093210410928A |
:1054B000A0041092A1041092A2041092A3041092CE |
:1054C0004604109247041092480410924904109226 |
:1054D0004204109243041092440410924504109226 |
:1054E00056041092570410925804109259041092C6 |
:1054F0004E0410924F041092500410925104809167 |
:10550000760490917704A0917804B0917904809307 |
:10551000520490935304A0935404B0935504809183 |
:105520006E0490916F04A0917004B0917104809307 |
:105530004A0490934B04A0934C04B0934D041092F2 |
:1055400098041092990410929A0410929B0410925D |
:105550009C0410929D0410929E0410929F0402C01D |
:105560001092B704E22FFF27EE0FFF1FEB5CF84FFE |
:10557000808191818C3491058CF08091B8048F5F8B |
:105580008093B804893C60F01092210488EC8093E9 |
:10559000B8041092FE031092FD0302C01092B804EA |
:1055A00080916D03815080936D0380916D038F3FD7 |
:1055B00029F080913704882309F4DFC30E94C124B5 |
:1055C0008091C5049091C604AC01440F551F480F4B |
:1055D000591FF0906107AF2DBB27AA0FBB1FFD011C |
:1055E000EB5CF84FE0907007CE2CDD248081918138 |
:1055F0008C9D80018D9D100D9C9D100D1124400FE0 |
:10560000511F57FF02C04D5F5F4F55954795559508 |
:105610004795A55BB84F80917107682F77278D91CB |
:105620009C91869F9001879F300D969F300D11248D |
:10563000420F531F5093C6044093C5048091ED045C |
:105640009091EE042091E9043091EA04820F931FB7 |
:10565000481B590B50932904409328048091C70498 |
:105660009091C804AC01440F551F480F591F009179 |
:105670006207A02FBB27AA0FBB1FFD01EB5CF84FF1 |
:10568000808191818C9DF0018D9DF00D9C9DF00D90 |
:1056900011244E0F5F1F57FF02C04D5F5F4F55959E |
:1056A000479555954795A55BB84F8D919C91869FE1 |
:1056B0009001879F300D969F300D1124420F531F8C |
:1056C0005093C8044093C7048091EB049091EC047C |
:1056D0002091E7043091E804820F931F481B590B77 |
:1056E000509327044093260480916407E82FFF27F6 |
:1056F000EE0FFF1FEB5CF84F8081918190958195B3 |
:105700009F4F909325048093240480916307E82F92 |
:10571000FF27EE0FFF1FEB5CF84F808191818858C7 |
:105720009F4F909323048093220410917603812F3E |
:10573000992787FD9095A92FB92FBC01CD010E9413 |
:10574000574217FF06C020E030E040E853E40E94D3 |
:10575000B24120E030E040E251E40E94B241DC017D |
:10576000CB0120E030E040E85CE3BC01CD010E94C9 |
:10577000D142DC01CB018093D8079093D907A09345 |
:10578000DA07B093DB0710917503812F992787FD06 |
:105790009095A92FB92FBC01CD010E94574217FF48 |
:1057A00006C020E030E040E853E40E94B24120E02F |
:1057B00030EE4BE256E40E94F441DC01CB018093D1 |
:1057C000C8079093C907A093CA07B093CB0760910D |
:1057D000AB03662331F08AE090E09093CA03809394 |
:1057E000C903462F552742FF09C080910B04282F7B |
:1057F0003327220F331F220F331F13C09A01287043 |
:10580000307043FF0EC080910B04282F33278CEF9C |
:105810009FEF289FA001299F500D389F500D112404 |
:105820009A018091070490910804AC01F3E0440FC1 |
:10583000551FFA95E1F7481B590B420F531F57FFAD |
:1058400002C0495F5F4FE3E055954795EA95E1F760 |
:105850005093080440930704462F552744FF09C07E |
:1058600080910B04282F3327220F331F220F331F61 |
:1058700013C09A012072307045FF0EC080910B0456 |
:10588000282F33278CEF9FEF289FD001299FB00D41 |
:10589000389FB00D11249D0180910504909106045C |
:1058A000AC0163E0440F551F6A95E1F7481B590BA3 |
:1058B000420F531F57FF02C0495F5F4F83E055956A |
:1058C00047958A95E1F7509306044093050440916B |
:1058D000AA03842F992783FF03C082E390E007C0C7 |
:1058E0009C012470307082FF07C08EEC9FEF909374 |
:1058F00004048093030404C030930404209303043D |
:10590000242F332721FF09C080916E0390916F03EC |
:10591000019690936F0380936E0324FF09C08091DA |
:105920006E0390916F03019790936F0380936E03C2 |
:10593000809107049091080497FD019695958795AD |
:10594000E0912804F0912904E80FF91FF09329044D |
:10595000E0932804809105049091060497FD019638 |
:10596000959587956091260470912704680F791F9B |
:10597000709327046093260480910304909104049B |
:10598000880F991F880F991F409124045091250476 |
:10599000480F591F509325044093240480913E06DC |
:1059A00080FF59C080910B04813808F454C0809165 |
:1059B0003706992787FD90952E2D3327829FD0019A |
:1059C000839FB00D929FB00D1124EA0FFB1FF0933F |
:1059D0002904E093280480913806992787FD909543 |
:1059E000829FF001839FF00D929FF00D11246E0FA6 |
:1059F0007F1F7093270460932604809139069927AE |
:105A000087FD9095480F591F509325044093240417 |
:105A100080913B06282F332727FD309580916E0714 |
:105A20009927289FA001299F500D389F500D1124C0 |
:105A300050936F0340936E0380913A06282F3327CB |
:105A400080912204909123042817390724F430937D |
:105A5000230420932204809122049091230497FF31 |
:105A600004C010922304109222048091690782FFDF |
:105A70000CC080E090E0A0E0B0E08093C807909375 |
:105A8000C907A093CA07B093CB078091D80790911C |
:105A9000D907A091DA07B091DB0720E030E040E0C1 |
:105AA00050E0BC01CD010E946142882364F480E093 |
:105AB00090E0A0E0B0E08093D8079093D907A0933E |
:105AC000DA07B093DB078091C8079091C907A091CE |
:105AD000CA07B091CB0720E030E040E050E0BC01C5 |
:105AE000CD010E946142882364F480E090E0A0E050 |
:105AF000B0E08093C8079093C907A093CA07B093FA |
:105B0000CB074091280450912904CA0157FD039600 |
:105B10009C01359527953595279537FF03C030951E |
:105B200021953F4F809101049091020482179307C1 |
:105B30006CF4CA0157FF03C0909581959F4F97FD64 |
:105B40000396959587959595879501C001979093B4 |
:105B50000204809301044091260450912704CA0155 |
:105B600057FD03969C01359527953595279537FF69 |
:105B700003C0309521953F4F8091FF039091000421 |
:105B8000821793076CF4CA0157FF03C09095819563 |
:105B90009F4F97FD0396959587959595879501C09D |
:105BA0000197909300048093FF038091370488232A |
:105BB00041F010920204109201041092000410921D |
:105BC000FF03E02FFF27EE0FFF1FEB5CF84F409124 |
:105BD0008807242F3327808191812817390744F4BF |
:105BE0008091950782FF04C081E08093160413C062 |
:105BF000E02FFF27EE0FFF1FEB5CF84F842F992754 |
:105C000020918907821B910920813181281739074A |
:105C100014F41092160440916207E42FFF27EE0F50 |
:105C2000FF1FEB5CF84F50918807852F992722279B |
:105C30003327281B390B808191818217930744F405 |
:105C40008091950783FF04C081E08093150416C0FE |
:105C500080911504882391F0E42FFF27EE0FFF1F9A |
:105C6000EB5CF84F809189079927851B910920816A |
:105C700031818217930714F410921504EF2DFF273A |
:105C8000EE0FFF1FEB5CF84F40918807242F33275E |
:105C9000808191812817390744F48091950780FF0E |
:105CA00004C081E08093130417C0809113048823FB |
:105CB00099F0EF2DFF27EE0FFF1FEB5CF84F842FBD |
:105CC000992720918907821B91092081318128170A |
:105CD000390714F41092130440916107E42FFF2751 |
:105CE000EE0FFF1FEB5CF84F50918807852F992727 |
:105CF00022273327281B390B808191818217930734 |
:105D000044F48091950781FF04C081E080931404DE |
:105D100016C080911404882391F0E42FFF27EE0F22 |
:105D2000FF1FEB5CF84F809189079927851B91092C |
:105D3000208131818217930714F41092140480910A |
:105D40001604882319F480911504811181E0809351 |
:105D5000170480911304882321F48091140488236C |
:105D600051F081E0809318041092170410921604E9 |
:105D70001092150402C08093180420911704222366 |
:105D800031F084E690E09093CA038093C903222304 |
:105D900021F480911804882351F080918707992776 |
:105DA000A981BA818A179B0714F49A838983B091D9 |
:105DB0003704BB83BB2341F11092250410922404C5 |
:105DC000109229041092280410922704109226049D |
:105DD00080E090E0A8ECBFE38093D8079093D907C8 |
:105DE000A093DA07B093DB078BE09CEBA2E3BCE364 |
:105DF0008093C8079093C907A093CA07B093CB07B5 |
:105E000010921704109218048091BE079091BF075A |
:105E1000A091C007B091C10720917604309177041A |
:105E20004091780450917904820F931FA41FB51FED |
:105E30008093BE079093BF07A093C007B093C1079C |
:105E40008091C4079091C507A091C607B091C7077C |
:105E500060906E0470906F04809070049090710454 |
:105E6000860D971DA81DB91D8093C4079093C50783 |
:105E7000A093C607B093C7078091B6079091B70764 |
:105E8000A091B807B091B907E0907204F090730444 |
:105E90000091740410917504EC82FD820E831F83BF |
:105EA0008E0D9F1DA01FB11F8093B6079093B7075B |
:105EB000A093B807B093B9078091AE079091AF0750 |
:105EC000A091B007B091B107E0906A04F0906B0424 |
:105ED00000916C0410916D04E886F9860A871B878F |
:105EE0008E0D9F1DA01FB11F8093AE079093AF072B |
:105EF000A093B007B093B10750901804552029F42F |
:105F000080911704882309F45FC0109266041092F0 |
:105F1000670410926804109269041092620410924F |
:105F2000630410926404109265041092BE071092EC |
:105F3000BF071092C0071092C1071092C4071092B9 |
:105F4000C5071092C6071092C7071092B6071092A5 |
:105F5000B7071092B8071092B9071092AE071092C7 |
:105F6000AF071092B0071092B1078091560490913C |
:105F70005704A0915804B09159048093520490930F |
:105F80005304A0935404B093550480914E0490910F |
:105F90004F04A0915004B091510480934A0490930F |
:105FA0004B04A0934C04B0934D041092D403109270 |
:105FB000D30310921A041092190410921C04109228 |
:105FC0001B04552009F0FBC080911704882309F0B9 |
:105FD000F6C080917507E82EFF2400271127CA011B |
:105FE000B901A80197010E948D4359016A0180916E |
:105FF000D1079091D207AA2797FDA095BA2FA81A8A |
:10600000B90ACA0ADB0AC401B301A80197010E94B8 |
:106010008D4379018A018091E1079091E207AA27D7 |
:1060200097FDA095BA2FE81AF90A0A0B1B0BD601A7 |
:10603000C501D7FE03C00F96A11DB11D5C016D0106 |
:1060400054E0D594C794B794A7945A95D1F7D80142 |
:10605000C70117FF03C00F96A11DB11D7C018D0163 |
:1060600044E015950795F794E7944A95D1F7809108 |
:10607000010490910204819734F48091FF03909180 |
:1060800000048197A4F0C601B50123E030E040E0B0 |
:1060900050E00E948D4359016A01C801B70123E015 |
:1060A00030E040E050E00E948D4379018A01809108 |
:1060B0006407E82FFF27EE0FFF1FEB5CF84F80818E |
:1060C00091810190F081E02DF7FF03C0F095E195FB |
:1060D000FF4F7A97A4F0C601B50123E030E040E01D |
:1060E00050E00E948D4359016A01C801B70123E0C5 |
:1060F00030E040E050E00E948D4379018A0121E2C6 |
:10610000A216B104C104D1042CF030E2A32EB12CAC |
:10611000C12CD12C30EEA3163FEFB3063FEFC306E0 |
:106120003FEFD30644F420EEA22E2FEFB22E2FEF36 |
:10613000C22E2FEFD22E41E2E416F1040105110523 |
:106140002CF090E2E92EF12C012D112D50EEE516E8 |
:106150005FEFF5065FEF05075FEF150744F480EE8C |
:10616000E82E8FEFF82E8FEF082F8FEF182F8091EA |
:10617000560490915704A0915804B09159048A197B |
:106180009B09AC09BD098093560490935704A093D2 |
:106190005804B093590480914E0490914F04A091FB |
:1061A0005004B09151048E199F09A00BB10B80933C |
:1061B0004E0490934F04A0935004B09351048091E7 |
:1061C000D3039091D4038F3F910509F008F474C56F |
:1061D000552009F0F1C480911704882309F0ECC41C |
:1061E00080913504882309F0E7C48091BE0790911F |
:1061F000BF07A091C007B091C107B7FF04C081508D |
:106200009F4FAF4FBF4F292E3A2E4B2E552447FCA0 |
:106210005A942092BE073092BF074092C007509216 |
:10622000C1078091C4079091C507A091C607B0919E |
:10623000C707B7FF04C081509F4FAF4FBF4F892F93 |
:106240009A2FAB2FBB27A7FDBA958C879D87AE876A |
:10625000BF878093C4079093C507A093C607B093E8 |
:10626000C70780917507E82EFF240027112720918A |
:106270006604309167044091680450916904C80134 |
:10628000B7010E94194397FF04C061507F4F8F4FA1 |
:106290009F4FA72EB82EC92EDD24C7FCDA94A092FA |
:1062A0006604B0926704C0926804D0926904209199 |
:1062B0006204309163044091640450916504C80104 |
:1062C000B7010E94194397FF04C061507F4F8F4F61 |
:1062D0009F4F672E782E892E992487FC9A9460927E |
:1062E00062047092630480926404909265048091C9 |
:1062F0005E0490915F04A0916004B0916104B7FFC7 |
:1063000004C081509F4FAF4FBF4F892F9A2FAB2FA3 |
:10631000BB27A7FDBA9580935E0490935F04A0937A |
:106320006004B0936104D201C1018A199B09AC09D0 |
:10633000BD098093AC049093AD04A093AE04B093D8 |
:10634000AF0420918E07E22EFF2400271127BC0105 |
:10635000CD01A80197010E948D4359016A01209344 |
:10636000BD043093BE044093BF045093C0048C8599 |
:106370009D85AE85BF8586199709A809B9098093BF |
:10638000B0049093B104A093B204B093B304BC01E1 |
:10639000CD01A80197010E948D432093C104309341 |
:1063A000C2044093C3045093C404D601C501D7FE70 |
:1063B00004C081509F4FAF4FBF4F892F9A2FAB2FF3 |
:1063C000BB27A7FDBA9590931A048093190457FF31 |
:1063D00004C021503F4F4F4F5F4FBB2757FDBA9529 |
:1063E000A52F942F832F90931C0480931B048091DE |
:1063F0000104909102048197D4F48091FF0390915D |
:1064000000048197A4F480916407E82FFF27EE0F22 |
:10641000FF1FEB5CF84F808191810190F081E02DAE |
:10642000F7FF03C0F095E195FF4F7A97C4F0809194 |
:10643000190490911A0497FD01969595879590936C |
:106440001A048093190480911B0490911C0497FDF9 |
:1064500001969595879590931C0480931B048091D9 |
:10646000B6079091B707A091B807B091B907B7FFE9 |
:1064700004C081509F4FAF4FBF4F892F9A2FAB2F32 |
:10648000BB27A7FDBA958093B6079093B707A09353 |
:10649000B807B093B9078091AE079091AF07A0916C |
:1064A000B007B091B107B7FF04C081509F4FAF4F05 |
:1064B000BF4F892F9A2FAB2FBB27A7FDBA9580938B |
:1064C000AE079093AF07A093B007B093B107809148 |
:1064D000760490917704A0917804B0917904EC80CF |
:1064E000FD800E811F81E81AF90A0A0B1B0BE0924E |
:1064F000A404F092A5040093A6041093A70480912D |
:106500006E0490916F04A0917004B091710428857D |
:1065100039854A855B85281B390B4A0B5B0B209319 |
:10652000A8043093A9044093AA045093AB04E092CA |
:10653000AC04F092AD040093AE041093AF0420932A |
:10654000B0043093B1044093B2045093B3048091EB |
:10655000520490915304A0915404B09155048E19A3 |
:106560009F09A00BB10B8093520490935304A09306 |
:106570005404B093550480914A0490914B04A09127 |
:106580004C04B0914D04821B930BA40BB50B80936C |
:106590004A0490934B04A0934C04B0934D04209173 |
:1065A000330430913404213831054CF080918A0451 |
:1065B00090918B04019690938B0480938A042058C9 |
:1065C0003F4F4CF480918A0490918B0401979093F3 |
:1065D0008B0480938A04A090C407B090C507C09034 |
:1065E000C607D090C707C601B5012AE130E040E0F8 |
:1065F00050E00E948D4330930607209305071092C8 |
:1066000034041092330481E090E09093CA048093A4 |
:10661000C9048091CF049091D004A091D104B0918D |
:10662000D2042091BE073091BF074091C00750911E |
:10663000C107821B930BA40BB50B815E914BAF4F2F |
:10664000BF4F8F539C49A040B04008F0FEC0F1E01E |
:10665000EF16F0E1FF06F0E00F07F0E01F070CF483 |
:106660006CC08091CB04882309F463C0D801C701B2 |
:1066700017FF07C088279927DC018E199F09A00BF7 |
:10668000B10BB7FF04C08150904FAF4FBF4F2CE00C |
:10669000B595A795979587952A95D1F701969093EB |
:1066A000CA048093C904D801C70117FF03C0079625 |
:1066B000A11DB11D13E0B595A795979587951A95DE |
:1066C000D1F78093BD049093BE04A093BF04B09310 |
:1066D000C00489589341A040B04064F088E893E139 |
:1066E000A0E0B0E08093BD049093BE04A093BF04EB |
:1066F000B093C0042091BD043091BE044091BF040A |
:106700005091C00457FF04C021503F4F4F4F5F4F7F |
:10671000232F342F452F552747FD5A958091190473 |
:1067200090911A04820F931F90931A048093190476 |
:1067300006C081E08093CB0402C01092CB04E090AD |
:10674000AC04F090AD040091AE041091AF0420E0D1 |
:10675000E21620EFF2062FEF02072FEF12070CF0E0 |
:1067600071C08091CC04882309F468C0A801970106 |
:1067700017FF07C022273327A9012E193F09400B15 |
:10678000510B57FF04C02150304F4F4F5F4FECE08B |
:106790005595479537952795EA95D1F78091C90486 |
:1067A0009091CA04820F931F9093CA048093C904E6 |
:1067B000D801C70117FF03C00796A11DB11D73E0E3 |
:1067C000B595A795979587957A95D1F78093BD0450 |
:1067D0009093BE04A093BF04B093C00488579C4E0E |
:1067E000AF4FBF4F64F488E79CEEAFEFBFEF8093ED |
:1067F000BD049093BE04A093BF04B093C004209145 |
:10680000BD043091BE044091BF045091C00457FFB5 |
:1068100004C021503F4F4F4F5F4F232F342F452F40 |
:10682000552747FD5A958091190490911A04820FBB |
:10683000931F90931A048093190411C081E08093F0 |
:10684000CC040DC01092CC040AC01092CA0410925D |
:10685000C90484EF91E09093890380938803109199 |
:106860008F07212F33278091C9049091CA042817DC |
:10687000390724F43093CA042093C9044091AC042E |
:106880005091AD046091AE047091AF04413084E04A |
:10689000580780E0680780E0780774F080918E04E4 |
:1068A00090918F042091C9043091CA04820F931FE4 |
:1068B00090938F0480938E0440505C4F6F4F7F4FB6 |
:1068C00074F480918E0490918F042091C9043091CA |
:1068D000CA04821B930B90938F0480938E0481E0F3 |
:1068E00090E09093CA048093C9041092C10410925E |
:1068F000C2041092C3041092C4048091D3049091F6 |
:10690000D404A091D504B091D6048A199B09AC098E |
:10691000BD09815E914BAF4FBF4F8F539C49A04043 |
:10692000B04008F000C1C090B004D090B104E09035 |
:10693000B204F090B304F1E0CF16F0E1DF06F0E02E |
:10694000EF06F0E0FF060CF46CC08091CD048823C4 |
:1069500009F463C0D701C601F7FE07C0882799274D |
:10696000DC018C199D09AE09BF09B7FF04C0815035 |
:10697000904FAF4FBF4F2CE0B595A7959795879552 |
:106980002A95D1F701969093CA048093C904D70140 |
:10699000C601F7FE03C00796A11DB11D03E0B59522 |
:1069A000A795979587950A95D1F78093C104909301 |
:1069B000C204A093C304B093C40489589341A04077 |
:1069C000B04064F088E893E1A0E0B0E08093C104B7 |
:1069D0009093C204A093C304B093C4042091C10453 |
:1069E0003091C2044091C3045091C40457FF04C0C5 |
:1069F00021503F4F4F4F5F4F232F342F452F5527A7 |
:106A000047FD5A9580911B0490911C04820F931F9F |
:106A100090931C0480931B0406C081E08093CD04F6 |
:106A200002C01092CD0420E0C21620EFD2062FEF54 |
:106A3000E2062FEFF2060CF073C08091CE0488239B |
:106A400009F46AC0D701C601F7FE07C08827992755 |
:106A5000DC018C199D09AE09BF099C01AD01B7FF8E |
:106A600004C02150304F4F4F5F4FECE05595479594 |
:106A700037952795EA95D1F78091C9049091CA047A |
:106A8000820F931F9093CA048093C904D701C60153 |
:106A9000F7FE03C00796A11DB11D73E0B595A7953C |
:106AA000979587957A95D1F78093C1049093C20406 |
:106AB000A093C304B093C40488579C4EAF4FBF4FFC |
:106AC00064F488E79CEEAFEFBFEF8093C10490932E |
:106AD000C204A093C304B093C4042091C1043091B4 |
:106AE000C2044091C3045091C40457FF04C0215014 |
:106AF0003F4F4F4F5F4F232F342F452F552747FDD3 |
:106B00005A9580911B0490911C04820F931F9093BF |
:106B10001C0480931B0411C081E08093CE040DC03F |
:106B20001092CE040AC01092CA041092C90484EFD5 |
:106B300091E09093890380938803212F33278091DC |
:106B4000C9049091CA042817390724F43093CA0461 |
:106B50002093C9044091B0045091B1046091B204F3 |
:106B60007091B304413084E0580780E0680780E00A |
:106B7000780774F080918C0490918D042091C90461 |
:106B80003091CA04820F931F90938D0480938C04DC |
:106B900040505C4F6F4F7F4FCCF480918C049091AC |
:106BA0008D042091C9043091CA04821B930B9093E9 |
:106BB0008D0480938C040AC010921C0410921B0454 |
:106BC00010921A0410921904109235048091C8078B |
:106BD0009091C907A091CA07B091CB0720E030E09F |
:106BE00040E050E0BC01CD010E946142882341F4A5 |
:106BF00010921C0410921B0410921A041092190493 |
:106C00008091BE079091BF07A091C007B091C107C6 |
:106C10008093CF049093D004A093D104B093D20476 |
:106C20008091C4079091C507A091C607B091C7078E |
:106C30008093D3049093D404A093D504B093D60446 |
:106C4000109266041092670410926804109269040E |
:106C5000109262041092630410926404109265040E |
:106C600010925E0410925F0410926004109261040E |
:106C70001092BE071092BF071092C0071092C10772 |
:106C80001092C4071092C5071092C6071092C7074A |
:106C90001092B6071092B7071092B8071092B90772 |
:106CA0001092AE071092AF071092B0071092B10782 |
:106CB0001092D4031092D303A0902404B090250422 |
:106CC000C501B7FE04C0882799278A199B094097F8 |
:106CD000ACF08091690784FD11C081E08093BC0411 |
:106CE0008091DD079091DE0790933B0480933A04F6 |
:106CF0008AEF90E09093890380938803D090720785 |
:106D0000ED2CFF2400271127B501882777FD8095FA |
:106D1000982F9501B7FE04C0222733272A193B0973 |
:106D2000442737FD4095542F0E9419439B01AC0125 |
:106D3000C801B7010E94194397FF04C061507E4FFC |
:106D40008F4F9F4F59E095958795779567955A9501 |
:106D5000D1F79B018D2D99278A9DD0018B9DB00D78 |
:106D60009A9DB00D1124CD01B7FD03969595879599 |
:106D700095958795280F391F442737FD4095542F47 |
:106D80002093A0043093A1044093A2045093A30441 |
:106D90008091460490914704A0914804B091490421 |
:106DA000821B930BA40BB50B80934604909347046E |
:106DB000A0934804B09349048155934CA040B0403F |
:106DC00064F080E593ECA0E0B0E0809346049093FB |
:106DD0004704A0934804B0934904809146049091DD |
:106DE0004704A0914804B0914904805B9C43AF4F95 |
:106DF000BF4F64F480EB9CE3AFEFBFEF809346049A |
:106E000090934704A0934804B093490480913C04B4 |
:106E100090913D04892B09F465C18091690783FF36 |
:106E200061C18091760490917704A0917804B0912B |
:106E30007904B7FF04C081509E4FAF4FBF4F29E088 |
:106E4000B595A795979587952A95D1F74C0197FF0A |
:106E500004C0909481949108939480916E049091D1 |
:106E60006F04A0917004B0917104B7FF04C0815009 |
:106E70009E4FAF4FBF4F09E0B595A7959795879562 |
:106E80000A95D1F7BC0197FF03C0709561957F4FBC |
:106E9000861697060CF44B01B40197FE02C0695F99 |
:106EA0007F4F3B0113E0759467941A95E1F70894BE |
:106EB000611C711C09E18016910434F58091BC04B9 |
:106EC000882311F18091880390918903892BE1F443 |
:106ED00088EC90E09093CA038093C9038091DD070A |
:106EE0009091DE07A091DF07B091E007BC01CD01D2 |
:106EF0002EE036E040E050E00E948D4330933B04AA |
:106F000020933A041092BC0480913C0490913D047B |
:106F1000845E9D4F7C010027F7FC0095102FA09008 |
:106F2000DD07B090DE07C090DF07D090E007C60114 |
:106F3000B5012EE036E040E050E00E948D43E21AB9 |
:106F4000F30A040B150BC801B70128E631E040E055 |
:106F500050E00E948D43DC01CB01FC01E45BF0407A |
:106F6000CF01B3E0880F991FBA95E1F7B3010E94F2 |
:106F700058439B01442737FD4095542F2A0D3B1D54 |
:106F80004C1D5D1D2093DD073093DE074093DF0726 |
:106F90005093E00710917703612F7727869EC001F9 |
:106FA000879E900D969E900D112497FDCF964C01D3 |
:106FB000A6E095948794AA95E1F7681979094B01A1 |
:106FC000161617060CF088C08091880390918903EB |
:106FD000009709F07FC080913304909134048E0FA4 |
:106FE0009F1F9093340480933304E0900104F09049 |
:106FF00002048091FF0390910004E80EF91EF7FE51 |
:1070000004C087E090E0E80EF91E63E0F594E79491 |
:107010006A95E1F7A0E4B0E0EA0EFB1ECA01B901EF |
:107020002EE036E040E050E00E948D43DA01C901D5 |
:1070300020913A0430913B04442737FD4095542F6A |
:10704000821B930BA40BB50B845E9D4FAF4FBF4FBC |
:10705000BC01CD0128E631E040E050E00E948D43C4 |
:10706000DC01CB01845B9040889DF001899DF00D8F |
:10707000989DF00D1124CF01B7010E94584383E081 |
:10708000189F400111248616970614F4B40108C015 |
:107090008827992788199909681779070CF4BC0182 |
:1070A0009B01442737FD4095542F809146049091D1 |
:1070B0004704A0914804B0914904820F931FA41F74 |
:1070C000B51F8093460490934704A0934804B0935F |
:1070D000490408C0019702C08AEF90E090938903A9 |
:1070E000809388038091BB0481508093BB048F3FC1 |
:1070F00009F0B8C088E18093BB0480917507E82E41 |
:10710000FF24002711278091760490917704A091A5 |
:107110007804B0917904BC01CD01A80197010E94C7 |
:107120008D433093DA062093D90680916E049091B6 |
:107130006F04A0917004B0917104BC01CD01A8014D |
:1071400097010E948D433093DC062093DB068091EB |
:10715000D1079091D2079093DE068093DD0680914F |
:10716000E1079091E2079093E0068093DF0680911B |
:10717000D4079091D5079093E2068093E106809121 |
:107180001F04909120049093E4068093E30680917D |
:107190003E0490913F04A0914004B0914104B7FF98 |
:1071A00004C081509E4FAF4FBF4F39E0B595A795B2 |
:1071B000979587953A95D1F79093E6068093E506E3 |
:1071C00080913C0490913D049093EA068093E906F7 |
:1071D00080911003909111039093EC068093EB063D |
:1071E0008091DD079091DE07A091DF07B091E00765 |
:1071F000BC01CD012EE036E040E050E00E948D431E |
:107200003093F0062093EF0680912A0499279093FB |
:10721000EE068093ED068091BA079091BB0790939C |
:10722000FA068093F9068091320699279093000719 |
:107230008093FF068091C6039091C7039093020745 |
:10724000809301078091ED049091EE0490931607CE |
:10725000809315078091EB049091EC0490931807AC |
:107260008093170780911804A090D807B090D90791 |
:10727000C090DA07D090DB078823A9F08091B3078C |
:107280009091B407AA2797FDA095BA2FBC01CD0114 |
:107290000E945742DC01CB01A6019501BC01CD0142 |
:1072A0000E94D1423AC08091760490917704A091D7 |
:1072B0007804B0917904BC01CD010E9457427B0152 |
:1072C0008C018091C8079091C907A091CA07B0911D |
:1072D000CB079C01AD01C801B7010E94D1427B01DF |
:1072E0008C018091B3079091B407AA2797FDA095D0 |
:1072F000BA2FBC01CD010E945742DC01CB01A6018F |
:107300009501BC01CD010E94D142DC01CB019C0161 |
:10731000AD01C801B7010E94B241DC01CB01BC0143 |
:10732000CD010E943A42DC01CB019093B4078093D7 |
:10733000B30780911704A090D807B090D907C090E8 |
:10734000DA07D090DB078823A9F08091A9079091F4 |
:10735000AA07AA2797FDA095BA2FBC01CD010E94CC |
:107360005742DC01CB01A6019501BC01CD010E9471 |
:10737000D1423AC080916E0490916F04A091700444 |
:10738000B0917104BC01CD010E9457427B018C0178 |
:107390008091C8079091C907A091CA07B091CB0707 |
:1073A0009C01AD01C801B7010E94D1427B018C0153 |
:1073B0008091A9079091AA07AA2797FDA095BA2FB7 |
:1073C000BC01CD010E945742DC01CB01A601950111 |
:1073D000BC01CD010E94D142DC01CB019C01AD0179 |
:1073E000C801B7010E94B241DC01CB01BC01CD0153 |
:1073F0000E943A42DC01CB019093AA078093A9072F |
:107400008091D4079091D507AA2797FDA095BA2F10 |
:10741000BC01CD010E9457427B018C018091D807AD |
:107420009091D907A091DA07B091DB079C01AD01DB |
:10743000BC01CD010E94B241DC01CB019C01AD0138 |
:10744000C801B7010E94D1427B018C0180915A048E |
:1074500090915B04A0915C04B0915D04BC01CD01EE |
:107460000E945742DC01CB014090C8075090C907E9 |
:107470006090CA077090CB07A3019201BC01CD01B7 |
:107480000E94D142DC01CB0120E030E040E05FE32C |
:10749000BC01CD010E94D142DC01CB019C01AD01B8 |
:1074A000C801B7010E94B241DC01CB01BC01CD0192 |
:1074B0000E943A42DC01CB019093D5078093D40718 |
:1074C0008091B3079091B4079093040780930307CA |
:1074D0008091A9079091AA079093060780930507CA |
:1074E0008091B3079091B4078150904434F080E0CC |
:1074F00090E49093B4078093B3078091B307909181 |
:10750000B4078050904C34F480E090EC9093B40732 |
:107510008093B3078091A9079091AA078150904466 |
:1075200034F080E090E49093AA078093A9078091BB |
:10753000A9079091AA078050904C34F480E090EC19 |
:107540009093AA078093A9078091D4079091D507BB |
:107550008150904434F080E090E49093D50780937C |
:10756000D4078091D4079091D5078050904C34F483 |
:1075700080E090EC9093D5078093D40789819A811D |
:10758000880F991F880F991F9A83898380916907B3 |
:10759000992780FFF0C020917A0381FF0EC022332B |
:1075A00010F580911F0490912004449790931E043D |
:1075B00080931D041092360419C080916E0390913F |
:1075C0006F03820F911D20916E073327829FD00198 |
:1075D000839FB00D929FB00D1124CD0144979093DD |
:1075E0001E0480931D0481E080933604BB81BB237D |
:1075F00021F010921E0410921D0400911F0410919E |
:10760000200420911D0430911E04201731070CF036 |
:10761000B2C080913604882309F4ADC0021B130B5D |
:10762000809179039927089FF001099FF00D189F19 |
:10763000F00D1124CF01F7FD03968C0115950795E8 |
:1076400015950795E980FA80E01AF10A8701809183 |
:10765000D5039091D60397FD019695958795081BC4 |
:10766000190BC0903E04D0903F04E0904004F0908D |
:107670004104F7FE08C02FE730E040E050E0C20EC2 |
:10768000D31EE41EF51EA7E0F594E794D794C794A3 |
:10769000AA95D1F780917803282F332744275527BF |
:1076A000C701B6010E94194397FF04C0615E7F4F76 |
:1076B0008F4F9F4FF5E09595879577956795FA954C |
:1076C000D1F731E0693173071CF068E171E006C061 |
:1076D0004EEF683E740714F468EE7EEF061B170B3E |
:1076E0008091B9049091BA049C01E4E0220F331F09 |
:1076F000EA95E1F7281B390B200F311F37FF02C035 |
:10770000215F3F4F74E0359527957A95E1F73093E7 |
:10771000BA042093B90480916A07482F5527440F73 |
:10772000551F440F551F2417350794F489819A81FA |
:107730008417950724F05093BA044093B904A981A3 |
:10774000BA81A417B50724F4B093BA04A093B9047E |
:107750008091B9049091BA04E981FA81E817F90798 |
:1077600024F4F093BA04E093B904E090B904F090E3 |
:10777000BA04FA82E9823090D307832D9927880FC3 |
:10778000991F880F991F8055904009811A81801791 |
:10779000910714F49A83898329813A813093E8060A |
:1077A0002093E7068091A0049091A104A091A204E7 |
:1077B000B091A30442E0880F991FAA1FBB1F4A95EE |
:1077C000D1F78090D4079090D507881A990A213A6A |
:1077D00031058CF0C90137FD01969595879588157F |
:1077E00099050CF44C01909581959F4F8816990648 |
:1077F00094F44C0110C031E5831691041CF010E59F |
:10780000812E912C40EB84164FEF940624F4B0EBBC |
:107810008B2EBFEF9B2E232D3327220F331F220FDA |
:10782000331FC901A981BA818A1B9B0B8815990551 |
:107830000CF44C01E981FA81E21BF30B8E169F06D2 |
:107840000CF44F018091B3079091B407E0902804A5 |
:10785000F0902904FD8AEC8A8E199F099093BD0748 |
:107860008093BC0720E030E040E050E0C301B2016B |
:107870000E946142209198043091990440919A04A9 |
:1078800050919B04882309F448C0CA01B9010E94A1 |
:1078900057425B016C018091760490917704A0912E |
:1078A0007804B0917904BC01CD010E945742DC01FB |
:1078B000CB01A3019201BC01CD010E94D1427B0109 |
:1078C0008C012C893D89C901AA2797FDA095BA2F63 |
:1078D000BC01CD010E945742DC01CB019C01AD01EE |
:1078E000C801B7010E94B141DC01CB019C01AD018F |
:1078F000C601B5010E94B241DC01CB01BC01CD0142 |
:107900000E943A42DC01CB01809398049093990441 |
:10791000A0939A04B0939B0414C08091BC079091EB |
:10792000BD07AA2797FDA095BA2F280F391F4A1F18 |
:107930005B1F209398043093990440939A045093CA |
:107940009B048091980490919904A0919A04B0911D |
:107950009B0481509A4FA040B04064F080E09AEFC1 |
:10796000A0E0B0E08093980490939904A0939A04C7 |
:10797000B0939B048091980490919904A0919A04EB |
:10798000B0919B0480509640AF4FBF4F64F480E0AD |
:1079900096E0AFEFBFEF8093980490939904A09383 |
:1079A0009A04B0939B048091BC079091BD07AA27CD |
:1079B00097FDA095BA2FBC01CD010E9457427B01D3 |
:1079C0008C018091980490919904A0919A04B091AF |
:1079D0009B04BC01CD010E945742DC01CB012091E8 |
:1079E0007C0330917D0340917E0350917F03288B6F |
:1079F000398B4A8B5B8B9C01AD01688979898A89B7 |
:107A00009B890E94D142DC01CB019C01AD01C801E0 |
:107A1000B7010E94B241DC01CB01BC01CD010E9443 |
:107A20003A42DC01CB018C0120907003622D772754 |
:107A300088279927940197FE04C022273327281905 |
:107A4000390937FF02C02F5F3F4F35952795498190 |
:107A50005A81240F351F442737FD4095542F0E942B |
:107A6000194397FF04C0615C7F4F8F4F9F4FE6E043 |
:107A70009595879577956795EA95D1F79B0160175E |
:107A800071070CF48B01309521953F4F02171307B6 |
:107A90000CF4890129813A81200F311F280D391DED |
:107AA000C90137FD03969C01359527953595279596 |
:107AB00037FF03C020E030E006C0832D99278217EE |
:107AC00093070CF49C013090B507832D9927281754 |
:107AD00039070CF49C012093AB0729813A81201BC4 |
:107AE000310B280D391DC90137FD03969C013595D1 |
:107AF00027953595279537FF03C020E030E007C074 |
:107B00008091D3079927821793070CF49C01832D4A |
:107B10009927281739070CF49C012093B20780910C |
:107B2000A9079091AA07A0912604B0912704BD8BC4 |
:107B3000AC8B8A1B9B0B9093A8078093A70720E030 |
:107B400030E040E050E0C301B2010E946142209168 |
:107B50009C0430919D0440919E0450919F04882381 |
:107B600009F448C0CA01B9010E9457425B016C0187 |
:107B700080916E0490916F04A0917004B091710493 |
:107B8000BC01CD010E945742DC01CB01A30192014F |
:107B9000BC01CD010E94D1427B018C01EC89FD89A1 |
:107BA000CF01AA2797FDA095BA2FBC01CD010E9455 |
:107BB0005742DC01CB019C01AD01C801B7010E9415 |
:107BC000B141DC01CB019C01AD01C601B5010E94B0 |
:107BD000B241DC01CB01BC01CD010E943A42DC0183 |
:107BE000CB0180939C0490939D04A0939E04B0933A |
:107BF0009F0414C08091A7079091A807AA2797FD1A |
:107C0000A095BA2F280F391F4A1F5B1F20939C0491 |
:107C100030939D0440939E0450939F0480919C0454 |
:107C200090919D04A0919E04B0919F0481589E4321 |
:107C3000A040B04064F080E89EE3A0E0B0E0809314 |
:107C40009C0490939D04A0939E04B0939F04809104 |
:107C50009C0490919D04A0919E04B0919F04805833 |
:107C6000914CAF4FBF4F64F480E891ECAFEFBFEFA2 |
:107C700080939C0490939D04A0939E04B0939F04D2 |
:107C80008091A7079091A807AA2797FDA095BA2FE2 |
:107C9000BC01CD010E9457427B018C0180919C0464 |
:107CA00090919D04A0919E04B0919F04BC01CD01D0 |
:107CB0000E945742DC01CB019C01AD0168897989A2 |
:107CC0008A899B890E94D142DC01CB019C01AD01D4 |
:107CD000C801B7010E94B241DC01CB01BC01CD015A |
:107CE0000E943A42DC01CB018C01622D7727882764 |
:107CF0009927940197FE04C02227332728193909B0 |
:107D000037FF02C02F5F3F4F3595279549815A8134 |
:107D1000240F351F442737FD4095542F0E941943E7 |
:107D200097FF04C0615C7F4F8F4F9F4F26E0959572 |
:107D30008795779567952A95D1F79B01601771070D |
:107D40000CF48B01309521953F4F021713070CF46B |
:107D5000890129813A81200F311F28193909C90168 |
:107D600037FD03969C01359527953595279537FF67 |
:107D700003C020E030E007C08091D3079927821725 |
:107D800093070CF49C01832D9927281739070CF4CD |
:107D90009C012093CE0729813A81201B310B2819A1 |
:107DA0003909C90137FD03969C013595279535950D |
:107DB000279537FF03C020E030E007C08091D3074C |
:107DC0009927821793070CF49C01832D9927281774 |
:107DD00039070CF49C012093CC0765960FB6F894F4 |
:107DE000DEBF0FBECDBFDF91CF911F910F91FF90EE |
:107DF000EF90DF90CF90BF90AF909F908F907F904B |
:107E00006F905F904F903F902F9008958091E30482 |
:107E10009091E404A091E504B091E6048093DB0422 |
:107E20009093DC04A093DD04B093DE048091DF0422 |
:107E30009091E004A091E104B091E2048093D70412 |
:107E40009093D804A093D904B093DA0408951092C3 |
:107E5000EE041092ED041092EC041092EB040895DD |
:107E600084B1806A84B93D9A82E58CBD1DBC459A77 |
:107E700081E08093E3078AEA8093E70783E88093B1 |
:107E8000E8078AE08093E9071092EB071092EA076F |
:107E90001092ED071092EC07109209080895F894DB |
:107EA0008091760490917704A0917804B091790440 |
:107EB000BC01CD012CE630E040E050E00E948D4353 |
:107EC0003093EB072093EA0780916E0490916F0442 |
:107ED000A0917004B0917104BC01CD012CE630E09A |
:107EE00040E050E00E948D433093ED072093EC0773 |
:107EF0008091DD079091DE07A091DF07B091E00748 |
:107F0000BC01CD012EE036E040E050E00E948D4300 |
:107F10003093F3072093F207E0918004F0918104FD |
:107F20008091C2079091C307BF010E9458432CE083 |
:107F300030E0629FA001639F500D729F500D11248D |
:107F40005093EF074093EE078091D6079091D707A3 |
:107F5000BF010E945843629FA001639F500D729F12 |
:107F6000500D11245093F1074093F00710928104B3 |
:107F7000109280041092C3071092C2071092D70784 |
:107F80001092D6078091E90799278A30910561F010 |
:107F90008A3091050CF4A7C08B30910511F182173E |
:107FA000930709F497C09FC0809112048093FA0749 |
:107FB000809111048093FB07809110048093FC074B |
:107FC00080910F048093FD0780910E048093FE073B |
:107FD00080910D048093FF0780910C04809300082A |
:107FE00082C080916307E82FFF27EE0FFF1FEB5C35 |
:107FF000F84F0190F081E02DE038F1051CF0EFE73B |
:10800000F0E006C05FEFE138F50714F4E1E8FFEFB8 |
:10801000E093FA0780916407E82FFF27EE0FFF1F18 |
:10802000EB5CF84F0190F081E02DE038F1051CF099 |
:10803000EFE7F0E006C06FEFE138F60714F4E1E88F |
:10804000FFEFE093FB0780916207E82FFF27EE0F19 |
:10805000FF1FEB5CF84F0190F081E02DE038F10557 |
:108060001CF0EFE7F0E006C08FEFE138F80714F4FA |
:10807000E1E8FFEFE093FC0780916107E82FFF271D |
:10808000EE0FFF1FEB5CF84F0190F081E02DE03820 |
:10809000F1051CF0EFE7F0E006C02FEFE138F20742 |
:1080A00014F4E1E8FFEFE093FD0780913104809341 |
:1080B000FE0780912F048093FF0780912D04809309 |
:1080C000000880912B048093010880912A048093FA |
:1080D000020809C080913206863018F010923206EC |
:1080E00085E08093FA07789480910908882309F441 |
:1080F00056C040910B0850910C08CA0181509E4F08 |
:108100008F5F9340B0F420910D0830910E08C901A3 |
:1081100081509E4F8F5F934060F48091690785FF87 |
:1081200008C05093EE044093ED043093EC04209388 |
:10813000EB04809111089091120821E08936920792 |
:1081400024F490933D0480933C0480913C049091EE |
:108150003D0420913A0430913B04821B930B845ED2 |
:108160009D4F68E671E00E945843845B9040909375 |
:1081700039048093380480911508282F3327809183 |
:10818000C9039091CA038217930788F4809132063D |
:10819000882369F43093CA032093C9030895109289 |
:1081A000EE041092ED041092EC041092EB0408958A |
:1081B0008091E307882309F43BC0459887EE97E058 |
:1081C0009093E5078093E4079091EF04E92FFF2750 |
:1081D000EB55FC4F9F5F9093EF0480818093E907FC |
:1081E000953010F01092EF041092E3070E944F3F79 |
:1081F00081E08093E607000000000000000000001E |
:10820000000000000000000000000000000000006E |
:10821000000000000000000000000000000000005E |
:108220000000000000008091E707809306088EBDE3 |
:1082300008953091E307332309F085C00DB407FE9C |
:1082400082C084E08093C803459A2EB58091F104E2 |
:1082500099278130910589F0823091051CF4892B92 |
:1082600021F03EC00297B9F03BC03093080820933C |
:10827000F2042138A9F581E008C0253549F4809140 |
:10828000F204820F8093F20482E08093F10428C00C |
:108290003093F10425C080910808E82FFF27ED5D99 |
:1082A000F74F20838F5F809308089091F204893103 |
:1082B000A0F0291769F4AAE0B8E0E3E2F8E089E168 |
:1082C00001900D928150E1F781E08093090802C08E |
:1082D000309309081092F10403C0920F9093F204B6 |
:1082E0002091E607203208F028C0459800000000E1 |
:1082F000000000000000000000000000000000007E |
:10830000000000000000000000000000000000006D |
:10831000000000000000000000000000E091E40701 |
:10832000F091E507E20FF11D80818EBD8091060876 |
:108330009081890F8093060803C081E08093E30752 |
:108340002F5F2093E6070895FC014150504030F024 |
:1083500001900616D1F73197CF0108958827992704 |
:1083600008955058192EEFD001D0D2C0BA17620725 |
:10837000730784079507B1F188F40EF410940B2E5F |
:10838000BA2FA02D062E622F202D072E732F302DF1 |
:10839000082E842F402D092E952F502DFF27552371 |
:1083A000B9F0591B49F0573E98F0469537952795F7 |
:1083B000A795F0405395C9F776F0BA0F621F731F67 |
:1083C000841F30F4879577956795B795F04093951E |
:1083D00017FA0F2E0895BF1BBB27BA0B620B730B46 |
:1083E000840BF6CFDEF6DBC0AED001D091C05523B2 |
:1083F00059F0992369F09F575F57951B33F442F466 |
:10840000903811F4915805C09BC091589F3F09F4D2 |
:10841000C6C0BB27112462177307840730F4660FA8 |
:10842000771F881FBB1F915098F311D00F920FD068 |
:108430000F920DD0A0E82617370748071B0609F052 |
:10844000A048BA2F602D7F918F9100240895A0E855 |
:108450000024621773078407B10528F0621B730BB1 |
:10846000840BB1090A2A660F771F881FBB1FA695C8 |
:1084700081F7089597FB73D09F3738F0FEE9F91B19 |
:10848000982F872F762F6B2F05C086C096958795DE |
:1084900077956795F150D0F73EF49095809570955B |
:1084A00061957F4F8F4F9F4F0895E89403C097FBCE |
:1084B0000EF4F3DFB62F672F782F892F9EE9002463 |
:1084C00027C00ED05EF004C00BD026F001C008D04B |
:1084D00019F020F48FEF089580E0089581E0089569 |
:1084E00097FB092E052600F8689430D0E89407FC25 |
:1084F00007C0621773078407950721F008F40094FA |
:108500000794989408959A95BB0F661F771F881F4C |
:1085100011249923A1F08823B2F79F3F59F0BB0F94 |
:1085200048F421F4002011F460FF04C06F5F7F4F16 |
:108530008F4F9F4F881F9795879597F908952CC067 |
:108540009FEF80EC0895052E092607FA440F551F6A |
:108550005F3F79F0AA27A51708F051E04795880FEB |
:10856000991F9F3F31F0BB27B91708F091E087951D |
:1085700008959F919F911124E3CF97FB880F991F36 |
:108580009F3F31F0BB27B91708F091E08795089518 |
:108590009F919F911124D4CF662777278827992709 |
:1085A0000895D1DF01D0B4CF992339F0552329F0B4 |
:1085B0009F575F57950F13F49AF1F1CF91589F3F52 |
:1085C000E1F3629FA12D0F92BB27639FA00DB11D08 |
:1085D000EE27729FA00DB11DEE1FAF93AA27649FD7 |
:1085E000B00DE11D739FB00DE11DAA1F6627829F8C |
:1085F000B00DE11DA61F5527749FE00DA11D551F4D |
:10860000839FE00DA11D561F849FA00D511D852F36 |
:108610007A2F6E2F1F900F9088231AF4939539F4B8 |
:108620008FCF000C111CBB1F661F771F881F0128EE |
:108630000895629FD001739FF001829FE00DF11DAC |
:10864000649FE00DF11D929FF00D839FF00D749FCC |
:10865000F00D659FF00D9927729FB00DE11DF91F78 |
:10866000639FB00DE11DF91FBD01CF0111240895D5 |
:10867000991B79E004C0991F961708F0961B881F74 |
:108680007A95C9F780950895AA1BBB1B51E107C0D5 |
:10869000AA1FBB1FA617B70710F0A61BB70B881F92 |
:1086A000991F5A95A9F780959095BC01CD01089521 |
:1086B00097FB092E07260AD077FD04D0E5DF06D008 |
:1086C00000201AF4709561957F4F0895F6F7909504 |
:1086D00081959F4F0895A1E21A2EAA1BBB1BFD0195 |
:1086E0000DC0AA1FBB1FEE1FFF1FA217B307E40791 |
:1086F000F50720F0A21BB30BE40BF50B661F771FE9 |
:10870000881F991F1A9469F76095709580959095C8 |
:108710009B01AC01BD01CF01089597FB092E0526F1 |
:108720000ED057FD04D0D7DF0AD0001C38F4509586 |
:108730004095309521953F4F4F4F5F4F0895F6F785 |
:1087400090958095709561957F4F8F4F9F4F0895BD |
:10875000F999FECFB2BDA1BDF89A119600B4089563 |
:10876000F999FECFB2BDA1BD00BC11960FB6F89429 |
:08877000FA9AF99A0FBE089570 |
:10877800010A01496E74656772616C4E69636B200A |
:10878800202020496E74656772616C526F6C6C2092 |
:108798002020204163634E69636B20202020202025 |
:1087A800202020416363526F6C6C20202020202001 |
:1087B8002020204779726F47696572202020202089 |
:1087C800202020486F6568656E57657274202020E8 |
:1087D8002020204163635A202020202020202020B0 |
:1087E80020202047617320202020202020202020C6 |
:1087F8002020204B6F6D7061737356616C75652016 |
:108808002020205370616E6E756E67202020202016 |
:10881800202020456D7066616E6720202020202072 |
:1088280020202045727361747A6B6F6D7061737369 |
:108838002020204D6F746F725F566F726E65202016 |
:108848002020204D6F746F725F48696E74656E20CA |
:108858002020204D6F746F725F4C696E6B732020FF |
:108868002020204D6F746F725F52656368747320A7 |
:108878002020204163635F5A2020202020202020D0 |
:1088880020202044697374616E63652020202020B5 |
:108898002020204F73644261722020202020202055 |
:1088A8002020204D4B334D61672043616C53746128 |
:1088B800746520536572766F2020202020202020A8 |
:1088C8002020204E69636B2020202020202020209B |
:1088D800202020526F6C6C20202020202020202077 |
:1088E8002020202020202020202020202020202080 |
:1088F8002020202020202020202020202020202070 |
:10890800202020202020202020202020202020205F |
:10891800202020202020202020202020202020204F |
:10892800202020202020202020202020202020203F |
:10893800202020202020202020202020202020202F |
:10894800202020202020202020202020202020201F |
:108958002020204750535F4E69636B202020202041 |
:108968002020204750535F526F6C6C20202020201D |
:1089780020202064FF01FFFF010AFF03007D0000A3 |
:10898800640048616C6C6F2057656C7400000000CF |
:1089980000000000000000000000000000000000CF |
:1089A80000000000000000000000000000000000BF |
:1089B80000000000000000000000000000000000AF |
:1089C800000000000000000000000000000000009F |
:1089D80000000102030405060708090A0B01ECFF61 |
:1089E8006446640A029696403A10FB3017B7D138AD |
:1089F80090D0030090D00300F401640053706F72AC |
:108A08007400004E6F726D616C0000426567696E9C |
:0A8A18006E657200000A0B0A0B0CD9 |
:00000001FF |
/branches/V0.69k-Bus-Dietmar/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,15 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
Flight-Ctrl SW > 0.62 benötigt das Kopter-Tool >1.47 |
/branches/V0.69k-Bus-Dietmar/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 |
/branches/V0.69k-Bus-Dietmar/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V0.69k-Bus-Dietmar/Settings.h |
---|
--- branches/V0.69k-Bus-Dietmar/_Settings.h (nonexistent) |
+++ branches/V0.69k-Bus-Dietmar/_Settings.h (revision 1256) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/V0.69k-Bus-Dietmar/analog.c |
---|
0,0 → 1,155 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
// AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(StartLuftdruck - tmpLuftdruck - HoehenWert))/8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/V0.69k-Bus-Dietmar/analog.h |
---|
0,0 → 1,24 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/V0.69k-Bus-Dietmar/eeprom.c |
---|
0,0 → 1,182 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_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 = 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 = 253; // zur freien Verwendung |
EE_Parameter.UserParam2 = 100; // zur freien Verwendung |
EE_Parameter.UserParam3 = 90; // zur freien Verwendung |
EE_Parameter.UserParam4 = 90; // zur freien Verwendung |
EE_Parameter.UserParam5 = 90; // zur freien Verwendung |
EE_Parameter.UserParam6 = 90; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_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 = 253; // zur freien Verwendung |
EE_Parameter.UserParam2 = 100; // zur freien Verwendung |
EE_Parameter.UserParam3 = 90; // zur freien Verwendung |
EE_Parameter.UserParam4 = 90; // zur freien Verwendung |
EE_Parameter.UserParam5 = 90; // zur freien Verwendung |
EE_Parameter.UserParam6 = 90; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV | CFG_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 = 253; // zur freien Verwendung |
EE_Parameter.UserParam2 = 100; // zur freien Verwendung |
EE_Parameter.UserParam3 = 90; // zur freien Verwendung |
EE_Parameter.UserParam4 = 90; // zur freien Verwendung |
EE_Parameter.UserParam5 = 90; // zur freien Verwendung |
EE_Parameter.UserParam6 = 90; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/V0.69k-Bus-Dietmar/fc.c |
---|
0,0 → 1,1235 |
/*####################################################################################### |
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; |
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
volatile 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; |
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; |
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; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
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; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
//DebugOut.Analog[26] = MesswertNick; |
DebugOut.Analog[28] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
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 = (MesswertGier * Mess_IntegralNick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 4096L; |
tmpl2 = (MesswertGier * 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) |
//############################################################################ |
{ |
// 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(MOTOR_OFF || !MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
} |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static 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) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) NeueKompassRichtungMerken = 1; |
} |
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; |
} |
} |
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_UserParam8 * 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_UserParam8 > 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; else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) MaxStickRoll = abs(StickRoll)/STICK_GAIN; 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) beeptime = 100; |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = (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 > 32) || (MaxStickRoll > 32)) |
{ |
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 > 32) || (MaxStickRoll > 32) || (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++; |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) AdNeutralGier--; |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
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 = 500; |
} |
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 = 500; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
/*DebugOut.Analog[27] = ausgleichRoll; |
DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
*/ |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
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 |
{ |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
KompassStartwert = ErsatzKompass; |
KompassSignalSchlecht = 250; |
}; |
} |
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; |
if(w < 25 && NeueKompassRichtungMerken && !KompassSignalSchlecht) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w > 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
GierGyroFehler += fehler; |
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 = 250; // so lange das Signal taub stellen --> ca. 0,5 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 > 16000) SummeRoll = 16000; |
if(SummeRoll < -16000) SummeRoll = -16000; |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/V0.69k-Bus-Dietmar/fc.h |
---|
0,0 → 1,142 |
/*####################################################################################### |
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 |
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 volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
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 71 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
#endif //_FC_H |
/branches/V0.69k-Bus-Dietmar/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="fc.c"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File></Project> |
/branches/V0.69k-Bus-Dietmar/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.69k-Bus-Dietmar/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); |
/branches/V0.69k-Bus-Dietmar/main.c |
---|
0,0 → 1,279 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
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) 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; |
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 70 // 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]++; |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/V0.69k-Bus-Dietmar/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 PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define 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" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/V0.69k-Bus-Dietmar/makefile |
---|
0,0 → 1,431 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 69 |
VERSION_INDEX = 10 |
VERSION_KOMPATIBEL = 7 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
ifeq ($(VERSION_INDEX), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)g |
endif |
ifeq ($(VERSION_INDEX), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)h |
endif |
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 |
########################################################################################################## |
# 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 |
/branches/V0.69k-Bus-Dietmar/menu.c |
---|
0,0 → 1,133 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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)",MesswertGier, AdNeutralGier); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier/2); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/V0.69k-Bus-Dietmar/menu.h |
---|
0,0 → 1,6 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/branches/V0.69k-Bus-Dietmar/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/V0.69k-Bus-Dietmar/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/V0.69k-Bus-Dietmar/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/V0.69k-Bus-Dietmar/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
// if((signal > (int) Parameter_UserParam2 * 10) && (signal < 8000)) |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
// tmp = (7 * (PPM_in[index]) + signal) / 8; |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/V0.69k-Bus-Dietmar/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/V0.69k-Bus-Dietmar/spi.c |
---|
0,0 → 1,251 |
// ######################## 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_USER, 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; |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_CAL_COMPASS: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
break; |
} |
sei(); |
if (SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_CMD_OSD_DATA: |
// ToFlightCtrl.Param.Byte[0] = OsdBar; |
// ToFlightCtrl.Param.Int[1] = Distance; |
break; |
case SPI_CMD_GPS_POS: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.Longitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.Latitude; |
break; |
case SPI_CMD_GPS_TARGET: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.TargetLongitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.TargetLatitude; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/V0.69k-Bus-Dietmar/spi.h |
---|
0,0 → 1,121 |
// ######################## 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 |
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; |
//#define SPI_CMD_VALUE 0x03 |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/V0.69k-Bus-Dietmar/timer0.c |
---|
0,0 → 1,168 |
#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; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(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); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/V0.69k-Bus-Dietmar/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 int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI; |
/branches/V0.69k-Bus-Dietmar/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/V0.69k-Bus-Dietmar/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/V0.69k-Bus-Dietmar/uart.c |
---|
0,0 → 1,422 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 |
"Acc_Z ", |
"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; |
break; |
case 'c': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
DebugDataAnforderung = 1; |
PcZugriff = 255; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
PcZugriff = 255; |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
ConfirmFrame = DubWiseKeys[3]; |
PcZugriff = 255; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
while(!UebertragungAbgeschlossen); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
Kompass_Timer = SetDelay(220); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &ExternControl,sizeof(ExternControl)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / 108); // etwa in 0,1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / 108); // etwa in 0,1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w',MeineSlaveAdresse,(unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A',DebugTextAnforderung + '0',(unsigned char *) ANALOG_TEXT[DebugTextAnforderung],16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz ohne CRC bestätigen |
{ |
SendeBuffer[0] = '#'; |
SendeBuffer[1] = ConfirmFrame; |
SendeBuffer[2] = '\r'; |
UebertragungAbgeschlossen = 0; |
ConfirmFrame = 0; |
UDR = SendeBuffer[0]; |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++RemotePollDisplayLine == 4 || NurKanalAnforderung) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
RemotePollDisplayLine = -1; |
} |
else SendOutData('0' + RemotePollDisplayLine,0,(unsigned char *)&DisplayBuff[20 * RemotePollDisplayLine],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/V0.69k-Bus-Dietmar/uart.h |
---|
0,0 → 1,116 |
#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 Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/V0.69k-Bus-Dietmar/version.txt |
---|
0,0 → 1,137 |
------- |
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 |
/branches/V0.69k-Bus-Dietmar |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |