/tags/V0.66a/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/tags/V0.66a/GPS.c |
---|
0,0 → 1,30 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/tags/V0.66a/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/tags/V0.66a/Hex-Files/Flight-Ctrl_MEGA644_V0_65a.hex |
---|
0,0 → 1,1546 |
:100000000C94EE010C9409020C9409020C94090260 |
:100010000C9409020C9409020C9409020C94090234 |
:100020000C9409020C945E0B0C9409020C940902C6 |
:100030000C9409160C9409020C9409020C94090200 |
:100040000C9409020C9409020C94680A0C9409029D |
:100050000C9442040C9409020C940C040C940902B4 |
:100060000C94630C0C9409020C9433150C94090243 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A000256320000A0D3D3D3D3D3D3D3D3D3D3D2F |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D000A0D496E69742E2045455069 |
:1000D000524F4D3A2047656E6572696572652044DE |
:1000E000656661756C742D506172616D65746572C1 |
:1000F0002E2E2E000A0D42656E75747A65205061B1 |
:1001000072616D657465727361747A202564000A8A |
:100110000D4162676C65696368204C756674647232 |
:1001200075636B73656E736F722E2E004F4B0A0DE5 |
:10013000000A0D537465756572756E673A20004844 |
:10014000656164696E67486F6C64004E65757472B2 |
:10015000616C000A0A0D002E005B25695D002B2BE7 |
:10016000204D696B726F4B6F70746572202B2B0082 |
:1001700048573A5625642E25642053573A25642E55 |
:10018000256425630053657474696E673A2025649D |
:10019000200028632920486F6C67657220427573C0 |
:1001A0007300486F6568653A202020202025356956 |
:1001B00000536F6C6C486F6568653A20253569009F |
:1001C0004C756674647275636B3A20253569004F0F |
:1001D00066662020202020203A20253569004B65C6 |
:1001E000696E65200048F668656E726567656C75B6 |
:1001F0006E6700616B742E204C616765004E696309 |
:100200006B3A20202020202025356900526F6C6C2D |
:100210003A202020202020253569004B6F6D706129 |
:1002200073733A202020253569004B313A25346913 |
:1002300020204B323A25346920004B333A2534696B |
:1002400020204B343A25346920004B353A25346957 |
:1002500020204B363A25346920004B373A25346943 |
:1002600020204B383A25346920004E693A253469FC |
:100270002020526F3A253469200047733A253469AB |
:10028000202047693A253469200050313A253469E5 |
:10029000202050323A253469200050333A25346901 |
:1002A000202050343A25346920004779726F202D80 |
:1002B0002053656E736F72004E69636B202534693D |
:1002C00020282533692900526F6C6C202534692061 |
:1002D000282533692900476965722025346920285B |
:1002E0002533692900414343202D2053656E736FE8 |
:1002F00072004E69636B20253469202825336929F3 |
:1003000000526F6C6C202534692028253369290040 |
:10031000486F6368202534692028253369290053F4 |
:1003200070616E6E756E673A202025356900456DE7 |
:1003300070662E506567656C3A253569004B6F6DA8 |
:100340007061737320202020202020005269636890 |
:1003500074756E673A2020253569004D6573737793 |
:100360006572743A20202535690053746172743ABD |
:10037000202020202025356900506F7469313A20F3 |
:100380002025336900506F7469323A202025336983 |
:1003900000506F7469333A202025336900506F7420 |
:1003A00069343A202025336900536572766F202026 |
:1003B00000536574706F696E742020253369005393 |
:1003C00074656C6C756E673A202533690052616EF6 |
:1003D00067653A2533692D253369000011241FBE56 |
:1003E000CFEFD0E1DEBFCDBF11E0A0E0B1E0E0E0B3 |
:1003F000F0E602C005900D92A039B107D9F715E0DB |
:10040000A0E9B1E001C01D92A233B107E1F70C945D |
:1004100044020C940000FB01863008F085E0489F00 |
:10042000D0011124AC59BF4F842F9927019724F094 |
:100430000E94EC2F0192FACF0895282FFB018630FD |
:1004400008F025E0429FD0011124AC59BF4F842F02 |
:100450009927019724F001900E94F42FFACFA2E08F |
:10046000B0E0022E0E94F42F0895A2E0B0E09D01BA |
:100470000E94EC2F802D863028F082E0D901082ED2 |
:100480000E94F42F99270895CFEFD0E1DEBFCDBFB2 |
:1004900014B815B897EEE92E93E0F92E8EEC9FEF85 |
:1004A000E80EF91EF7FEFACF88EEE82E83E0F82E6C |
:1004B000189B02C08BE001C08AE08093000181E8B4 |
:1004C00087B98FEF88B98BE184B981E085B98EE374 |
:1004D0008AB9579A87EF8BB984B7877F84BF809199 |
:1004E00060008861809360001092600080ED97E06A |
:1004F0009093AA018093A9011092E3011092E20166 |
:100500001092AA041092A9041092E5011092E4013D |
:100510001092E7011092E601809100018A3011F4F7 |
:10052000289801C0289A0E941F0B0E94EF060E9483 |
:10053000F4150E94150C0E94FC1478941092A803E4 |
:1005400081E48093A90385E08093AA0381E690E08B |
:100550009F938F9381E490E09F938F931F921F92BC |
:10056000809100016AE00E947C2F892F99279F9338 |
:100570008F93809100010E947C2F99279F938F93E6 |
:1005800080E790E09F938F931F920E94DE078DB7C4 |
:100590009EB70D960FB6F8949EBF0FBE8DBF84EA2E |
:1005A00090E09F938F931F920E94DE07299A0F90ED |
:1005B0000F900F90C1E0D0E0DE010E94EC2F802D63 |
:1005C0008E3329F185EC90E09F938F931F920E94C8 |
:1005D000DE070E949E1C10E00F900F900F901230CB |
:1005E00011F40E94151D4AE361ED74E0812F0E9411 |
:1005F0001D021F5F163098F3A2E0B0E082E0082EE3 |
:100600000E94F42F8EE3DE01082E0E94F42F0E9438 |
:1006100035024AE361ED74E00E940B020E9435024C |
:1006200099279F938F9384EF90E09F938F931F92CE |
:100630000E94DE078091D9040F900F900F900F90C9 |
:100640000F9080FF20C08FE091E09F938F931F92C7 |
:100650000E94DE0788EE93E00E94160B7C010E9448 |
:100660001B0C0F900F900F90C7010E94450B882321 |
:10067000D9F38CE291E09F938F931F920E94DE0743 |
:100680000F900F900F900E947A18809100018A308D |
:1006900011F4289801C0289A80ED97E09093AA0160 |
:1006A0008093A90188EE93E09093A3038093A20323 |
:1006B00085E580939D0381E391E09F938F931F9243 |
:1006C0000E94DE078091D9040F900F900F9082FF57 |
:1006D00003C08FE391E002C08BE491E09F938F937E |
:1006E0001F920E94DE070F900F900F9083E591E01C |
:1006F0009F938F931F920E94DE070E945E1088E8EE |
:1007000093E190937F0180937E010F900F900F9063 |
:100710008091AD01882309F451C01092AD010E946F |
:10072000D41F0E94571C209100012A3011F42898F0 |
:1007300001C0289A80910101882319F0815080938B |
:1007400001018091E801882329F08091E80181501E |
:100750008093E80180917E0190917F01892B01F5C2 |
:1007600085E090E090937F0180937E010E941615B2 |
:1007700080910301909104018F5F9F4FF9F4809164 |
:10078000E1018823D9F080E197E29093AA01809358 |
:10079000A90180E890E090930401809303010EC0CA |
:1007A00080917E0190917F01019790937F018093CA |
:1007B0007E012A3011F4289801C0289A0E940D0762 |
:1007C0000E942C06C7010E94450B882309F4A0CF84 |
:1007D0008091E904282F332780910D0190910E011B |
:1007E000821793079CF480910301909104018F5F1D |
:1007F0009F4F61F480E797E19093AA018093A9014C |
:1008000080E093E0909304018093030184E690E0FC |
:100810000E94160B7C017CCF1F920F920FB60F9295 |
:1008200011248F939F93EF93FF938091020188236C |
:10083000E1F480919E0190919F01019690939F0118 |
:1008400080939E01FC01E159FD4FE081ED3019F0EC |
:100850008639910539F410929F0110929E0181E032 |
:1008600080930201E093C60004C010929F01109291 |
:100870009E01FF91EF919F918F910F900FBE0F906E |
:100880001F9018951F920F920FB60F9211242F935D |
:100890003F934F935F938F939F93AF93BF93EF9348 |
:1008A000FF9390E08091C600809399015091A4013C |
:1008B000563910F09093A501809199018D3009F07F |
:1008C0005FC08091A501823009F05AC09093A501C4 |
:1008D000852F99278E549C4FFC013297408120919F |
:1008E000A0013091A101241B3109DC0111978C91E9 |
:1008F000281B3109C9019F709093A1018093A00129 |
:1009000046E0969587954A95E1F7982F935C9093EA |
:10091000A2012F733070235C2093A301808198176C |
:1009200029F48C91281711F491E006C090E0809191 |
:1009300096018F5F8093960180919801882309F03A |
:100940006EC0992309F46BC081E0809398015093A5 |
:100950009501E52FFF27EE54FC4F8DE080838091B9 |
:10096000B403823509F05BC088E190E02CE00FB65B |
:10097000F894A895809360000FBE209360004FC04C |
:100980002091A501822F992781309105F9F08230BD |
:1009900091051CF4892B21F040C0029711F13DC054 |
:1009A00080919901833239F480919801882319F458 |
:1009B00081E08093A501809199018093B20381E049 |
:1009C0008093A40180919901992722C02F5F2093E1 |
:1009D000A501E52FFF27EE54FC4F809199018083FC |
:1009E00009C0E52FFF27EE54FC4F809199018083C9 |
:1009F000563920F45F5F5093A40102C01092A50104 |
:100A0000209199018091A0019091A101820F911DE7 |
:100A10009093A1018093A00102C01092A501FF91C3 |
:100A2000EF91BF91AF919F918F915F914F913F91C6 |
:100A30002F910F900FBE0F901F901895AC01A0E062 |
:100A4000B0E09D01A817B90748F4EFE6F2E0819104 |
:100A5000280F311D1196A417B507C8F33F70FD018B |
:100A6000E159FD4FC90156E0969587955A95E1F7F2 |
:100A7000835C80831196FD01E159FD4F2F73307027 |
:100A8000822F835C8083A059BD4F8DE08C931092A0 |
:100A9000020180916F028093C60008951F93CF9347 |
:100AA000DF93382FEA01722F10E083E280936F0208 |
:100AB0006093700230937102A3E0B0E0772309F4F1 |
:100AC00058C0772311F4972F07C0FE01E10FF11DE5 |
:100AD0001F5F9081715011F4472F0EC0FE01E10F8E |
:100AE000F11D1F5F4081715039F0FE01E10FF11DD2 |
:100AF0001F5F6081715001C0672FFD01E159FD4FFB |
:100B0000892F86958695835C80831196FD01E15936 |
:100B1000FD4F892F99278370907024E0880F991FCB |
:100B20002A95E1F755279A0194E0369527959A95ED |
:100B3000E1F7822B835C80831196FD01E159FD4F23 |
:100B40004F705070440F551F440F551F862F992723 |
:100B500026E0969587952A95E1F7842B835C808320 |
:100B60001196FD01E159FD4F6F73635C608311962F |
:100B7000A5CFCD010E941E05DF91CF911F91089551 |
:100B80001F93CF93DF93EC0110E0662309F460C05C |
:100B9000A22FBB271297E42FFF27EE54FC4F308182 |
:100BA0003D534F5FE42FFF27EE54FC4F50815D53C0 |
:100BB0004F5FE42FFF27EE54FC4F70817D534F5F52 |
:100BC000E42FFF27EE54FC4FE081ED534F5F842F5D |
:100BD0009927A817B907E4F1832F9927880F991F40 |
:100BE000880F991F352F32953F70382B852F992705 |
:100BF0008F709070F4E0880F991FFA95E1F7572FE6 |
:100C000056955695582B872F99278370907076E0CC |
:100C1000880F991F7A95E1F78E2B61506F3FC1F0D5 |
:100C2000FE01E10FF11D30831F5F61506F3F81F0C6 |
:100C3000FE01E10FF11D50831F5F61506F3F41F0D6 |
:100C4000FE01E10FF11D80831F5F662309F0A3CF32 |
:100C5000DF91CF911F910895CF93DF93CDB7DEB78A |
:100C600022970FB6F894DEBF0FBECDBF80919801DA |
:100C7000882309F499C08FEF809301018091B40318 |
:100C80009927813791059CF48C3691050CF06EC044 |
:100C90008736910509F444C08836910524F48336DB |
:100CA000910599F07FC088369105D9F07BC08437D3 |
:100CB000910549F18537910524F481379105A1F11A |
:100CC00071C08637910541F16DC02091950143E0D7 |
:100CD0006BE08DE993E00E94C00581E080939B0169 |
:100CE00061C02091950143E062E0CE0101960E942F |
:100CF000C0058091CB019981892B8093CB0181E044 |
:100D000080939C014FC02091950143E064E080E90D |
:100D100091E00E94C00546C081E080939A0142C0E4 |
:100D200081E080939D013EC02091950143E062E007 |
:100D3000CE0101960E94C00589818F3F61F0863007 |
:100D400010F085E089834AE361ED74E089810E94B7 |
:100D50000B02898102C00E9435022AE341ED54E072 |
:100D600060916E02855B0E944E051CC0209195012A |
:100D700043E06AE381ED94E00E94C0058091B403F2 |
:100D80004AE361ED74E08B560E941D02A2E0B0E0E0 |
:100D90008091B4038B56082E0E94F42F0E943502D6 |
:100DA0000E94BB161092980122960FB6F894DEBFEF |
:100DB0000FBECDBFDF91CF910895CF93C82F8A305A |
:100DC00019F48DE00E94DD068091C00085FFFCCF04 |
:100DD000C093C60080E090E0CF910895089588E127 |
:100DE0008093C1008091C00082608093C000809198 |
:100DF000C10080688093C1008091C10080648093AD |
:100E0000C1008AE28093C40088EC90E00E94160B37 |
:100E100090939C0380939B03089580910201882303 |
:100E200009F471C080919D01882371F080910201C5 |
:100E3000882351F02BE04DE953E060916E0287E486 |
:100E40000E944E0510929D0180919B0390919C03FE |
:100E50000E94450B882321F480919B018823B1F0E7 |
:100E600080910201882391F022E448E454E06091EB |
:100E70006E0284E40E944E0510929B0184EF91E083 |
:100E80000E94160B90939C0380939B0380919C017E |
:100E9000882339F180910201882319F10E9467109B |
:100EA00010929C013091A601832F8F5F8093A60141 |
:100EB000843059F426E145EA54E060E084E30E947E |
:100EC0004E058FEF8093A6010CC024E1829FC001E4 |
:100ED0001124815F9E4FAC0160E0832F8F5C0E94E4 |
:100EE0004E0580919A01882371F080910201882338 |
:100EF00051F02AE048EA53E060916E0286E50E94D4 |
:100F00004E0510929A010895982F80918A0481309D |
:100F100069F48091CC01E82FFF27E15FFE4F9083B9 |
:100F20008F5F8093CC0121E030E005C0892F0E94C3 |
:100F3000DD06282F3327C90108950F931F93CF9300 |
:100F4000DF938C01EB01672B39F0F80181918F0160 |
:100F50000E9484072197C9F7DF91CF911F910F91CC |
:100F600008950F931F93CF93DF938C01EB01672BB1 |
:100F700041F0F8010F5F1F4F84910E948407219771 |
:100F8000C1F7DF91CF911F910F910895CF93C82F93 |
:100F9000181634F480E20E948407C1501C16D4F362 |
:100FA000CF910895CF93C82F181634F480E30E9490 |
:100FB0008407C1501C16D4F3CF9108952F923F920D |
:100FC0004F925F926F927F928F929F92AF92BF9259 |
:100FD000CF92DF92EF92FF920F931F93CF93DF9305 |
:100FE000CDB7DEB7E0970FB6F894DEBF0FBECDBF2A |
:100FF00026968FAD26972896EEADFFAD28971CA6B6 |
:101000001DA61EA61FA680938A04A8E46A2E712C32 |
:101010006C0E7D1E5F01C50105C0053239F00894D4 |
:10102000A11CB11CF50104910023B9F7B501681B9F |
:10103000790B11F00E94B107002309F430C2089423 |
:10104000A11CB11C552458AA252C1FEF59A6F50147 |
:101050000894A11CB11C0491053721F0802F8062F7 |
:101060008837F1F450FE0EC0F30124E030E0620E48 |
:10107000731E80819181A281B3818CA79DA7AEA7A9 |
:10108000BFA70EC0F301A2E0B0E06A0E7B1E808114 |
:1010900091819C01442755272CA73DA74EA75FA708 |
:1010A000003221F489A5882391F61BC0033211F484 |
:1010B00038E081C00A3211F00D3289F40A3251F45D |
:1010C000F30142E050E0640E751E208022200CF0F7 |
:1010D000BECF219450E1552A8FED5822B8CF0B3264 |
:1010E00011F409A7B4CF0E32C1F5F5010894A11C83 |
:1010F000B11C04910A3279F4F301A2E0B0E06A0E67 |
:101100007B1E60817181BFEF6F3F7B0714F46FEF2F |
:101110007FEF162F9CCF60E070E0802F80538A30E5 |
:10112000A0F4CB01F3E0880F991FFA95E1F7860F41 |
:10113000971F680F791F600F711D60537040F50194 |
:101140000894A11CB11C0491E8CFEFEF6F3F7E071C |
:1011500014F46FEF7FEF162F7FCF003329F454FC88 |
:1011600076CFF0E25F2A73CF802F81538930D8F495 |
:1011700060E070E0CB01E3E0880F991FEA95E1F7AA |
:10118000860F971F680F791F600F711D60537040A5 |
:10119000F5010894A11CB11C0491802F80538A3062 |
:1011A00048F3262E59CF083619F424E0522A4FCF9F |
:1011B0000C3619F431E0532A4ACF033661F44E015C |
:1011C0000894811C911CF30142E050E0640E751EEE |
:1011D000808189831BC1043421F0043611F0093663 |
:1011E000B1F5043411F451E0552A50FE0AC0F30160 |
:1011F00084E090E0680E791E208131814281538124 |
:101200000CC0F30142E050E0640E751E80819181B4 |
:101210009C01442737FD4095542F2CA73DA74EA78E |
:101220005FA78CA59DA5AEA5BFA5B7FF0DC0B095C6 |
:10123000A095909581959F4FAF4FBF4F8CA79DA7CD |
:10124000AEA7BFA78DE289A77AE0472E7BC00F34F7 |
:1012500011F00F3639F40F3411F491E0592A68E097 |
:10126000462E6FC00037A1F4F301A2E0B0E06A0E91 |
:101270007B1E808191819C01442755272CA73DA787 |
:101280004EA75FA750E1452E30E4532A08E759C026 |
:101290000337C1F5F30142E050E0640E751E808013 |
:1012A00091808114910489F44E010894811C911C51 |
:1012B00088E289838EE6F401818385E78B838CE65F |
:1012C0008C838D8389E28E831F8217FD13C0812F4B |
:1012D000992787FD9095AC0160E070E0C4010E9401 |
:1012E000E82D009729F0D82ED8181D150CF090C0C5 |
:1012F000D12E8EC0F40101900020E9F73197DE2E47 |
:10130000D81886C0053511F0053739F4053511F4C4 |
:10131000F1E05F2A4AE0442E14C0083519F008377E |
:1013200009F06CC030E1432E53FE0BC02CA53DA547 |
:101330004EA55FA5211531054105510511F030E499 |
:10134000532A19A618AB17FD02C04FED542229E20B |
:10135000822E912C8C0E9D1E8CA59DA5AEA5BFA5A1 |
:101360000097A105B10521F498A9992309F43FC07C |
:10137000C42CDD24EE24FF2433242CA53DA54EA54A |
:101380005FA52C153D054E055F0510F091E0392E47 |
:101390006CA57DA58EA59FA5A70196010E94AF2FE4 |
:1013A000DC01CB01182F8A3010F4105D04C0195AEB |
:1013B000083509F41F7DD4011E934D016CA57DA550 |
:1013C0008EA59FA5A70196010E94AF2F2CA73DA730 |
:1013D0004EA75FA7332081F6B8E04B1641F453FEC9 |
:1013E00006C0103321F080E3F40182934F01CE0157 |
:1013F0000196D82ED818F8E2DF0E0BC0002309F4AE |
:101400004EC04E010894811C911C098381E0D82EA6 |
:1014100019A61D2DC8A8CD18C7FCCC2489A58823E2 |
:1014200011F01F5F02C056FC1E5F1C0DE52CFF244F |
:10143000C70180739070892B21F4822D811B0E943B |
:10144000C60789A5882329F061E070E0CE0189965E |
:1014500009C0E6FE09C080E38AA70BA762E070E03E |
:10146000CE018A960E949D07C70180739070809775 |
:1014700021F4822D811B0E94D2078C2D0E94D2075D |
:101480008D2D992787FD9095BC01C4010E949D0771 |
:10149000E4FEC1CD822D811B0E94C607BCCDE09623 |
:1014A0000FB6F894DEBF0FBECDBFDF91CF911F9175 |
:1014B0000F91FF90EF90DF90CF90BF90AF909F90F3 |
:1014C0008F907F906F905F904F903F902F900895F6 |
:1014D0001F920F920FB60F9211242F933F935F9399 |
:1014E0006F937F938F939F93AF93BF938091B0013E |
:1014F00081508093B0018F3FB9F489E08093B001AF |
:10150000809105018F5F817080930501882319F414 |
:1015100081E08093AD018091AE019091AF01019681 |
:101520009093AF018093AE018091A9019091AA019F |
:101530000297C8F08091A9019091AA010197909318 |
:10154000AA018093A9018091A9019091AA012091FB |
:1015500003013091040182239323892B11F021E0B0 |
:1015600009C020E007C020E08FEF9FEF90930401B7 |
:101570008093030180910001222331F08A3011F41D |
:101580005A9A07C0479A05C08A3011F45A9801C088 |
:1015900047988091D90483FF3BC0349B0AC0809157 |
:1015A000AB019091AC0101969093AC018093AB019B |
:1015B0002FC08091AB019091AC01892B79F0809183 |
:1015C000AB019091AC01805A9F4040F48091AB01F7 |
:1015D0009091AC019093F8018093F7018091F7010D |
:1015E0009091F8012091F5013091F601821B930B47 |
:1015F000845E9D4F68E671E00E949C2F845B904062 |
:101600009093F4018093F3011092AC011092AB011E |
:10161000BF91AF919F918F917F916F915F913F911A |
:101620002F910F900FBE0F901F9018952091AE0133 |
:101630003091AF01280F391FC901019608958AE042 |
:1016400090E00E94160B9093B2018093B10182E06A |
:1016500085BD83EA84BD17BC88E788BD96E096BD4A |
:1016600083EC8093B0009093B10080917000826011 |
:101670008093700080916E00816080936E008AE09C |
:101680008093B3001092B20008952091AE01309182 |
:10169000AF01821B930B892F9927869580749070D8 |
:1016A0000895CF93DF930E94160BEC01CE010E94A8 |
:1016B000450B8823D9F3DF91CF9108951F920F92A4 |
:1016C0000FB60F9211242F933F934F935F936F9315 |
:1016D0007F938F939F93AF93BF93CF93DF93EF93BA |
:1016E000FF93809106018150809306018F3F09F09E |
:1016F00085C083E88093B00080916C01C82FDD27FE |
:10170000D093A801C093A7018091FA046091F304DB |
:1017100080FF2AC0772788279927209125023091BA |
:101720002602409127025091280257FF04C02158F9 |
:101730003F4F4F4F5F4FA7E05595479537952795FA |
:10174000AA95D1F70E945D2F97FF04C061507E4F8C |
:101750008F4F9F4FF9E09595879577956795FA9507 |
:10176000D1F7C60FD71F29C077278827992720913F |
:10177000250230912602409127025091280257FFFE |
:1017800004C021583F4F4F4F5F4FE7E055954795B5 |
:1017900037952795EA95D1F70E945D2F97FF04C0F2 |
:1017A00061507E4F8F4F9F4F39E095958795779584 |
:1017B00067953A95D1F7C61BD70BD093A801C09374 |
:1017C000A7018091F40499272091A7013091A801E5 |
:1017D0002817390734F08091F50499278217930769 |
:1017E00024F49093A8018093A7018091A70180938E |
:1017F000B3008091F6048093060104C083E08093D7 |
:10180000B0005F98FF91EF91DF91CF91BF91AF91C1 |
:101810009F918F917F916F915F914F913F912F9108 |
:101820000F900FBE0F901F90189510927C008FEEB6 |
:1018300080937A0008950F931F93CF93DF9303E073 |
:1018400010E0D8010E94EC2F802DC82FDD27C53174 |
:10185000D10508F02A97C7BD84E690E00E94510B9D |
:1018600080910701909108018255934010F4C0E0E7 |
:10187000D0E0CA3FD105C0F4C7BD82E390E00E942A |
:10188000510B87E591E09F938F931F920E94DE0793 |
:1018900080910701909108010F900F900F9084584C |
:1018A000934010F02196E5CFD8010C2E0E94F42F22 |
:1018B000C09398048CE291E00E94510BDF91CF918C |
:1018C0001F910F9108951F920F920FB60F9211243E |
:1018D000EF92FF920F931F932F933F934F935F933A |
:1018E0006F937F938F939F93AF93BF93CF93DF9328 |
:1018F000EF93FF9310927A008091CA01682F7727A7 |
:101900008F5F8093CA016330710509F4BCC16430F4 |
:1019100071055CF46130710509F471C062307105C4 |
:101920000CF00FC1672B91F0A7C36530710509F466 |
:10193000EAC1653071050CF4C1C16630710509F466 |
:1019400008C26730710509F417C396C3609133026A |
:10195000709134028091780090917900681B790B26 |
:10196000809100018A3011F0660F771F8091C301CA |
:101970009091C401860F971F9093C4018093C30177 |
:101980008091BA018F5F8093BA019B01442737FD94 |
:101990004095542F8091010290910202A091030280 |
:1019A000B0910402820F931FA41FB51F8093010200 |
:1019B00090930202A0930302B09304028091FD0170 |
:1019C0009091FE01A091FF01B0910002820F931F40 |
:1019D000A41FB51F8093FD019093FE01A093FF010A |
:1019E000B093000281E08093C9018091B30190918E |
:1019F000B40101969093B4018093B30141C3609107 |
:101A00007800709179008091350290913602681BC0 |
:101A1000790B809100018A3011F0660F771F9B01CE |
:101A2000442737FD4095542F8091090290910A0276 |
:101A3000A0910B02B0910C02820F931FA41FB51F3F |
:101A40008093090290930A02A0930B02B0930C02B8 |
:101A50008091050290910602A0910702B0910802C0 |
:101A6000820F931FA41FB51F809305029093060257 |
:101A7000A0930702B09308028091090290910A0294 |
:101A8000A0910B02B0910C02815F9A4BA440B04030 |
:101A900064F080E393E9ABEFBFEF8093090290938A |
:101AA0000A02A0930B02B0930C028091090290915C |
:101AB0000A02A0910B02B0910C0280519544AB4FE9 |
:101AC000BF4F64F480ED9CE6A4E0B0E0809309028F |
:101AD00090930A02A0930B02B0930C0280917800BD |
:101AE000909179000F9710F468E17CEF8091780075 |
:101AF00090917900079710F460E378EF8091780077 |
:101B000090917900835F934010F068EE73E08091CC |
:101B10007800909179008A5F934010F060ED77E053 |
:101B20008091C5019091C601860F971F9093C601C1 |
:101B30008093C5018091BB018F5F8093BB0182E0E0 |
:101B4000DFC06091780070917900809137029091A8 |
:101B50003802681B790B809100018A3011F0660F02 |
:101B6000771F9B01442737FD4095542F8091110228 |
:101B700090911202A0911302B0911402820F931F50 |
:101B8000A41FB51F8093110290931202A093130219 |
:101B9000B093140280910D0290910E02A0910F0259 |
:101BA000B0911002820F931FA41FB51F80930D02E6 |
:101BB00090930E02A0930F02B09310028091110235 |
:101BC00090911202A0911302B0911402815F9A4B7E |
:101BD000A440B04064F080E393E9ABEFBFEF8093A3 |
:101BE000110290931202A0931302B09314028091F9 |
:101BF000110290911202A0911302B091140280512F |
:101C00009544AB4FBF4F64F480ED9CE6A4E0B0E098 |
:101C10008093110290931202A0931302B0931402C6 |
:101C200080917800909179000F9710F468E17CEF33 |
:101C30008091780090917900079710F460E378EF35 |
:101C40008091780090917900835F934010F068EE66 |
:101C500073E080917800909179008A5F934010F052 |
:101C600060ED77E08091C7019091C801860F971FC2 |
:101C70009093C8018093C7018091BC018F5F8093CE |
:101C8000BC0184E03DC080910D0190910E019C014A |
:101C9000220F331F280F391F80917800909179000F |
:101CA0000E94882F260F371F369527953695279542 |
:101CB00030930E0120930D0186E022C080912F0207 |
:101CC000909130022091780030917900821B930B23 |
:101CD00090938C0480938B048091C1019091C201F8 |
:101CE00020918B0430918C04820F931F9093C2013A |
:101CF0008093C1018091B8018F5F8093B80187E024 |
:101D00008093C901BDC180917800909179002091A4 |
:101D1000310230913202821B930B9093970480938F |
:101D200096048091BF019091C0012091960430915A |
:101D30009704820F931F9093C0018093BF018091FD |
:101D4000B9018F5F8093B90185E08093C90186E076 |
:101D500010C18091780090917900AA2797FDA095F5 |
:101D6000BA2FBC01CD010E949B2E7B018C0180917A |
:101D70002B0290912C02A0912D02B0912E029C0179 |
:101D8000AD01C801B7010E94F52DDC01CB01BC01FA |
:101D9000CD010E947E2EDC01CB019093BE01809389 |
:101DA000BD0180918B0490918C0480918B04909163 |
:101DB0008C0497FF03C0909581959F4F97FD0396E4 |
:101DC000AC0155954795559547958091960490910E |
:101DD0009704809196049091970497FF03C0909583 |
:101DE00081959F4F9C0197FF02C02D5F3F4F359516 |
:101DF000279535952795240F351F8091BD0190912A |
:101E0000BE01820F931F9093BE018093BD0180910C |
:101E1000BD019091BE01029724F180912B02909117 |
:101E20002C02A0912D02B0912E0220E030E048E477 |
:101E300054E4BC01CD010E94A52E88230CF044C0BF |
:101E400080912B0290912C02A0912D02B0912E0234 |
:101E50002AE037ED43EA5CE3BC01CD010E94F62D98 |
:101E600029C08091BD019091BE018F5F9F4F64F5A5 |
:101E700080912B0290912C02A0912D02B0912E0204 |
:101E800020E030E046E154E4BC01CD010E94A82EE0 |
:101E90001816D4F480912B0290912C02A0912D025F |
:101EA000B0912E022AE037ED43EA5CE3BC01CD019C |
:101EB0000E94F52DDC01CB0180932B0290932C0224 |
:101EC000A0932D02B0932E0281E08093B701809100 |
:101ED00078009091790090938E0480938D04809186 |
:101EE000BD019091BE019C01442737FD4095542FC0 |
:101EF0008091F9019091FA01A091FB01B091FC0150 |
:101F0000820F931FA41FB51F8093F9019093FA01CC |
:101F1000A093FB01B093FC012091F9013091FA01EB |
:101F20004091FB015091FC0157FF04C021503C4FF0 |
:101F30004F4F5F4F7AE055954795379527957A959E |
:101F4000D1F78091F9019091FA01A091FB01B09134 |
:101F5000FC01821B930BA40BB50B8093F9019093AA |
:101F6000FA01A093FB01B093FC0183E08093C901C7 |
:101F700087E08093CA0184C080919B0490919C0467 |
:101F80002091780030917900820F931F90939C04E8 |
:101F900080939B04809193048F5F8093930480913E |
:101FA0009304853008F468C080917800909179009E |
:101FB00090930801809307011092930480918F04FD |
:101FC0009091900420919B0430919C04821B930B70 |
:101FD0002091DF013091E001821B930B9093B601B9 |
:101FE0008093B50180919B0490919C04EC01EE27B5 |
:101FF000D7FDE095FE2F2091090130910A01409113 |
:102000000B0150910C01DA01C901880F991FAA1F19 |
:10201000BB1F820F931FA41FB51FC80FD91FEA1F34 |
:10202000FB1FF7FF03C02396E11DF11D82E0F5952C |
:10203000E795D795C7958A95D1F7C0930901D093B5 |
:102040000A01E0930B01F0930C018091090190913A |
:102050000A01A0910B01B0910C019C0180918F04A9 |
:1020600090919004821B930B9093E0018093DF0189 |
:1020700010929C0410929B041092C9011092CA0104 |
:102080008091C90180937C008FEE80937A00FF914C |
:10209000EF91DF91CF91BF91AF919F918F917F9100 |
:1020A0006F915F914F913F912F911F910F91FF90F1 |
:1020B000EF900F900FBE0F901F90189590E2EFE0F9 |
:1020C000F1E08FE49193815087FFFCCF08951F9337 |
:1020D000CF93DF938091CB0180FF0CC08091CF0123 |
:1020E000882311F0815002C0809169018093CF0153 |
:1020F0000E945E108091CB0181FF07C08091CF01CB |
:102100008F5F8093CF010E945E108091CB01992751 |
:1021100080FF04C081FF02C01092CF0181E1809353 |
:10212000CC018091CF0199279F938F9389E591E00E |
:102130009F938F9311E01F930E94DE070F900F90E3 |
:102140000F900F900F908091CF01C82FDD27C530E1 |
:10215000D10509F45DC2C630D105ACF4C230D10559 |
:1021600009F4E2C0C330D10534F4209719F1219766 |
:1021700009F472C036C4C330D10509F443C12497B1 |
:1021800009F4ABC12EC4C830D10509F442C3C9302B |
:10219000D10544F4C630D10509F4A9C2279709F442 |
:1021A00018C31FC4C930D10509F475C32A9709F4AF |
:1021B000C6C317C41092CC018EE591E09F938F9314 |
:1021C0001F930E94DE0784E18093CC010F900F9053 |
:1021D0000F9081E690E09F938F9381E490E09F932E |
:1021E0008F93DF93CF93809100016AE00E947C2F50 |
:1021F000892F99279F938F93809100010E947C2FB4 |
:1022000099279F938F9380E791E09F938F931F93DC |
:102210000E94DE0788E28093CC018DB79EB70D96B1 |
:102220000FB6F8949EBF0FBE8DBF0E94350299274E |
:102230009F938F9385E891E09F938F931F930E94C4 |
:10224000DE078CE38093CC010F900F900F900F90DE |
:102250000F9082E991E05FC08091D90480FF49C06E |
:102260001092CC018091DF019091E0019F938F93B8 |
:1022700082EA91E09F938F931F930E94DE0784E18F |
:102280008093CC010F900F900F900F900F90809142 |
:10229000DD019091DE019F938F9381EB91E09F93FD |
:1022A0008F931F930E94DE0788E28093CC010F90EA |
:1022B0000F900F900F900F9080910701909108015F |
:1022C0009F938F9380EC91E09F938F931F930E9435 |
:1022D000DE078CE38093CC010F900F900F900F904E |
:1022E0000F908091980499279F938F938FEC91E0A2 |
:1022F0001BC384E18093CC018EED91E09F938F937B |
:102300001F930E94DE0788E28093CC010F900F900C |
:102310000F9085EE91E09F938F931F930E94DE07AD |
:102320000F900F900F9062C31092CC0183EF91E059 |
:102330009F938F931F930E94DE0784E18093CC01CB |
:102340000F900F900F908091250290912602A091FE |
:102350002702B0912802B7FF04C081509C4FAF4FB5 |
:10236000BF4F3AE0B595A795979587953A95D1F7E0 |
:10237000BF93AF939F938F938DEF91E09F938F9334 |
:102380001F930E94DE0788E28093CC018DB79EB731 |
:1023900007960FB6F8949EBF0FBE8DBF80911D02A9 |
:1023A00090911E02A0911F02B0912002B7FF04C0BD |
:1023B00081509C4FAF4FBF4F2AE0B595A795979599 |
:1023C00087952A95D1F7BF93AF939F938F938CE016 |
:1023D00092E09F938F931F930E94DE078CE380937C |
:1023E000CC018DB79EB707960FB6F8949EBF0FBE6F |
:1023F0008DBF8091F7019091F8019F938F938BE1AE |
:1024000092E092C21092CC018091A9049091AA040A |
:102410009F938F938091A7049091A8049F938F938B |
:102420008AE292E09F938F931F930E94DE0784E1DC |
:102430008093CC018DB79EB707960FB6F8949EBFD8 |
:102440000FBE8DBF8091AD049091AE049F938F938A |
:102450008091AB049091AC049F938F938AE392E0B8 |
:102460009F938F931F930E94DE0788E28093CC0195 |
:102470008DB79EB707960FB6F8949EBF0FBE8DBF5F |
:102480008091B1049091B2049F938F938091AF0497 |
:102490009091B0049F938F938AE492E09F938F93DF |
:1024A0001F930E94DE078CE38093CC018DB79EB70B |
:1024B00007960FB6F8949EBF0FBE8DBF8091B504EE |
:1024C0009091B6049F938F938091B3049091B4043C |
:1024D0009F938F938AE592E076C21092CC0180910F |
:1024E000D204E82FFF27EE0FFF1FEB55FB4F808133 |
:1024F00091819F938F938091D104E82FFF27EE0F56 |
:10250000FF1FEB55FB4F808191819F938F938AE64C |
:1025100092E09F938F931F930E94DE0784E1809344 |
:10252000CC018DB79EB707960FB6F8949EBF0FBE2D |
:102530008DBF8091D404E82FFF27EE0FFF1FEB55CE |
:10254000FB4F808191819F938F938091D304E82FDB |
:10255000FF27EE0FFF1FEB55FB4F808191819F936B |
:102560008F938AE792E09F938F931F930E94DE07D9 |
:1025700088E28093CC018DB79EB707960FB6F8948A |
:102580009EBF0FBE8DBF8091D604E82FFF27EE0FB0 |
:10259000FF1FEB55FB4F808191819F938F9380911B |
:1025A000D504E82FFF27EE0FFF1FEB55FB4F80816F |
:1025B00091819F938F938AE892E09F938F931F93CB |
:1025C0000E94DE078CE38093CC018DB79EB70796FF |
:1025D0000FB6F8949EBF0FBE8DBF8091D804E82F30 |
:1025E000FF27EE0FFF1FEB55FB4F808191819F93DB |
:1025F0008F938091D704E82FFF27EE0FFF1FEB5535 |
:10260000FB4F808191819F938F938AE992E0DBC198 |
:102610001092CC018AEA92E09F938F931F930E94BD |
:10262000DE0784E18093CC010F900F900F90809192 |
:102630003702909138029F938F938091BC01282F8D |
:1026400033278091C7019091C801B9010E949C2F46 |
:102650007F936F9388EB92E09F938F931F930E94D9 |
:10266000DE0788E28093CC018DB79EB707960FB640 |
:10267000F8949EBF0FBE8DBF8091350290913602B7 |
:102680009F938F938091BB01282F33278091C501A1 |
:102690009091C601B9010E949C2F7F936F9387ECA4 |
:1026A00092E09F938F931F930E94DE078CE38093A9 |
:1026B000CC018DB79EB707960FB6F8949EBF0FBE9C |
:1026C0008DBF80913302909134029F938F938091BC |
:1026D000BA01282F33278091C3019091C401B90119 |
:1026E0000E949C2F7F936F9386ED92E06CC11092B5 |
:1026F000CC0185EE92E09F938F931F930E94DE079B |
:1027000084E18093CC010F900F900F908091310263 |
:10271000909132029F938F938091B901282F332794 |
:102720008091BF019091C001B9010E949C2F7F93BD |
:102730006F9382EF92E09F938F931F930E94DE0727 |
:1027400088E28093CC018DB79EB707960FB6F894B8 |
:102750009EBF0FBE8DBF80912F02909130029F933C |
:102760008F938091B801282F33278091C1019091D8 |
:10277000C201B9010E949C2F7F936F9381E093E087 |
:102780009F938F931F930E94DE078CE38093CC016D |
:102790008DB79EB707960FB6F8949EBF0FBE8DBF3C |
:1027A00080912B0290912C02A0912D02B0912E02CB |
:1027B000BC01CD010E947E2EDC01CB019F938F9343 |
:1027C00080918D0490918E049F938F9380E193E08C |
:1027D000FAC084E18093CC0180910D0190910E01AB |
:1027E0009F938F938FE193E09F938F931F930E940A |
:1027F000DE0788E28093CC010F900F900F900F902E |
:102800000F908091E80199279F938F938EE293E038 |
:102810008BC01092CC018DE393E09F938F931F9315 |
:102820000E94DE0784E18093CC010F900F900F90FF |
:102830008091F3019091F4019F938F938CE493E046 |
:102840009F938F931F930E94DE0788E28093CC01B1 |
:102850000F900F900F900F900F908091F701909133 |
:10286000F8019F938F938BE593E09F938F931F9332 |
:102870000E94DE078CE38093CC010F900F900F90A5 |
:102880000F900F908091F5019091F6019F938F9397 |
:102890008AE693E049C01092CC018091EF019091BB |
:1028A000F0019F938F9389E793E09F938F931F93FA |
:1028B0000E94DE0784E18093CC010F900F900F906F |
:1028C0000F900F908091ED019091EE019F938F9367 |
:1028D00085E893E09F938F931F930E94DE0788E221 |
:1028E0008093CC010F900F900F900F900F908091DC |
:1028F000EB019091EC019F938F9381E993E09F937B |
:102900008F931F930E94DE078CE38093CC010F907E |
:102910000F900F900F900F908091E9019091EA0134 |
:102920009F938F938DE993E09F938F931F930E94C2 |
:10293000DE070F900F900F900F900F9057C01092DE |
:10294000CC0189EA93E09F938F931F930E94DE0747 |
:1029500084E18093CC010F900F900F9080916C01D7 |
:1029600099279F938F9381EB93E09F938F931F936E |
:102970000E94DE0788E28093CC010F900F900F90A9 |
:102980000F900F908091A7019091A8019F938F9332 |
:102990008FEB93E09F938F931F930E94DE078CE34E |
:1029A0008093CC010F900F900F900F900F9080911B |
:1029B000F50499279F938F938091F40499279F930F |
:1029C0008F938DEC93E09F938F931F930E94DE076C |
:1029D0008DB79EB707960FB6F8949EBF0FBE8DBFFA |
:1029E00005C08150809369011092CF011092CB01F4 |
:1029F000DF91CF911F9108951092B9008AE28093E0 |
:102A0000B800089585EA8093BC0080E090E00895C6 |
:102A100084E98093BC0008951092B9008093BB00B4 |
:102A200085E88093BC0080E090E008950E9408153E |
:102A30001092D2018091BB001092D10180E8809366 |
:102A4000BC001092BD001092BA001092BB00109210 |
:102A5000B9001092B8000E94FC140E94021580E098 |
:102A60000E940C1508951F920F920FB60F92112419 |
:102A70002F933F934F935F936F937F938F939F9386 |
:102A8000AF93BF93EF93FF938091D201282F332709 |
:102A90008F5F8093D2012330310509F446C0243082 |
:102AA00031054CF421303105D1F0223031057CF56F |
:102AB000232B81F083C025303105E1F1253031052C |
:102AC0000CF441C026303105F1F12730310509F40D |
:102AD0005AC074C08091D101880F8E5A51C0809124 |
:102AE000D101282F33278F5F8093D1012130310509 |
:102AF00009F43EC0223031051CF4232BB1F15EC035 |
:102B000022303105C1F123303105C1F157C00E9497 |
:102B100008158091D101843018F41092D20102C0BE |
:102B20001092D1010E94021549C08091D001880FF6 |
:102B30008D5A26C08091D001E82FFF27E356FB4F26 |
:102B40008091BB0080838091D001992781309105CD |
:102B500079F0823091051CF4892B39F02FC0823036 |
:102B6000910549F0039751F029C080910F0508C0E5 |
:102B70008091100505C080911C0502C080911E0542 |
:102B80000E940C151BC09091D001E92FFF27E3563E |
:102B9000FB4F8091BB008483892F8F5F8093D0018E |
:102BA000843010F01092D0010E9408158AE090E065 |
:102BB00090937F0180937E011092D2018091BC009E |
:102BC00080688093BC00FF91EF91BF91AF919F917E |
:102BD0008F917F916F915F914F913F912F910F90C6 |
:102BE0000FBE0F901F90189583EC80938100809109 |
:102BF0006F00806280936F00109234021092330253 |
:102C0000109236021092350210923802109237025A |
:102C100008951F920F920FB60F9211242F933F9396 |
:102C20004F935F936F937F938F939F93AF93BF93D4 |
:102C3000EF93FF9340918600509187008091D301DC |
:102C40009091D401481B590B809186009091870088 |
:102C50009093D4018093D301CA018D5D9540835632 |
:102C6000994148F481E090E09093D6018093D5019A |
:102C700010926A016FC02091D5013091D6012A309F |
:102C800031050CF067C0CA018B5F9040845B9140B6 |
:102C900008F043C0425D5140F901E20FF31FEB55CC |
:102CA000FB4F80819181BA01681B790BCB0177FFC3 |
:102CB00003C0909581959F4F06974CF48091E80151 |
:102CC000883C28F48091E801865F8093E801F9014F |
:102CD000E20FF31FDF01AB55BB4F8D919C91119714 |
:102CE0009C01220F331F280F391F240F351F37FF78 |
:102CF00002C02D5F3F4FC9019595879595958795A2 |
:102D0000E554FB4F2D913C911197AC01421B530BA5 |
:102D10005183408311969C938E938091D50190911D |
:102D2000D60101969093D6018093D501059711F4B1 |
:102D30005D9A01C05D988091D5019091D601863051 |
:102D4000910511F45C9A01C05C98079711F45B9AA5 |
:102D500001C05B98FF91EF91BF91AF919F918F91CF |
:102D60007F916F915F914F913F912F910F900FBE87 |
:102D70000F901F901895CF93C82FC150CF3F81F06F |
:102D80008091E101882361F484E690E09093AA01A8 |
:102D90008093A9018AEF90E00E94510BC15080F707 |
:102DA000CF91089510927A008091BC01882379F028 |
:102DB0008091BC01282F33278091C7019091C801D1 |
:102DC000B9010E949C2F70931205609311058091A8 |
:102DD000BB01882379F08091BB01282F3327809194 |
:102DE000C5019091C601B9010E949C2F70930E05F8 |
:102DF00060930D058091BA01882379F08091BA0122 |
:102E0000282F33278091C3019091C401B9010E94FA |
:102E10009C2F70932505609324058091B901882328 |
:102E2000E1F08091BF019091C001AA2797FDA09584 |
:102E3000BA2F34E0880F991FAA1FBB1F3A95D1F70C |
:102E40002091B901332744275527BC01CD010E94A9 |
:102E5000D12F30932205209321058091B80188233A |
:102E6000E1F08091C1019091C201AA2797FDA09540 |
:102E7000BA2F24E0880F991FAA1FBB1F2A95D1F7EC |
:102E80002091B801332744275527BC01CD010E946A |
:102E9000D12F30932C0520932B058091B7018823E7 |
:102EA000A9F08091BD019091BE01AA2797FDA09540 |
:102EB000BA2F2091B701332744275527BC01CD01F4 |
:102EC0000E94D12F30931505209314051092C8014C |
:102ED0001092C7011092BC011092C6011092C50158 |
:102EE0001092BB011092C4011092C3011092BA015A |
:102EF0001092C2011092C1011092B8011092C0014B |
:102F00001092BF011092B9011092BE011092BD0142 |
:102F10001092B7018FEE80937A008091D504E82F4C |
:102F2000FF27EE0FFF1FEB55FB4F808191818259E8 |
:102F30009F4F2091EF013091F001281739071CF4C1 |
:102F40002F5F3F4F0CC08081918182599F4F821724 |
:102F500093074CF42115310531F021503040309366 |
:102F6000F0012093EF018091D604E82FFF27EE0FA8 |
:102F7000FF1FEB55FB4F8081918182599F4F20911C |
:102F8000ED013091EE01281739071CF42F5F3F4FF8 |
:102F90000CC08081918182599F4F821793074CF416 |
:102FA0002115310531F0215030403093EE0120934E |
:102FB000ED018091D704E82FFF27EE0FFF1FEB559F |
:102FC000FB4F8081918182599F4F2091EB0130917D |
:102FD000EC01281739071CF42F5F3F4F0CC080818C |
:102FE000918182599F4F821793074CF42115310527 |
:102FF00031F0215030403093EC012093EB0180916F |
:10300000D804E82FFF27EE0FFF1FEB55FB4F808101 |
:10301000918182599F4F2091E9013091EA0128174F |
:1030200039071CF42F5F3F4F0CC08081918182597A |
:103030009F4F821793074CF42115310531F0215031 |
:1030400030403093EA012093E9018091EF019091A3 |
:10305000F00197FF05C01092F0011092EF010AC035 |
:103060008F3F910539F034F08FEF90E09093F001AD |
:103070008093EF018091ED019091EE0197FF05C0E3 |
:103080001092EE011092ED010AC08F3F910539F0C8 |
:1030900034F08FEF90E09093EE018093ED018091FA |
:1030A000EB019091EC0197FF05C01092EC0110929A |
:1030B000EB010AC08F3F910539F034F08FEF90E0BB |
:1030C0009093EC018093EB018091E9019091EA01EA |
:1030D00097FF05C01092EA011092E90108958F3F11 |
:1030E000910539F034F08FEF90E09093EA018093EE |
:1030F000E9010895CF93DF931092320210923102CA |
:103100001092300210922F0280E090E0A0E0B0E038 |
:1031100080932B0290932C02A0932D02B0932E0249 |
:103120001092380210923702109236021092350235 |
:1031300010923402109233020E94D21685E090E081 |
:103140000E94160BEC01CE010E94450B8823D9F397 |
:103150000E94D2168091D90480FF10C0809107018F |
:1031600090910801875B934038F48091070190911A |
:1031700008018E5E924010F40E941B0C80910001A9 |
:103180008A3081F580911105909112058091110589 |
:103190009091120597FF03C0909581959F4F909352 |
:1031A00038028093370280910D0590910E05809131 |
:1031B0000D0590910E0597FF03C0909581959F4F47 |
:1031C00090933602809335028091240590912505D5 |
:1031D000809124059091250597FF3FC0909581959A |
:1031E0009F4F3BC080911105909112058091110570 |
:1031F0009091120597FF03C0909581959F4F97FD81 |
:103200000196959587959093380280933702809127 |
:103210000D0590910E0580910D0590910E0597FF7B |
:1032200003C0909581959F4F97FD01969595879541 |
:103230009093360280933502809124059091250564 |
:10324000809124059091250597FF03C09095819565 |
:103250009F4F97FD019695958795909334028093A3 |
:10326000330280912B0590912C0580912B05909134 |
:103270002C0597FF03C0909581959F4F97FD0F9662 |
:1032800054E0959587955A95E1F790933002809395 |
:103290002F02809121059091220580912105909126 |
:1032A000220597FF03C0909581959F4F97FD0F963C |
:1032B00044E0959587954A95E1F790933202809383 |
:1032C000310280918D0490918E04AA2797FDA095DC |
:1032D000BA2FBC01CD010E949B2EDC01CB01809353 |
:1032E0002B0290932C02A0932D02B0932E021092E9 |
:1032F00011021092120210921302109214021092F4 |
:103300000D0210920E0210920F02109210021092F3 |
:10331000090210920A0210920B0210920C021092F3 |
:1033200005021092060210920702109208021092F3 |
:1033300001021092020210920302109204021092F3 |
:1033400012051092110510920E0510920D051092A3 |
:103350002505109224058091090190910A01A09100 |
:103360000B01B0910C019093900480938F04109204 |
:10337000B6011092B5011092F9011092FA01109263 |
:10338000FB011092FC018091F7019091F80190935C |
:10339000F6018093F5010E94BE2D82E390E09093A8 |
:1033A000AA018093A901DF91CF910895EF92FF9236 |
:1033B0000F931F9310927A008091BC01882379F0BB |
:1033C0008091BC01282F33278091C7019091C801BB |
:1033D000B9010E949C2F7093120560931105809192 |
:1033E000BB01882379F08091BB01282F332780917E |
:1033F000C5019091C601B9010E949C2F70930E05E2 |
:1034000060930D058091BA01882379F08091BA010B |
:10341000282F33278091C3019091C401B9010E94E4 |
:103420009C2F70932505609324058091B901882312 |
:1034300009F446C08091210590912205AA2797FDA5 |
:10344000A095BA2F7C018D01E3E0EE0CFF1C001F5C |
:10345000111FEA95D1F7E81AF90A0A0B1B0B8091A4 |
:10346000BF019091C001AA2797FDA095BA2F74E0E3 |
:10347000880F991FAA1FBB1F7A95D1F72091B90118 |
:10348000332744275527BC01CD010E94D12FE20EDE |
:10349000F31E041F151F17FF08C087E090E0A0E08F |
:1034A000B0E0E80EF91E0A1F1B1F63E01595079593 |
:1034B000F794E7946A95D1F7F0922205E0922105FE |
:1034C0008091B801882309F446C080912B05909122 |
:1034D0002C05AA2797FDA095BA2F7C018D0153E0FA |
:1034E000EE0CFF1C001F111F5A95D1F7E81AF90ABC |
:1034F0000A0B1B0B8091C1019091C201AA2797FD75 |
:10350000A095BA2F44E0880F991FAA1FBB1F4A95A8 |
:10351000D1F72091B801332744275527BC01CD01AD |
:103520000E94D12FE20EF31E041F151F17FF08C0C3 |
:1035300087E090E0A0E0B0E0E80EF91E0A1F1B1F34 |
:1035400033E015950795F794E7943A95D1F7F09203 |
:103550002C05E0922B058091B701882309F43FC028 |
:103560008091140590911505AA2797FDA095BA2F73 |
:103570007C018D0123E0EE0CFF1C001F111F2A951A |
:10358000D1F7E81AF90A0A0B1B0B8091BD01909143 |
:10359000BE01AA2797FDA095BA2F2091B701332726 |
:1035A00044275527BC01CD010E94D12FE20EF31E06 |
:1035B000041F151F17FF08C087E090E0A0E0B0E0EF |
:1035C000E80EF91E0A1F1B1FF3E015950795F794E7 |
:1035D000E794FA95D1F7F0921505E0921405109250 |
:1035E000C8011092C7011092BC011092C60110923E |
:1035F000C5011092BB011092C4011092C301109238 |
:10360000BA011092C2011092C1011092B801109239 |
:10361000C0011092BF011092B9011092BE01109228 |
:10362000BD011092B7018091010290910202A09118 |
:103630000302B09104028093150290931602A093A6 |
:103640001702B09318028091110290911202A0917A |
:103650001302B09114028093250290932602A09346 |
:103660002702B09328028091090290910A02A0914A |
:103670000B02B0910C0280931D0290931E02A09346 |
:103680001F02B093200280910D0290910E02A09132 |
:103690000F02B09110028093210290932202A09316 |
:1036A0002302B09324028091050290910602A0911A |
:1036B0000702B09108028093190290931A02A09316 |
:1036C0001B02B0931C028FEE80937A008091D50488 |
:1036D000E82FFF27EE0FFF1FEB55FB4F80819181F5 |
:1036E00082599F4F2091EF013091F001281739073F |
:1036F0001CF42F5F3F4F0CC08081918182599F4FF6 |
:10370000821793074CF42115310531F021503040D8 |
:103710003093F0012093EF018091D604E82FFF272A |
:10372000EE0FFF1FEB55FB4F8081918182599F4F18 |
:103730002091ED013091EE01281739071CF42F5F1D |
:103740003F4F0CC08081918182599F4F8217930710 |
:103750004CF42115310531F0215030403093EE0109 |
:103760002093ED018091D704E82FFF27EE0FFF1F74 |
:10377000EB55FB4F8081918182599F4F2091EB0146 |
:103780003091EC01281739071CF42F5F3F4F0CC014 |
:103790008081918182599F4F821793074CF42115A4 |
:1037A000310531F0215030403093EC012093EB0192 |
:1037B0008091D804E82FFF27EE0FFF1FEB55FB4F3A |
:1037C0008081918182599F4F2091E9013091EA01D6 |
:1037D000281739071CF42F5F3F4F0CC0808191815F |
:1037E00082599F4F821793074CF42115310531F010 |
:1037F000215030403093EA012093E9018091EF019C |
:103800009091F00197FF05C01092F0011092EF0126 |
:103810000AC08F3F910539F034F08FEF90E090931C |
:10382000F0018093EF018091ED019091EE0197FFFF |
:1038300005C01092EE011092ED010AC08F3F910574 |
:1038400039F034F08FEF90E09093EE018093ED012A |
:103850008091EB019091EC0197FF05C01092EC0173 |
:103860001092EB010AC08F3F910539F034F08FEFD1 |
:1038700090E09093EC018093EB018091E9019091AD |
:10388000EA0197FF05C01092EA011092E9010AC00F |
:103890008F3F910539F034F08FEF90E09093EA017B |
:1038A0008093E9011F910F91FF90EF90089580910F |
:1038B000E101882301F58093100580930F05809323 |
:1038C0001C0580931E0580919001882311F0809340 |
:1038D0000F0580919101882311F08093100580914C |
:1038E0009201882311F080931E0580919301882313 |
:1038F00011F080931C0580910F0599279093630424 |
:1039000080936204809110059927909365048093B9 |
:10391000640480911E059927909367048093660440 |
:1039200080911C05992790936904809368041092F4 |
:10393000D2011092D1010E940215089581E0809376 |
:10394000D10482E08093D20483E08093D30494E096 |
:103950009093D40445E04093D50486E08093D60448 |
:1039600087E08093D70438E03093D8041092D904CC |
:103970008EE18093DA048BEF8093DC048AE08093FD |
:10398000DD0422E32093DB042093DF049093DE0424 |
:103990009093E0043093E10480E18093E2048FE0AF |
:1039A0008093E3048AEF8093E4048AE18093E50442 |
:1039B00080E88093E60488E78093E70496E9909393 |
:1039C000E8048EE58093E90483E28093EA0484E1CD |
:1039D0008093EB041092EC041092ED041092EE042C |
:1039E0001092EF041092F0041092F10484E6809398 |
:1039F000F20488E28093F3041092FA042093F40412 |
:103A00009093F5044093F6042093F7048AE580939D |
:103A1000F8041092F904AFEFB4E0E0E8F1E08CE0D4 |
:103A200001900D928150E1F7089581E08093D104D7 |
:103A300032E03093D20483E08093D30424E02093D7 |
:103A4000D40445E04093D50486E08093D60487E013 |
:103A50008093D70488E08093D8041092D9048EE133 |
:103A60008093DA048BEF8093DC048AE08093DD049A |
:103A700092E39093DB049093DF043093DE04209371 |
:103A8000E0041092E10480E18093E2048FE08093EF |
:103A9000E3048AEF8093E4048AE18093E50480E8FC |
:103AA0008093E6048FEA8093E7048093E8048EE530 |
:103AB0008093E90483E28093EA0484E18093EB0439 |
:103AC0001092EC041092ED041092EE041092EF04A8 |
:103AD0001092F0041092F10484E68093F20488E2DC |
:103AE0008093F3041092FA049093F40486E980938F |
:103AF000F5044093F6049093F7048AE58093F80464 |
:103B00001092F904AFEFB4E0E7E8F1E08CE0019047 |
:103B10000D928150E1F708951F938091DC048B3F53 |
:103B200098F08B3F19F48091EF010EC08C3F19F48F |
:103B30008091ED0109C08D3F19F48091EB0104C023 |
:103B40008E3F21F48091E90180937401809174018A |
:103B5000882321F08F3F11F4809374018091DB045E |
:103B60008B3F98F08B3F19F48091EF010EC08C3F92 |
:103B700019F48091ED0109C08D3F19F48091EB019A |
:103B800004C08E3F21F48091E901809375018091FA |
:103B90007501882329F0843618F084E68093750136 |
:103BA0008091DD048B3F98F08B3F19F48091EF01F9 |
:103BB0000EC08C3F19F48091ED0109C08D3F19F4BE |
:103BC0008091EB0104C08E3F21F48091E901809344 |
:103BD000730180917301882329F0843618F084E6FC |
:103BE000809373018091DF048B3F98F08B3F19F431 |
:103BF0008091EF010EC08C3F19F48091ED0109C056 |
:103C00008D3F19F48091EB0104C08E3F21F4809127 |
:103C1000E9018093720180917201882321F08F3F26 |
:103C200011F4809372018091E6048B3F98F08B3FF2 |
:103C300019F48091EF010EC08C3F19F48091ED01D1 |
:103C400009C08D3F19F48091EB0104C08E3F21F42F |
:103C50008091E9018093710180917101882321F0A5 |
:103C60008F3F11F4809371018091E7048B3F98F0AE |
:103C70008B3F19F48091EF010EC08C3F19F48091B5 |
:103C8000ED0109C08D3F19F48091EB0104C08E3F16 |
:103C900021F48091E90180937001809170018B3053 |
:103CA00010F48AE002C08F3F11F48093700180917C |
:103CB000E8048B3F98F08B3F19F48091EF010EC020 |
:103CC0008C3F19F48091ED0109C08D3F19F480916A |
:103CD000EB0104C08E3F21F48091E90180936F01D4 |
:103CE00080916F01882321F08F3F11F480936F0141 |
:103CF0008091ED048B3F98F08B3F19F48091EF0198 |
:103D00000EC08C3F19F48091ED0109C08D3F19F46C |
:103D10008091EB0104C08E3F21F48091E9018093F2 |
:103D20006D0180916D01882321F08F3F11F4809304 |
:103D30006D018091EE048B3F98F08B3F19F48091D8 |
:103D4000EF010EC08C3F19F48091ED0109C08D3F49 |
:103D500019F48091EB0104C08E3F21F48091E901B8 |
:103D60008093DA018091DA01882321F08F3F11F4EA |
:103D70008093DA018091EF048B3F98F08B3F19F428 |
:103D80008091EF010EC08C3F19F48091ED0109C0C4 |
:103D90008D3F19F48091EB0104C08E3F21F4809196 |
:103DA000E9018093D9018091D901882321F08F3FC7 |
:103DB00011F48093D9018091F0048B3F98F08B3FF0 |
:103DC00019F48091EF010EC08C3F19F48091ED0140 |
:103DD00009C08D3F19F48091EB0104C08E3F21F49E |
:103DE0008091E9018093D8018091D801882321F046 |
:103DF0008F3F11F48093D8018091F1048B3F98F0AC |
:103E00008B3F19F48091EF010EC08C3F19F4809123 |
:103E1000ED0109C08D3F19F48091EB0104C08E3F84 |
:103E200021F48091E9018093D7018091D701882303 |
:103E300021F08F3F11F48093D7019091F2049B3FC2 |
:103E4000B0F09B3F19F48091EF010EC09C3F19F434 |
:103E50008091ED0109C09D3F19F48091EB0104C0F0 |
:103E60009E3F39F48091E90180936C0102C09093E8 |
:103E70006C0180916C01882321F08F3F11F48093B5 |
:103E80006C019B3FB0F09B3F19F48091EF010EC095 |
:103E90009C3F19F48091ED0109C09D3F19F4809178 |
:103EA000EB0104C09E3F39F48091E90180936C01DD |
:103EB00002C090936C0180916C01882321F08F3FA8 |
:103EC00011F480936C019B3FB0F09B3F19F48091FB |
:103ED000EF010EC09C3F19F48091ED0109C09D3F98 |
:103EE00019F48091EB0104C09E3F39F48091E901FF |
:103EF00080936C0102C090936C0180916C018823C7 |
:103F000021F08F3F11F480936C018091F7048B3F77 |
:103F100098F08B3F19F48091EF010EC08C3F19F49B |
:103F20008091ED0109C08D3F19F48091EB0104C02F |
:103F30008E3F21F48091E90180936B0180916B01A8 |
:103F4000882321F08F3F11F480936B0110916D0154 |
:103F5000812F992787FD9095A92FB92FBC01CD01FD |
:103F60000E949B2E17FF06C020E030E040E853E49B |
:103F70000E94F62D27E137EB41ED58E30E94152F03 |
:103F8000DC01CB018093760190937701A0937801B7 |
:103F9000B09379018091E404809323058091E30438 |
:103FA000809313051F9108953F924F925F926F92F5 |
:103FB0007F928F929F92AF92BF92CF92DF92EF92B9 |
:103FC000FF920F931F93CF93DF930E94D619299AE4 |
:103FD0008091D304E82FFF27EE0FFF1FEB55FB4F17 |
:103FE0008080918028E730E0820E931E97FE02C009 |
:103FF000882499248091E801843608F05EC080917D |
:104000000101882399F480910301909104018F5F4D |
:104010009F4F61F488E99AE39093AA018093A901E4 |
:1040200080E09CE0909304018093030180914D0215 |
:1040300090914E02009731F0019790934E02809339 |
:104040004D0204C01092E1011092F2018091000132 |
:104050008A3011F4289A01C02898809152029091D8 |
:104060005302815D974030F18091EA04882E9924B3 |
:1040700081E08093F2018091D104E82FFF27EE0FB9 |
:10408000FF1FEB55FB4F118210828091D204E82F65 |
:10409000FF27EE0FFF1FEB55FB4F1182108280911F |
:1040A000D404E82FFF27EE0FFF1FEB55FB4F1182C3 |
:1040B0001082E0C11092E101DDC18091E8018D38EC |
:1040C00008F4D8C11092F2019091EB0482E3989F1A |
:1040D000C001112490934E0280934D0259E285163F |
:1040E00091046CF080915202909153026FEF8F3FD8 |
:1040F000960729F001969093530280935202809183 |
:10410000520290915302883C910520F078E2871684 |
:10411000910404F51092390210923A0210923B0277 |
:1041200010923C0210923D0210923E0210923F0209 |
:1041300010924002109201021092020210920302A9 |
:10414000109204021092FD011092FE011092FF01E4 |
:104150001092000289EC881691040CF4EBC02091B7 |
:10416000E101222309F0E6C08091D404E82FFF2763 |
:10417000EE0FFF1FEB55FB4F808191818C34910531 |
:104180000CF4D6C080914F028F5F80934F02893C20 |
:1041900008F4D0C0299820934F0210925302109235 |
:1041A00052023091D104E32FFF27EE0FFF1FEB5592 |
:1041B000FB4F8081918187349105B4F48091D204C2 |
:1041C000E82FFF27EE0FFF1FEB55FB4F80819181FA |
:1041D0000190F081E02DF7FF03C0F095E195FF4FCE |
:1041E000E734F1050CF482C02091D204E22FFF27BE |
:1041F000EE0FFF1FEB55FB4F8081918187349105B6 |
:1042000064F0E32FFF27EE0FFF1FEB55FB4F80817C |
:104210009181863491050CF4C1E0E22FFF27EE0F67 |
:10422000FF1FEB55FB4F808191818734910574F01E |
:104230008091D104E82FFF27EE0FFF1FEB55FB4FB6 |
:1042400080819181873491050CF0C2E0E22FFF2735 |
:10425000EE0FFF1FEB55FB4F808191818634910556 |
:1042600074F48091D104E82FFF27EE0FFF1FEB5568 |
:10427000FB4F80819181873491050CF0C3E0E22FE0 |
:10428000FF27EE0FFF1FEB55FB4F808191818A5B6B |
:104290009F4F74F48091D104E82FFF27EE0FFF1F8A |
:1042A000EB55FB4F80819181873491050CF0C4E080 |
:1042B000E22FFF27EE0FFF1FEB55FB4F808191810F |
:1042C0008A5B9F4F74F48091D104E82FFF27EE0F93 |
:1042D000FF1FEB55FB4F80819181863491050CF4D3 |
:1042E000C5E0A2E0B0E00C2E0E94F42F8091D9042A |
:1042F00080FF10C08091070190910801875B934077 |
:1043000038F480910701909108018E5E924010F47C |
:104310000E941B0C0E9435024AE361ED74E00E948A |
:104320000B020E947A180E9435020E94BB1602C03E |
:1043300020934F0273E2871691040CF09BC02091EA |
:10434000D404E22FFF27EE0FFF1FEB55FB4F8081B8 |
:104350009181855B9F4F0CF06DC0809150028F5F03 |
:1043600080935002893C08F467C088EC8093500227 |
:1043700081E090E0909353028093520281E0809319 |
:10438000E1011092410210924202109243021092F7 |
:104390004402109201021092020210920302109243 |
:1043A00004021092FD011092FE011092FF01109282 |
:1043B0000002109211021092120210921302109237 |
:1043C00014021092090210920A0210920B0210922B |
:1043D0000C028091250290912602A0912702B091B3 |
:1043E000280280930D0290930E02A0930F02B093C7 |
:1043F000100280911D0290911E02A0911F02B091A7 |
:1044000020028093050290930602A0930702B093C6 |
:1044100008021092390210923A0210923B02109256 |
:104420003C0210923D0210923E0210923F02109206 |
:10443000400202C010925002E22FFF27EE0FFF1F32 |
:10444000EB55FB4F808191818C3491058CF08091EC |
:1044500051028F5F80935102893C60F01092E1011C |
:1044600088EC80935102109253021092520202C0C3 |
:104470001092510280916A01815080936A0180916B |
:104480006A018F3F29F08091F201882309F4AAC1C3 |
:104490000E948C1D8091D104E82FFF27EE0FFF1F93 |
:1044A000DF01AB55BB4F0091E004C02FDD278D919C |
:1044B0009C918C9F50018D9FB00C9C9FB00C11243F |
:1044C000E554FB4F8091E104482F5527808191816D |
:1044D000849FB001859F700D949F700D1124A60ECE |
:1044E000B71EB092E701A092E6018091D204E82FB6 |
:1044F000FF27EE0FFF1FDF01AB55BB4F8D919C9146 |
:104500008C9F90018D9F300D9C9F300D1124E554A0 |
:10451000FB4F80819181849FB001859F700D949F96 |
:10452000700D1124260F371F3093E5012093E4010D |
:104530008091D404E82FFF27EE0FFF1FEB55FB4FB0 |
:1045400080819181909581959F4F9093E301809315 |
:10455000E20110917001812F992787FD9095A92F75 |
:10456000B92FBC01CD010E949B2E17FF06C020E091 |
:1045700030E040E853E40E94F62D20E030E040E2D5 |
:1045800051E40E94F62DDC01CB0120E030E040E850 |
:104590005BE3BC01CD010E94152F6B017C01609390 |
:1045A000260570932705809328059093290510917F |
:1045B0006F01812F992787FD9095A92FB92FBC01F5 |
:1045C000CD010E949B2E17FF06C020E030E040E89E |
:1045D00053E40E94F62D20E030EE4BE257E40E94B7 |
:1045E000382EDC01CB018093180590931905A09318 |
:1045F0001A05B0931B058091D90482FF0CC080E09E |
:1046000090E0A0E0B0E08093180590931905A09386 |
:104610001A05B0931B0520E030E040E050E0C701F0 |
:10462000B6010E94A52E882364F480E090E0A0E00B |
:10463000B0E08093260590932705A0932805B093BA |
:1046400029058091180590911905A0911A05B0913E |
:104650001B0520E030E040E050E0BC01CD010E94AD |
:10466000A52E882364F480E090E0A0E0B0E0809381 |
:10467000180590931905A0931A05B0931B05809116 |
:10468000F904992782FDAEC083FDACC0809125025C |
:1046900090912602A0912702B091280281569A4E4D |
:1046A000A040B040DCF0CE0123E0880F991F2A958E |
:1046B000E1F79501281B390B3093E7012093E601C0 |
:1046C0008091250290912602A0912702B0912802A4 |
:1046D00081589843A140B04094F126C080912502B2 |
:1046E00090912602A0912702B0912802805A95410C |
:1046F000AF4FBF4F24F59E0193E0220F331F9A95D1 |
:10470000E1F72A0D3B1D3093E7012093E6018091EC |
:10471000250290912602A0912702B091280281588B |
:104720009843A140B0405CF084E0CC0FDD1F8A9537 |
:10473000E1F72C1B3D0B3093E7012093E6018091BC |
:104740001D0290911E02A0911F02B091200281567D |
:104750009A4EA040B0407CF0402F5527CA0113E08C |
:10476000880F991F1A95E1F72091E4013091E50136 |
:10477000281B390B1BC080911D0290911E02A09135 |
:104780001F02B0912002805A9541AF4FBF4F54F5A0 |
:10479000402F5527CA01C3E0880F991FCA95E1F73A |
:1047A0002091E4013091E501280F391F3093E50194 |
:1047B0002093E40180911D0290911E02A0911F029E |
:1047C000B091200281589843A140B0405CF0B4E021 |
:1047D000440F551FBA95E1F7241B350B3093E501C3 |
:1047E0002093E4018091D204E82FFF27EE0FFF1FF2 |
:1047F000EB55FB4F4091F804242F332780819181A2 |
:104800002817390724F48091F90482FD0CC03095F3 |
:1048100021953F4F80819181821793077CF480918D |
:10482000F90483FF0BC081E08093DB018091F704E2 |
:1048300099278815990524F44C0102C01092DB01D8 |
:104840008091D104E82FFF27EE0FFF1FEB55FB4FA0 |
:10485000242F3327808191812817390724F48091F0 |
:10486000F90480FD0CC0309521953F4F80819181E6 |
:10487000821793078CF48091F90481FF0DC081E0C9 |
:104880008093DC011092DB018091F7049927881551 |
:10489000990524F44C0102C01092DC017090F201E1 |
:1048A000772041F11092E3011092E2011092E701AA |
:1048B0001092E6011092E5011092E4018DEC9CEC5F |
:1048C000ACECBDE38093260590932705A0932805C3 |
:1048D000B09329058AE097EDA3EABBE3809318051E |
:1048E00090931905A0931A05B0931B051092DB0154 |
:1048F0001092DC018091B3019091B4018D549140EC |
:1049000008F49FC02091210230912202409123029D |
:10491000509124028091250290912602A0912702B5 |
:10492000B0912802281B390B4A0B5B0BC09119026E |
:10493000D0911A02E0911B02F0911C0280911D029D |
:1049400090911E02A0911F02B0912002C81BD90BAA |
:10495000EA0BFB0B1092B4011092B3012B3081E0F3 |
:10496000380780E0480780E058074CF08091370214 |
:104970009091380201969093380280933702265F17 |
:104980003E4F4F4F5F4F4CF4809137029091380269 |
:1049900001979093380280933702CB3021E0D20701 |
:1049A00020E0E20720E0F2074CF080913502909180 |
:1049B000360201969093360280933502C65FDE4F31 |
:1049C000EF4FFF4F4CF480913502909136020197E2 |
:1049D000909336028093350210927A0080912502DE |
:1049E00090912602A0912702B091280280930D0297 |
:1049F00090930E02A0930F02B093100280911D02BB |
:104A000090911E02A0911F02B09120028093050296 |
:104A100090930602A0930702B093080280911502BA |
:104A200090911602A0911702B09118028093FD0197 |
:104A30009093FE01A093FF01B09300028FEE80934C |
:104A40007A00C091DC01CC2309F0D5C08091DB0154 |
:104A5000882309F0D0C08091E504E82EFF240027C8 |
:104A600011278091250290912602A0912702B091F2 |
:104A70002802BC01CD01A80197010E94D12FDA01C3 |
:104A8000C9012091210530912205442737FD409529 |
:104A9000542F821B930BA40BB50B8093450290936C |
:104AA0004602A0934702B0934802B7FF03C04F9657 |
:104AB000A11DB11D5C016D01A5E0D594C794B7940B |
:104AC000A794AA95D1F7A0924502B0924602C0924F |
:104AD0004702D092480280911D0290911E02A0913F |
:104AE0001F02B0912002BC01CD01A80197010E94D4 |
:104AF000D12FDA01C90120912B0530912C054427D3 |
:104B000037FD4095542F821B930BA40BB50B80935C |
:104B1000490290934A02A0934B02B0934C02B7FF14 |
:104B200003C04F96A11DB11D9C01AD01F5E0559547 |
:104B3000479537952795FA95D1F7209349023093F9 |
:104B40004A0240934B0250934C0265E6A616B1040C |
:104B5000C104D10464F084E690E0A0E0B0E080936A |
:104B6000450290934602A0934702B0934802809179 |
:104B7000450290914602A0914702B09148028C599B |
:104B80009F4FAF4FBF4F64F48CE99FEFAFEFBFEF84 |
:104B90008093450290934602A0934702B093480247 |
:104BA000253631054105510564F084E690E0A0E02A |
:104BB000B0E08093490290934A02A0934B02B093D5 |
:104BC0004C028091490290914A02A0914B02B0910F |
:104BD0004C028C599F4FAF4FBF4FECF48CE99FEFC5 |
:104BE000AFEFBFEF8093490290934A02A0934B022C |
:104BF000B0934C0210C010924502109246021092DF |
:104C00004702109248021092490210924A021092F2 |
:104C10004B0210924C0210927A00809111029091F6 |
:104C20001202A0911302B09114022091450230911A |
:104C300046024091470250914802821B930BA40BFD |
:104C4000B50B8093110290931202A0931302B093BC |
:104C500014028091090290910A02A0910B02B09176 |
:104C60000C022091490230914A0240914B0250912E |
:104C70004C02821B930BA40BB50B809309029093FB |
:104C80000A02A0930B02B0930C022091E201309132 |
:104C9000E301C90137FF04C088279927821B930BC2 |
:104CA00045973CF08091D90484FD03C081E0809356 |
:104CB00057028091E204682F7727C90137FF04C0AB |
:104CC00088279927821B930B289FA001299F500DAD |
:104CD000389F500D1124CA01689FA001699F500D93 |
:104CE000789F500D1124CA0157FF02C081509E4F7A |
:104CF000AC01452F550F550B4595629FC001639F31 |
:104D0000900D729F900D112497FD039695958795B0 |
:104D100095958795480F591FCA01AA2797FDA09519 |
:104D2000BA2F8093410290934202A0934302B09322 |
:104D300044022091010230910202409103025091FD |
:104D40000402281B390B4A0B5B0B209301023093A2 |
:104D50000202409303025093040280910102909159 |
:104D60000202A0910302B0910402895A9146A04028 |
:104D7000B04064F088EA91E6A0E0B0E080930102E0 |
:104D800090930202A0930302B09304028091010267 |
:104D900090910202A0910302B091040288559E49AD |
:104DA000AF4FBF4F64F488E59EE9AFEFBFEF80934C |
:104DB000010290930202A0930302B09304028FEECB |
:104DC00080937A008091F7019091F801892B09F482 |
:104DD000B8C08091D90483FFB4C08091250290911E |
:104DE0002602A0912702B0912802B7FF04C081508B |
:104DF0009E4FAF4FBF4F09E0B595A7959795879503 |
:104E00000A95D1F79C0197FF03C0309521953F4F3C |
:104E100080911D0290911E02A0911F02B09120026C |
:104E2000B7FF04C081509E4FAF4FBF4F19E0B595FB |
:104E3000A795979587951A95D1F7BC0197FF03C061 |
:104E4000709561957F4F261737070CF49B01293128 |
:104E50003105A4F480915702882381F08091580293 |
:104E600090915902892B51F48091F7019091F801AA |
:104E70009093F6018093F501109257028091710191 |
:104E8000482F5527249FC001259F900D349F900DDA |
:104E9000112497FDCF969C01B6E035952795BA95DC |
:104EA000E1F7421B530B9A01141615060CF043C090 |
:104EB00010927A0060915802709159026115710543 |
:104EC00069F58091F3019091F401829FA001839F85 |
:104ED000500D929F500D11249A0157FF02C0215E80 |
:104EE0003F4FA5E035952795AA95E1F7442737FD73 |
:104EF0004095542F8091010290910202A0910302EB |
:104F0000B0910402820F931FA41FB51F809301026A |
:104F100090930202A0930302B09304028FEE809359 |
:104F20007A006115710569F0615070407093590203 |
:104F30006093580206C084EF91E0909359028093E9 |
:104F40005802809156028150809356028F3F09F09B |
:104F50007DC081E3809356028091E504E82EFF2412 |
:104F6000002711278091250290912602A091270207 |
:104F7000B0912802BC01CD01A80197010E94D12F58 |
:104F800030934B0420934A0480911D0290911E029D |
:104F9000A0911F02B0912002BC01CD01A801970190 |
:104FA0000E94D12F30934D0420934C048091210511 |
:104FB0009091220590934F0480934E0480912B058D |
:104FC00090912C0590935104809350048091240576 |
:104FD0009091250590935304809352048091DF01B2 |
:104FE0009091E00190935504809354048091F901CD |
:104FF0009091FA01A091FB01B091FC01B7FF04C0B0 |
:1050000081509E4FAF4FBF4FF9E0B595A79597954B |
:105010008795FA95D1F79093570480935604809121 |
:10502000F7019091F80190935B0480935A0480916A |
:105030000D0190910E0190935D0480935C0480912A |
:10504000E801992790935F0480935E04A090260561 |
:10505000B0902705C0902805D0902905CC23A9F051 |
:105060008091110590911205AA2797FDA095BA2F5E |
:10507000BC01CD010E949B2EDC01CB01A601950154 |
:10508000BC01CD010E94152F3AC08091250290915C |
:105090002602A0912702B0912802BC01CD010E94F6 |
:1050A0009B2E7B018C018091180590911905A09190 |
:1050B0001A05B0911B059C01AD01C801B7010E9402 |
:1050C000152F7B018C018091110590911205AA2763 |
:1050D00097FDA095BA2FBC01CD010E949B2EDC014B |
:1050E000CB01A6019501BC01CD010E94152FDC0169 |
:1050F000CB019C01AD01C801B7010E94F62DDC0176 |
:10510000CB01BC01CD010E947E2EDC01CB0190932E |
:105110001205809311058091DB01A0902605B090C7 |
:105120002705C0902805D09029058823A9F08091F3 |
:105130000D0590910E05AA2797FDA095BA2FBC01E9 |
:10514000CD010E949B2EDC01CB01A6019501BC0183 |
:10515000CD010E94152F3AC080911D0290911E0230 |
:10516000A0911F02B0912002BC01CD010E949B2E94 |
:105170007B018C018091180590911905A0911A0569 |
:10518000B0911B059C01AD01C801B7010E94152F0C |
:105190007B018C0180910D0590910E05AA2797FD4A |
:1051A000A095BA2FBC01CD010E949B2EDC01CB0142 |
:1051B000A6019501BC01CD010E94152FDC01CB0198 |
:1051C0009C01AD01C801B7010E94F62DDC01CB01A5 |
:1051D000BC01CD010E947E2EDC01CB0190930E0517 |
:1051E00080930D058091240590912505AA2797FDB0 |
:1051F000A095BA2FBC01CD010E949B2E7B018C0192 |
:105200008091260590912705A0912805B091290548 |
:105210009C01AD01C801B7010E94152F5B016C0113 |
:105220008091150290911602A0911702B091180278 |
:10523000BC01CD010E949B2E7B018C018091180541 |
:1052400090911905A0911A05B0911B059C01AD0123 |
:10525000C801B7010E94152FDC01CB0120E030E02E |
:1052600040E05FE3BC01CD010E94152FDC01CB01C2 |
:105270009C01AD01C601B5010E94F62DDC01CB01F8 |
:10528000BC01CD010E947E2EDC01CB01909325054F |
:1052900080932405809111059091120581509840CA |
:1052A00034F080E098E0909312058093110580918E |
:1052B0001105909112058050984F34F480E098EFDA |
:1052C000909312058093110580910D0590910E0524 |
:1052D0008150984034F080E098E090930E058093E0 |
:1052E0000D0580910D0590910E058050984F34F476 |
:1052F00080E098EF90930E0580930D058091240532 |
:10530000909125058150984034F080E098E090938A |
:1053100025058093240580912405909125058050D2 |
:10532000984F34F480E098EF9093250580932405FE |
:105330008091D904992780FFE1C02091740181FFF9 |
:105340000EC02233B0F48091DF019091E0014497C8 |
:105350009093DE018093DD011092F1010DC08091E8 |
:10536000DE04289FC001112444979093DE018093AE |
:10537000DD0181E08093F101772021F01092DE01C0 |
:105380001092DD01C090DF01D090E0012091DD019D |
:105390003091DE012C153D050CF0B0C08091F1017B |
:1053A000882309F4ABC0C21AD30A809173019927EC |
:1053B000C89EB001C99E700DD89E700D1124CB01FE |
:1053C00077FD0F966C01E4E0D594C794EA95E1F778 |
:1053D000C4018C199D096C0180917501282F332718 |
:1053E0008091B5019091B601829FA001839F500DDD |
:1053F000929F500D1124CA0157FD079673E09595B1 |
:1054000087957A95E1F7C81AD90AA091F901B09168 |
:10541000FA01C091FB01D091FC01D7FF04C0A1505B |
:10542000BE4FCF4FDF4F69E0D595C795B795A7958C |
:105430006A95D1F780917201282F33274427552789 |
:10544000BD01CE010E945D2F97FF04C0615E7F4FBA |
:105450008F4F9F4F55E095958795779567955A950E |
:10546000D1F7633371051CF062E370E006C05FEFB3 |
:105470006E3C750714F46EEC7FEFC61AD70A809164 |
:105480005402909155029C0144E0220F331F4A952B |
:10549000E1F7281B390B2C0D3D1D37FF02C0215FA2 |
:1054A0003F4F04E0359527950A95E1F73093550273 |
:1054B000209354028091DA04482F5527241735078A |
:1054C00074F48416950624F05093550240935402C8 |
:1054D0008416950624F4909255028092540280918D |
:1054E0005402909155028816990624F49092550220 |
:1054F00080925402809054029090550290925904E8 |
:1055000080925804C0912405D091250580914102D4 |
:1055100090914202C81BD90BCE01AA2797FDA095F6 |
:10552000BA2FBC01CD010E949B2E7B018C01C401CE |
:10553000AA2797FDA095BA2FBC01CD010E949B2EF2 |
:105540005B016C019B01AC01C801B7010E94A82E50 |
:1055500018163CF4C601B5010E947E2EDC01CB0179 |
:10556000EC01CE01AA2797FDA095BA2FBC01CD0171 |
:105570000E949B2EDC01CB01D7FAD094D7F8D094AF |
:10558000A6019501BC01CD010E94A52E88233CF403 |
:10559000C601B5010E947E2EDC01CB01EC01C536AF |
:1055A000D10514F0C4E6D0E06FEFCC39D60714F47F |
:1055B000CCE9DFEF74E18716910414F4C0E0D0E089 |
:1055C0002091E6013091E70180916C0290916D028B |
:1055D000281B390B8091110590911205821B930BAA |
:1055E000AA2797FDA095BA2FBC01CD010E949B2E42 |
:1055F000DC01CB0140907A0150907B0160907C01EE |
:1056000070907D019C01AD01C301B2010E94152F74 |
:10561000DC01CB01BC01CD010E947E2EDC01CB015F |
:1056200090931705809316058091160590911705A4 |
:10563000AA2797FDA095BA2F2091390230913A02FE |
:1056400040913B0250913C02280F391F4A1F5B1FBB |
:105650002093390230933A0240933B0250933C022C |
:105660006091390270913A0212161306140615065B |
:10567000C4F4CB0177FF04C088279927861B970BBA |
:1056800097FF02C081509F4F892F990F990B019668 |
:10569000AA2797FDA095BA2F281B390B4A0B5B0B45 |
:1056A00016C0CB0177FF03C0909581959F4F97FF60 |
:1056B00002C081509F4F892F990F990B0196AA27FD |
:1056C00097FDA095BA2F280F391F4A1F5B1F209303 |
:1056D000390230933A0240933B0250933C0280914E |
:1056E000390290913A02A0913B02B0913C0281585C |
:1056F0009E43A040B04064F080E89EE3A0E0B0E0AC |
:105700008093390290933A02A0933B02B0933C02FB |
:105710008091390290913A02A0913B02B0913C02F3 |
:105720008058914CAF4FBF4F64F480E891ECAFEFDD |
:10573000BFEF8093390290933A02A0933B02B0935B |
:105740003C028091160590911705AA2797FDA09518 |
:10575000BA2FBC01CD010E949B2E7B018C01809150 |
:10576000390290913A02A0913B02B0913C02BC01F7 |
:10577000CD010E949B2EDC01CB01A0907601B09060 |
:105780007701C0907801D09079019C01AD01C601EC |
:10579000B5010E94152FDC01CB019C01AD01C801B0 |
:1057A000B7010E94F62DDC01CB01BC01CD010E94A6 |
:1057B0007E2EDC01CB01AC01CE01D7FF04C08827CF |
:1057C00099278C1B9D0B880D991D880F991F841795 |
:1057D000950764F4CE01D7FF04C0882799278C1B56 |
:1057E0009D0BA401480F591F440F551FCE01D7FF31 |
:1057F00004C0882799278C1B9D0B880D991D2EEFBF |
:105800003FEF829FB001839F700D929F700D112416 |
:105810004617570784F4CE01D7FF04C0882799277D |
:105820008C1B9D0B880D991D829FA001839F500D9D |
:10583000929F500D11249401240F351F2C0F3D1FF2 |
:1058400037FF03C020E030E007C08091230599278F |
:10585000821793070CF49C0130901305832D992730 |
:10586000281739070CF49C0120930F059401241B81 |
:10587000350B2C0F3D1F37FF03C020E030E007C081 |
:10588000809123059927821793070CF49C01832D9F |
:105890009927281739070CF49C01209310052091B3 |
:1058A000E4013091E50180916A0290916B02281B1E |
:1058B000390B80910D0590910E05821B930BAA2741 |
:1058C00097FDA095BA2FBC01CD010E949B2EDC0153 |
:1058D000CB019C01AD01C301B2010E94152FDC0177 |
:1058E000CB01BC01CD010E947E2EDC01CB01909347 |
:1058F0000C0580930B0580910B0590910C05AA2750 |
:1059000097FDA095BA2F20913D0230913E02409123 |
:105910003F0250914002280F391F4A1F5B1F2093FE |
:105920003D0230933E0240933F025093400260910B |
:105930003D0270913E021216130614061506C4F4B9 |
:10594000CB0177FF04C088279927861B970B97FF09 |
:1059500002C081509F4F892F990F990B0196AA275A |
:1059600097FDA095BA2F281B390B4A0B5B0B16C06D |
:10597000CB0177FF03C0909581959F4F97FF02C0A1 |
:1059800081509F4F892F990F990B0196AA2797FD58 |
:10599000A095BA2F280F391F4A1F5B1F20933D0285 |
:1059A00030933E0240933F025093400280913D026B |
:1059B00090913E02A0913F02B091400281589E43D7 |
:1059C000A040B04064F080E89EE3A0E0B0E08093A7 |
:1059D0003D0290933E02A0933F02B093400280911B |
:1059E0003D0290913E02A0913F02B091400280584A |
:1059F000914CAF4FBF4F64F480E891ECAFEFBFEF35 |
:105A000080933D0290933E02A0933F02B0934002E8 |
:105A100080910B0590910C05AA2797FDA095BA2FB0 |
:105A2000BC01CD010E949B2E7B018C0180913D0227 |
:105A300090913E02A0913F02B0914002BC01CD0185 |
:105A40000E949B2EDC01CB019C01AD01C601B5017A |
:105A50000E94152FDC01CB019C01AD01C801B701EB |
:105A60000E94F62DDC01CB01BC01CD010E947E2EEF |
:105A7000DC01CB01AC01CE01D7FF04C088279927F8 |
:105A80008C1B9D0B880D991D880F991F84179507F6 |
:105A900064F4CE01D7FF04C0882799278C1B9D0B87 |
:105AA000A401480F591F440F551FCE01D7FF04C052 |
:105AB000882799278C1B9D0B880D991D2EEF3FEF92 |
:105AC000829FB001839F700D929F700D1124461725 |
:105AD000570784F4CE01D7FF04C0882799278C1B71 |
:105AE0009D0B880D991D829FA001839F500D929F51 |
:105AF000500D11249401240F351F2C1B3D0B37FF33 |
:105B000003C020E030E007C0809123059927821769 |
:105B100093070CF49C01832D9927281739070CF45F |
:105B20009C0120931E059401241B350B2C1B3D0B5F |
:105B300037FF03C020E030E007C08091230599279C |
:105B4000821793070CF49C01832D99272817390796 |
:105B50000CF49C0120931C05DF91CF911F910F91B4 |
:105B6000FF90EF90DF90CF90BF90AF909F908F907D |
:105B70007F906F905F904F903F9008958091660264 |
:105B800090916702A0916802B091690280935E02D1 |
:105B900090935F02A0936002B093610280916202D1 |
:105BA00090916302A0916402B091650280935A02C1 |
:105BB00090935B02A0935C02B0935D0208951092F3 |
:105BC0006D0210926C0210926B0210926A0208959C |
:105BD000FC014150504030F001900616D1F731974A |
:105BE000CF0108958827992708955058192EEFD08E |
:105BF00001D0D2C0BA176207730784079507B1F1C5 |
:105C000088F40EF410940B2EBA2FA02D062E622FBE |
:105C1000202D072E732F302D082E842F402D092E76 |
:105C2000952F502DFF275523B9F0591B49F0573EAA |
:105C300098F0469537952795A795F0405395C9F765 |
:105C400076F0BA0F621F731F841F30F48795779523 |
:105C50006795B795F040939517FA0F2E0895BF1BDF |
:105C6000BB27BA0B620B730B840BF6CFDEF6DBC0DF |
:105C7000AED001D091C0552359F0992369F09F57B8 |
:105C80005F57951B33F442F4903811F4915805C0D6 |
:105C90009BC091589F3F09F4C6C0BB2711246217CF |
:105CA0007307840730F4660F771F881FBB1F91505E |
:105CB00098F311D00F920FD00F920DD0A0E82617B5 |
:105CC000370748071B0609F0A048BA2F602D7F91BF |
:105CD0008F9100240895A0E80024621773078407B9 |
:105CE000B10528F0621B730B840BB1090A2A660FF9 |
:105CF000771F881FBB1FA69581F7089597FB73D068 |
:105D00009F3738F0FEE9F91B982F872F762F6B2FDE |
:105D100005C086C09695879577956795F150D0F721 |
:105D20003EF490958095709561957F4F8F4F9F4F72 |
:105D30000895E89403C097FB0EF4F3DFB62F672FA6 |
:105D4000782F892F9EE9002427C00ED05EF004C072 |
:105D50000BD026F001C008D019F020F48FEF089581 |
:105D600080E0089581E0089597FB092E052600F84C |
:105D7000689430D0E89407FC07C062177307840763 |
:105D8000950721F008F400940794989408959A9543 |
:105D9000BB0F661F771F881F11249923A1F088234A |
:105DA000B2F79F3F59F0BB0F48F421F4002011F4E3 |
:105DB00060FF04C06F5F7F4F8F4F9F4F881F979585 |
:105DC000879597F908952CC09FEF80EC0895052ED4 |
:105DD000092607FA440F551F5F3F79F0AA27A51738 |
:105DE00008F051E04795880F991F9F3F31F0BB277E |
:105DF000B91708F091E0879508959F919F9111241C |
:105E0000E3CF97FB880F991F9F3F31F0BB27B9174E |
:105E100008F091E0879508959F919F911124D4CF28 |
:105E200066277727882799270895D1DF01D0B4CF37 |
:105E3000992339F0552329F09F575F57950F13F495 |
:105E40009AF1F1CF91589F3FE1F3629FA12D0F92FC |
:105E5000BB27639FA00DB11DEE27729FA00DB11D42 |
:105E6000EE1FAF93AA27649FB00DE11D739FB00D85 |
:105E7000E11DAA1F6627829FB00DE11DA61F5527B1 |
:105E8000749FE00DA11D551F839FE00DA11D561F9E |
:105E9000849FA00D511D852F7A2F6E2F1F900F907C |
:105EA00088231AF4939539F48FCF000C111CBB1F73 |
:105EB000661F771F881F01280895629FD001739F76 |
:105EC000F001829FE00DF11D649FE00DF11D929F96 |
:105ED000F00D839FF00D749FF00D659FF00D9927D5 |
:105EE000729FB00DE11DF91F639FB00DE11DF91FF9 |
:105EF000BD01CF0111240895991B79E004C0991FB9 |
:105F0000961708F0961B881F7A95C9F78095089513 |
:105F1000AA1BBB1B51E107C0AA1FBB1FA617B707CF |
:105F200010F0A61BB70B881F991F5A95A9F78095EB |
:105F30009095BC01CD01089597FB092E07260AD044 |
:105F400077FD04D0E5DF06D000201AF47095619546 |
:105F50007F4F0895F6F7909581959F4F0895A1E2A0 |
:105F60001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FD3 |
:105F7000FF1FA217B307E407F50720F0A21BB30B1E |
:105F8000E40BF50B661F771F881F991F1A9469F79A |
:105F900060957095809590959B01AC01BD01CF01F6 |
:105FA000089597FB092E05260ED057FD04D0D7DFA4 |
:105FB0000AD0001C38F450954095309521953F4FFC |
:105FC0004F4F5F4F0895F6F79095809570956195C6 |
:105FD0007F4F8F4F9F4F0895F999FECFB2BDA1BD5E |
:105FE000F89A119600B40895F999FECFB2BDA1BDFB |
:105FF00000BC11960FB6F894FA9AF99A0FBE08955C |
:106000000A6401FFFF010AFF03007D0000640048ED |
:10601000616C6C6F2057656C74000000000000001C |
:106020000000000000000000000000000000000070 |
:106030000000000000000000000000000000000060 |
:106040000000000000000000000000000000000050 |
:10605000000000000000000000000000000000013F |
:1060600002030405060708090A0A0146640A0296A3 |
:1060700096403A10FB3017B7D1380000803F6400DB |
:1060800053706F727400004B616D657261000000A7 |
:00000001FF |
/tags/V0.66a/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,15 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
Flight-Ctrl SW > 0.62 benötigt das Kopter-Tool >1.47 |
/tags/V0.66a/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/tags/V0.66a/Settings.h |
---|
--- _Settings.h (nonexistent) |
+++ _Settings.h (revision 379) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 16 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 500 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/tags/V0.66a/analog.c |
---|
0,0 → 1,172 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AccumulateNick = 0, AccumulateRoll = 0, AccumulateGier = 0; |
volatile int accumulate_AccRoll = 0,accumulate_AccNick = 0,accumulate_AccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
signed int wert; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
wert = (signed int) AdNeutralGier - ADC; |
if(PlatinenVersion != 10) wert *= 2; |
AccumulateGier += wert; // |
MessanzahlGier++; |
Mess_Integral_Gier += wert;// / 16; |
Mess_Integral_Gier2 += wert; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
wert = (signed int) ADC - AdNeutralRoll; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralRoll += wert; |
Mess_IntegralRoll2 += wert; |
if(Mess_IntegralRoll > 310000L) Mess_IntegralRoll = -290000L; |
if(Mess_IntegralRoll <-310000L) Mess_IntegralRoll = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
AccumulateRoll += wert; |
MessanzahlRoll++; |
kanal = 2; |
break; |
case 2: |
wert = (signed int) ADC - AdNeutralNick; |
if(PlatinenVersion != 10) wert *= 2; |
Mess_IntegralNick += wert; |
Mess_IntegralNick2 += wert; |
if(Mess_IntegralNick > 310000L) Mess_IntegralNick = -290000L; |
if(Mess_IntegralNick <-310000L) Mess_IntegralNick = 290000L; |
if(ADC < 15) wert = -1000; |
if(ADC < 7) wert = -2000; |
if(ADC > 1010) wert = +1000; |
if(ADC > 1017) wert = +2000; |
AccumulateNick += wert; |
MessanzahlNick++; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
accumulate_AccRoll += Aktuell_ay; |
messanzahl_AccRoll++; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
accumulate_AccNick += Aktuell_ax; |
messanzahl_AccNick++; |
kanal = 5; |
state = 6; |
break; |
case 6: |
accumulate_AccHoch = (signed int) ADC - NeutralAccZ; |
accumulate_AccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(accumulate_AccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(accumulate_AccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += accumulate_AccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
// Mess_Integral_Hoch -= Mess_Integral_Hoch / 512; // dämfen |
/* if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
kanal = 3; |
state = 7; |
} |
else |
{ |
kanal = 0; |
state = 0; |
}*/ |
kanal = 3; |
state = 7; |
break; |
case 7: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
ANALOG_ON; |
} |
/tags/V0.66a/analog.h |
---|
0,0 → 1,23 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AccumulateNick, AccumulateRoll, AccumulateGier,accumulate_AccRoll,accumulate_AccNick,accumulate_AccHoch; |
extern volatile char MessanzahlNick, MessanzahlRoll, MessanzahlGier,messanzahl_AccNick, messanzahl_AccRoll,messanzahl_AccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
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) |
/tags/V0.66a/eeprom.c |
---|
--- fc.c (nonexistent) |
+++ fc.c (revision 379) |
@@ -0,0 +1,912 @@ |
+/*####################################################################################### |
+Flight Control |
+#######################################################################################*/ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) 04.2007 Holger Buss |
+// + Nur für den privaten Gebrauch |
+// + www.MikroKopter.com |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
+// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
+// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
+// + bzgl. der Nutzungsbedingungen aufzunehmen. |
+// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
+// + Verkauf von Luftbildaufnahmen, usw. |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
+// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
+// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
+// + eindeutig als Ursprung verlinkt werden |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
+// + Benutzung auf eigene Gefahr |
+// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
+// + mit unserer Zustimmung zulässig |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
+// + this list of conditions and the following disclaimer. |
+// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
+// + from this software without specific prior written permission. |
+// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
+// + for non-commercial use (directly or indirectly) |
+// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
+// + with our written permission |
+// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
+// + clearly linked as origin |
+// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
+// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
+// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
+// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
+// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
+// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
+// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
+// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
+// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
+// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
+// + POSSIBILITY OF SUCH DAMAGE. |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#include "main.h" |
+ |
+unsigned char h,m,s; |
+volatile unsigned int I2CTimeout = 100; |
+volatile int MesswertNick,MesswertRoll,MesswertGier; |
+volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0; |
+volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
+volatile float NeutralAccZ = 0; |
+unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
+volatile long IntegralNick = 0,IntegralNick2 = 0; |
+volatile long IntegralRoll = 0,IntegralRoll2 = 0; |
+volatile long Integral_Gier = 0; |
+volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
+volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
+volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
+volatile long Mess_Integral_Hoch = 0; |
+volatile int KompassValue = 0; |
+volatile int KompassStartwert = 0; |
+volatile int KompassRichtung = 0; |
+unsigned char MAX_GAS,MIN_GAS; |
+unsigned char Notlandung = 0; |
+unsigned char HoehenReglerAktiv = 0; |
+ |
+float GyroFaktor; |
+float IntegralFaktor; |
+ |
+volatile int DiffNick,DiffRoll; |
+int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
+volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
+unsigned char MotorWert[5]; |
+volatile unsigned char SenderOkay = 0; |
+int StickNick = 0,StickRoll = 0,StickGier = 0; |
+char MotorenEin = 0; |
+int HoehenWert = 0; |
+int SollHoehe = 0; |
+unsigned char Looping_Nick = 0,Looping_Roll = 0; |
+ |
+float Kp = FAKTOR_P; |
+float Ki = FAKTOR_I; |
+ |
+unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
+unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
+unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
+unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
+unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
+unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
+unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
+unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
+unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
+unsigned char Parameter_UserParam1 = 0; |
+unsigned char Parameter_UserParam2 = 0; |
+unsigned char Parameter_UserParam3 = 0; |
+unsigned char Parameter_UserParam4 = 0; |
+unsigned char Parameter_ServoNickControl = 100; |
+unsigned char Parameter_LoopGasLimit = 70; |
+struct mk_param_struct EE_Parameter; |
+ |
+void Piep(unsigned char Anzahl) |
+{ |
+ while(Anzahl--) |
+ { |
+ if(MotorenEin) return; //auf keinen Fall im Flug! |
+ beeptime = 100; |
+ Delay_ms(250); |
+ } |
+} |
+ |
+//############################################################################ |
+// Nullwerte ermitteln |
+void SetNeutral(void) |
+//############################################################################ |
+{ |
+ unsigned int timer; |
+ NeutralAccX = 0; |
+ NeutralAccY = 0; |
+ NeutralAccZ = 0; |
+ AdNeutralNick = 0; |
+ AdNeutralRoll = 0; |
+ AdNeutralGier = 0; |
+ CalibrierMittelwert(); |
+ timer = SetDelay(5); |
+ while (!CheckDelay(timer)); |
+ CalibrierMittelwert(); |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ |
+ if(PlatinenVersion == 10) |
+ { |
+ AdNeutralNick= abs(MesswertNick); |
+ AdNeutralRoll= abs(MesswertRoll); |
+ AdNeutralGier= abs(MesswertGier); |
+ } |
+ else |
+ { |
+ AdNeutralNick= abs(MesswertNick) / 2; |
+ AdNeutralRoll= abs(MesswertRoll) / 2; |
+ AdNeutralGier= abs(MesswertGier) / 2; |
+ } |
+ NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
+ NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
+ NeutralAccZ = Aktuell_az; |
+ |
+ Mess_IntegralNick = 0; |
+ Mess_IntegralNick2 = 0; |
+ Mess_IntegralRoll = 0; |
+ Mess_IntegralRoll2 = 0; |
+ Mess_Integral_Gier = 0; |
+ MesswertNick = 0; |
+ MesswertRoll = 0; |
+ MesswertGier = 0; |
+ StartLuftdruck = Luftdruck; |
+ HoeheD = 0; |
+ Mess_Integral_Hoch = 0; |
+ KompassStartwert = KompassValue; |
+ GPS_Neutral(); |
+ beeptime = 50; |
+} |
+ |
+//############################################################################ |
+// Bildet den Mittelwert aus den Messwerten |
+void Mittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((long)Mittelwert_AccNick * 7 + ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick)) / 8L; |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 7 + ((ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll)) / 8L; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 7 + ((long)accumulate_AccHoch) / messanzahl_AccHoch) / 8L; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ Integral_Gier = Mess_Integral_Gier; |
+// Integral_Gier2 = Mess_Integral_Gier2; |
+ IntegralNick = Mess_IntegralNick; |
+ IntegralRoll = Mess_IntegralRoll; |
+ IntegralNick2 = Mess_IntegralNick2; |
+ IntegralRoll2 = Mess_IntegralRoll2; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ |
+/* |
+//------------------------------------------------------------------------------ |
+ if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
+ else |
+ if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
+ if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
+ else |
+ if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
+//------------------------------------------------------------------------------ |
+*/ |
+ if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
+ if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
+ if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
+ if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
+ if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
+ if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
+ if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
+ if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
+} |
+ |
+//############################################################################ |
+// Messwerte beim Ermitteln der Nullage |
+void CalibrierMittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick); |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = (ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)accumulate_AccHoch) / messanzahl_AccHoch; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
+ if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
+ if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
+ if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
+ if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
+ if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
+ if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
+ if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
+} |
+ |
+//############################################################################ |
+// Senden der Motorwerte per I2C-Bus |
+void SendMotorData(void) |
+//############################################################################ |
+{ |
+ if(MOTOR_OFF || !MotorenEin) |
+ { |
+ Motor_Hinten = 0; |
+ Motor_Vorne = 0; |
+ Motor_Rechts = 0; |
+ Motor_Links = 0; |
+ if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
+ if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
+ if(MotorTest[2]) Motor_Links = MotorTest[2]; |
+ if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
+ } |
+ |
+ DebugOut.Analog[12] = Motor_Vorne; |
+ DebugOut.Analog[13] = Motor_Hinten; |
+ DebugOut.Analog[14] = Motor_Links; |
+ DebugOut.Analog[15] = Motor_Rechts; |
+ |
+ //Start I2C Interrupt Mode |
+ twi_state = 0; |
+ motor = 0; |
+ i2c_start(); |
+} |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Konstanten |
+// + 0-250 -> normale Werte |
+// + 251 -> Poti1 |
+// + 252 -> Poti2 |
+// + 253 -> Poti3 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+void DefaultKonstanten1(void) |
+{ |
+ EE_Parameter.Kanalbelegung[K_NICK] = 1; |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
+ EE_Parameter.Kanalbelegung[K_GAS] = 3; |
+ EE_Parameter.Kanalbelegung[K_GIER] = 4; |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
+ EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
+ EE_Parameter.Gyro_P = 120; //80 // Wert : 0-250 |
+ EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
+ EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
+ EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
+ EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 0; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
+ EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickRefresh = 5; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
+ memcpy(EE_Parameter.Name, "Sport\0", 12); |
+} |
+ |
+void DefaultKonstanten2(void) |
+{ |
+ EE_Parameter.Kanalbelegung[K_NICK] = 1; |
+ EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
+ EE_Parameter.Kanalbelegung[K_GAS] = 3; |
+ EE_Parameter.Kanalbelegung[K_GIER] = 4; |
+ EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
+ EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
+ EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
+ EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
+ EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
+ EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
+ EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
+ EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
+ EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
+ EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
+ EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 0; |
+ EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
+ EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
+ EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
+ EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
+ EE_Parameter.ServoNickRefresh = 5; |
+ EE_Parameter.LoopGasLimit = 50; |
+ EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
+ EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
+ memcpy(EE_Parameter.Name, "Kamera\0", 12); |
+} |
+ |
+ |
+//############################################################################ |
+// Trägt ggf. das Poti als Parameter ein |
+void ParameterZuordnung(void) |
+//############################################################################ |
+{ |
+ |
+ #define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
+ CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
+ CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
+ CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
+ CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
+ CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
+ CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
+ CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
+ CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
+ CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
+ CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
+ CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
+ CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
+ |
+ Ki = (float) Parameter_I_Faktor * 0.0001; |
+ MAX_GAS = EE_Parameter.Gas_Max; |
+ MIN_GAS = EE_Parameter.Gas_Min; |
+} |
+ |
+ |
+//############################################################################ |
+// |
+void MotorRegler(void) |
+//############################################################################ |
+{ |
+ int motorwert,pd_ergebnis,h,tmp_int; |
+ int GierMischanteil,GasMischanteil; |
+ static long SummeNick=0,SummeRoll=0; |
+ static long sollGier = 0,tmp_long,tmp_long2; |
+ long IntegralFehlerNick = 0; |
+ long IntegralFehlerRoll = 0; |
+ static unsigned int RcLostTimer; |
+ static unsigned char delay_neutral = 0; |
+ static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
+ static unsigned int modell_fliegt = 0; |
+ static int hoehenregler = 0; |
+ static char TimerWerteausgabe = 0; |
+ static char NeueKompassRichtungMerken = 0; |
+ Mittelwert(); |
+ |
+ GRN_ON; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gaswert ermitteln |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
+ if(GasMischanteil < 0) GasMischanteil = 0; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang schlecht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay < 100) |
+ { |
+ if(!PcZugriff) |
+ { |
+ if(BeepMuster == 0xffff) |
+ { |
+ beeptime = 15000; |
+ BeepMuster = 0x0c00; |
+ } |
+ } |
+ if(RcLostTimer) RcLostTimer--; |
+ else |
+ { |
+ MotorenEin = 0; |
+ Notlandung = 0; |
+ } |
+ ROT_ON; |
+ if(modell_fliegt > 2000) // wahrscheinlich in der Luft --> langsam absenken |
+ { |
+ GasMischanteil = EE_Parameter.NotGas; |
+ Notlandung = 1; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
+ PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
+ } |
+ else MotorenEin = 0; |
+ } |
+ else |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang gut |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay > 140) |
+ { |
+ Notlandung = 0; |
+ RcLostTimer = EE_Parameter.NotGasZeit * 50; |
+ if(GasMischanteil > 40) |
+ { |
+ if(modell_fliegt < 0xffff) modell_fliegt++; |
+ } |
+ if((modell_fliegt < 200) || (GasMischanteil < 40)) |
+ { |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ } |
+ if((GasMischanteil > 200) && MotorenEin == 0) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// auf Nullwerte kalibrieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
+ { |
+ 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 |
+ } |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
+ SetNeutral(); |
+ Piep(GetActiveParamSetNumber()); |
+ } |
+ } |
+ else delay_neutral = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gas ist unten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(GasMischanteil < 35) |
+ { |
+ // Starten |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
+ { |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Einschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(++delay_einschalten > 200) |
+ { |
+ delay_einschalten = 200; |
+ modell_fliegt = 1; |
+ MotorenEin = 1; |
+ sollGier = 0; |
+ Mess_Integral_Gier = 0; |
+ Mess_Integral_Gier2 = 0; |
+ Mess_IntegralNick = 0; |
+ Mess_IntegralRoll = 0; |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ SummeNick = 0; |
+ SummeRoll = 0; |
+ } |
+ } |
+ else delay_einschalten = 0; |
+ //Auf Neutralwerte setzen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Auschalten |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
+ { |
+ if(++delay_ausschalten > 200) // nicht sofort |
+ { |
+ MotorenEin = 0; |
+ delay_ausschalten = 200; |
+ modell_fliegt = 0; |
+ } |
+ } |
+ else delay_ausschalten = 0; |
+ } |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// neue Werte von der Funke |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!NewPpmData-- || Notlandung) |
+ { |
+ ParameterZuordnung(); |
+ StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
+ StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
+ StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
+ StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
+ StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
+ GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
+ IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
+ |
+ if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
+ if(GyroFaktor < 0) GyroFaktor = 0; |
+ if(IntegralFaktor < 0) IntegralFaktor = 0; |
+ // greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
+ if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ if(IntegralNick > 60000) |
+ { |
+ StickNick -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralNick < -60000) |
+ { |
+ StickNick += 8 * EE_Parameter.Stick_P; |
+ if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
+ } |
+ if(IntegralRoll > 60000) |
+ { |
+ StickRoll -= 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ else |
+ if(IntegralRoll < -60000) |
+ { |
+ StickRoll += 8 * EE_Parameter.Stick_P; |
+ if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
+ } |
+ } |
+ |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Looping? |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
+ { |
+ Looping_Roll = 1; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Roll = 0; |
+ |
+ if(((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) || |
+ ((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN)) |
+ { |
+ Looping_Nick = 1; |
+ Looping_Roll = 0; |
+ if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
+ } |
+ else Looping_Nick = 0; |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Bei Empfangsausfall im Flug |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Notlandung) |
+ { |
+ StickGier = 0; |
+ StickNick = 0; |
+ StickRoll = 0; |
+ GyroFaktor = 0.1; |
+ IntegralFaktor = 0.005; |
+ Looping_Roll = 0; |
+ Looping_Nick = 0; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gyro-Drift kompensieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define DRIFT_FAKTOR 3 |
+ if(ZaehlMessungen >= 1000 / DRIFT_FAKTOR) |
+ { |
+ IntegralFehlerNick = IntegralNick2 - IntegralNick; |
+ IntegralFehlerRoll = IntegralRoll2 - IntegralRoll; |
+ ZaehlMessungen = 0; |
+ if(IntegralFehlerNick > 800/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -800/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 800/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -800/DRIFT_FAKTOR) AdNeutralRoll--; |
+// if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR) AdNeutralGier--; // macht nur mit Referenz (Kompass Sinn) |
+// if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; // macht nur mit Referenz (Kompass Sinn) |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ Mess_Integral_Gier2 = Integral_Gier; |
+ ANALOG_ON; // ADC einschalten |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Integrale auf ACC-Signal abgleichen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!Looping_Nick && !Looping_Roll) |
+ { |
+ tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
+ tmp_long /= 32; |
+ tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
+ tmp_long2 /= 32; |
+ |
+ #define AUSGLEICH 100 |
+ if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
+ if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
+ if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
+ if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
+ } |
+ else |
+ { |
+ tmp_long = 0; |
+ tmp_long2 = 0; |
+ } |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick -= tmp_long; |
+ Mess_IntegralRoll -= tmp_long2; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(abs(StickGier) > 20) // war 35 |
+ { |
+ if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
+ } |
+ tmp_int = EE_Parameter.Gier_P * (StickGier * abs(StickGier)) / 512; // expo y = ax + bx² |
+ tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
+ sollGier = tmp_int; |
+ Mess_Integral_Gier -= tmp_int; |
+ if(Mess_Integral_Gier > 25000) Mess_Integral_Gier = 25000; // begrenzen |
+ if(Mess_Integral_Gier <-25000) Mess_Integral_Gier =-25000; |
+ |
+ ANALOG_ON; // ADC einschalten |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Kompass |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
+ { |
+ int w,v; |
+ static int SignalSchlecht = 0; |
+ w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
+ v = abs(IntegralRoll /512); |
+ if(v > w) w = v; // grösste Neigung ermitteln |
+ if(w < 25 && NeueKompassRichtungMerken && !SignalSchlecht) |
+ { |
+ KompassStartwert = KompassValue; |
+ NeueKompassRichtungMerken = 0; |
+ } |
+ w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
+ w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
+ if(w > 0) |
+ { |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ if(!SignalSchlecht) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
+ ANALOG_ON; // ADC einschalten |
+ if(SignalSchlecht) SignalSchlecht--; |
+ } |
+ else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debugwerte zuordnen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(!TimerWerteausgabe--) |
+ { |
+ TimerWerteausgabe = 49; |
+ DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
+ DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
+ DebugOut.Analog[2] = Mittelwert_AccNick; |
+ DebugOut.Analog[3] = Mittelwert_AccRoll; |
+ DebugOut.Analog[4] = MesswertGier; |
+ DebugOut.Analog[5] = HoehenWert; |
+ DebugOut.Analog[6] = (Mess_Integral_Hoch / 512); |
+ DebugOut.Analog[8] = KompassValue; |
+ DebugOut.Analog[9] = UBat; |
+ DebugOut.Analog[10] = SenderOkay; |
+ |
+/* DebugOut.Analog[16] = motor_rx[0]; |
+ DebugOut.Analog[17] = motor_rx[1]; |
+ DebugOut.Analog[18] = motor_rx[2]; |
+ DebugOut.Analog[19] = motor_rx[3]; |
+ DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
+ DebugOut.Analog[20] /= 14; |
+ DebugOut.Analog[21] = motor_rx[4]; |
+ DebugOut.Analog[22] = motor_rx[5]; |
+ DebugOut.Analog[23] = motor_rx[6]; |
+ DebugOut.Analog[24] = motor_rx[7]; |
+ DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
+*/ |
+// DebugOut.Analog[9] = MesswertNick; |
+// DebugOut.Analog[9] = SollHoehe; |
+// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
+// DebugOut.Analog[11] = KompassStartwert; |
+// DebugOut.Analog[10] = Parameter_Gyro_I; |
+// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
+// DebugOut.Analog[9] = KompassRichtung; |
+// DebugOut.Analog[10] = GasMischanteil; |
+// DebugOut.Analog[3] = HoeheD * 32; |
+// DebugOut.Analog[4] = hoehenregler; |
+ } |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
+ else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
+ if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
+ else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
+// MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
+ MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
+ |
+ // Maximalwerte abfangen |
+ #define MAX_SENSOR 2048 |
+ if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
+ if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
+ if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
+ if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
+ if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
+ if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Höhenregelung |
+// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+//OCR0B = 180 - (Poti1 + 120) / 4; |
+//DruckOffsetSetting = OCR0B; |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
+ { |
+ int tmp_int; |
+ if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
+ { |
+ if(Parameter_MaxHoehe < 50) |
+ { |
+ SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
+ HoehenReglerAktiv = 0; |
+ } |
+ else |
+ HoehenReglerAktiv = 1; |
+ } |
+ else |
+ { |
+ SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 20; |
+ HoehenReglerAktiv = 1; |
+ } |
+ |
+ if(Notlandung) SollHoehe = 0; |
+ h = HoehenWert; |
+ if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
+ { h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
+ h = GasMischanteil - h; // vom Gas abziehen |
+ h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
+ tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
+ if(tmp_int > 50) tmp_int = 50; |
+ else if(tmp_int < -50) tmp_int = -50; |
+ h -= tmp_int; |
+ hoehenregler = (hoehenregler*15 + h) / 16; |
+ if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
+ { |
+ if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
+ if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
+ } |
+ if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
+ GasMischanteil = hoehenregler; |
+ } |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Mischer und PI-Regler |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DebugOut.Analog[7] = GasMischanteil; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gier-Anteil |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MUL_G 1.0 |
+ GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
+//GierMischanteil = 0; |
+ if(GierMischanteil > (MUL_G * GasMischanteil)) GierMischanteil = MUL_G * GasMischanteil; |
+ if(GierMischanteil < -(MUL_G * GasMischanteil)) GierMischanteil = -(MUL_G * GasMischanteil); |
+ if(GierMischanteil > 100) GierMischanteil = 100; |
+ if(GierMischanteil < -100) GierMischanteil = -100; |
+ |
+ if(GasMischanteil < 20) GierMischanteil = 0; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Nick-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+ DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
+ SummeNick += DiffNick; // I-Anteil |
+ if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
+ if(SummeNick > 16000) SummeNick = 16000; |
+ if(SummeNick < -16000) SummeNick = -16000; |
+ pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
+ // Motor Vorn |
+#define MUL 2 |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ |
+ motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Vorne = motorwert; |
+ // Motor Heck |
+ motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Hinten = motorwert; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Roll-Achse |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
+ SummeRoll += DiffRoll; // I-Anteil |
+ if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
+ if(SummeRoll > 16000) SummeRoll = 16000; |
+ if(SummeRoll < -16000) SummeRoll = -16000; |
+ pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
+ if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
+ if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
+ // Motor Links |
+ motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Links = motorwert; |
+ // Motor Rechts |
+ motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Rechts = motorwert; |
+ // +++++++++++++++++++++++++++++++++++++++++++++++ |
+} |
+ |
/tags/V0.66a/fc.h |
---|
0,0 → 1,123 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Integral_Gier; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Gier; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern unsigned char MotorWert[5]; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
#define STRUCT_PARAM_LAENGE 58 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
#endif //_FC_H |
/tags/V0.66a/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="spi.h"></File><File path="spi.c"></File></Project> |
/tags/V0.66a/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/tags/V0.66a/gps.h |
---|
0,0 → 1,14 |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/tags/V0.66a/main.c |
---|
0,0 → 1,231 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
//unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
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 62 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 2); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
SPI_TransmitByte(); |
UpdateMotor=0; |
MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket(); |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/tags/V0.66a/main.h |
---|
0,0 → 1,100 |
#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 ANZ_MITTELWERT 4 |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
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 |
/tags/V0.66a/makefile |
---|
0,0 → 1,410 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 65 |
VERSION_INDEX = 0 |
VERSION_KOMPATIBEL = 5 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/tags/V0.66a/menu.c |
---|
0,0 → 1,118 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); } |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,0,"[%i]",MenuePunkt); |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"++ MikroKopter ++"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%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"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AccumulateNick / MessanzahlNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AccumulateRoll / MessanzahlRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AccumulateGier / MessanzahlGier, AdNeutralGier); |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",accumulate_AccNick / messanzahl_AccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",accumulate_AccRoll / messanzahl_AccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Aktuell_az/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/tags/V0.66a/menu.h |
---|
0,0 → 1,7 |
extern void Menu(void); |
void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/tags/V0.66a/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/tags/V0.66a/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/tags/V0.66a/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/tags/V0.66a/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if ((signal > 1500) && (signal < 8000)) |
{ |
index = 1; |
NewPpmData = 0; // Null bedeutet: Neue Daten |
// OCR2A = Poti2/2 + 80; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/tags/V0.66a/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/tags/V0.66a/spi.c |
---|
0,0 → 1,86 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
cli(); |
DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
sei(); |
//---- |
SPDR = ToNaviCtrl.Comp; // Start transmission |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ SPDR = Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
unsigned char i; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = (char) StickNick; |
ToNaviCtrl.StickRoll = (char) StickRoll; |
ToNaviCtrl.StickGier = (char) StickGier; |
sei(); |
} |
/tags/V0.66a/spi.h |
---|
0,0 → 1,46 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#endif |
/tags/V0.66a/timer0.c |
---|
0,0 → 1,158 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 4000)) |
{ |
KompassValue = cntKompass; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (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)); |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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; |
} |
} |
/tags/V0.66a/timer0.h |
---|
0,0 → 1,15 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
/tags/V0.66a/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; |
} |
/tags/V0.66a/twimaster.h |
---|
0,0 → 1,32 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
void i2c_init (void); // I2C initialisieren |
char i2c_start (void); // Start I2C |
void i2c_stop (void); // Stop I2C |
char i2c_write_byte (char byte); // 1 Byte schreiben |
#endif |
/tags/V0.66a/uart.c |
---|
0,0 → 1,332 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
// unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
//RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
static char dis_zeile = 0; |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++dis_zeile == 4) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
dis_zeile = -1; |
} |
else SendOutData('0' + dis_zeile,0,(unsigned char *)&DisplayBuff[20 * dis_zeile],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/tags/V0.66a/uart.h |
---|
0,0 → 1,93 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
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 int Debug_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern unsigned char MotorTest[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/tags/V0.66a/version.txt |
---|
0,0 → 1,82 |
------- |
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.65b I.BBusker 18.10.2007 |
- SPI-Kommunikation für NaviCtrl implementiert |