Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 1474 → Rev 1475

/branches/V0.76g-acid/servoboard/servoboard.c
12,16 → 12,18
uint16_t eeprom_pwm_limit[6] EEMEM;
 
uint8_t pwm_signal[6];
uint8_t pwm_neutral_position[6];
uint8_t pwm_position[6];
uint16_t pwm_limit[6];
uint8_t volatile pwm_neutral_position[6];
uint8_t volatile pwm_position[6];
uint16_t volatile pwm_limit[6];
uint8_t pwm_active;
uint8_t pwm_status = 1;
#if DEBUG_SIGNAL
uint8_t volatile display_values = 0;
#endif
 
 
void pwm_init() {
 
SERVODDR = 0xff;
SERVODDR = (1<<SERVO1) | (1<<SERVO2) | (1<<SERVO3) | (1<<SERVO4) | (1<<SERVO5) | (1<<SERVO6);
 
set_pwm();
 
61,12 → 63,12
void pwm_check_active() {
 
// check if pwm is configured
pwm_active = (pwm_limit[0] != 0xffff) ? (1 << SERVO1) : 0;
pwm_active |= (pwm_limit[1] != 0xffff) ? (1 << SERVO2) : 0;
pwm_active |= (pwm_limit[2] != 0xffff) ? (1 << SERVO3) : 0;
pwm_active |= (pwm_limit[3] != 0xffff) ? (1 << SERVO4) : 0;
pwm_active |= (pwm_limit[4] != 0xffff) ? (1 << SERVO5) : 0;
pwm_active |= (pwm_limit[5] != 0xffff) ? (1 << SERVO6) : 0;
pwm_active = (pwm_limit[0] != 0xffff) ? (1<<SERVO1) : 0;
pwm_active |= (pwm_limit[1] != 0xffff) ? (1<<SERVO2) : 0;
pwm_active |= (pwm_limit[2] != 0xffff) ? (1<<SERVO3) : 0;
pwm_active |= (pwm_limit[3] != 0xffff) ? (1<<SERVO4) : 0;
pwm_active |= (pwm_limit[4] != 0xffff) ? (1<<SERVO5) : 0;
pwm_active |= (pwm_limit[5] != 0xffff) ? (1<<SERVO6) : 0;
 
}
 
89,6 → 91,7
 
}
 
/*
void delay(int ms) {
 
while(ms--) {
96,8 → 99,8
}
 
}
*/
 
 
int main(void) {
 
uint8_t blink_counter = 0;
104,12 → 107,9
uint8_t blink = 0;
 
// intialize
DDRD = 0x80;
PORTD = 0x80;
DDRD = (1<<PD7);
PORTD = (1<<PD7);
 
DDRC &= ~0x0f;
PORTC |= 0x0f;
 
cli();
uart_init();
eeprom_init();
118,13 → 118,16
set_pwm_neutral();
sei();
 
// start pwm
TCNT1 = 0;
while(1) {
 
// start pwm
cli();
TCNT1 = 0;
SERVOPORT = pwm_active;
 
// update signals
set_pwm();
 
// show status
blink_counter++;
 
135,7 → 138,7
 
} else {
 
if (I2C_timeout) {
if (I2C_timeout) {
I2C_timeout--;
if (I2C_timeout == 0) { // no i2c signal
blink = 0;
160,10 → 163,12
}
}
 
// wait with high pwm signal
// till here the code execution takes less than 70ys, plenty enough time for some more calculations
 
// wait till 300ys are reached
while(TCNT1 < 300) ;
 
// check servos setting pwm to low
// check servo settings and set pwm to low
for(uint8_t i = 0; i < 255; i++) {
 
TCNT0 = 0;
190,18 → 195,34
while (TCNT0 < 60) ;
 
}
sei();
 
// set all servos to low
SERVOPORT = 0;
 
// update signals
set_pwm();
// enable interrupts and receive data while waiting till 20ms are reached and the next pulse has to be sent
sei();
 
// wait till 20ms are reached
#if DEBUG_SIGNAL
if (display_values) {
 
cli();
uart_putchar('\r');
for(uint8_t i = 0; i < 6; i++) {
uart_putchar(i+49);
uart_putchar(':');
uart_putchar((pwm_signal[i]/100)%10+48);
uart_putchar((pwm_signal[i]/10)%10+48);
uart_putchar((pwm_signal[i])%10+48);
uart_putchar(' ');
}
sei();
 
}
#endif
 
while(TCNT1 < 20000) ;
TCNT1 = 0;
 
 
}
 
return 0;
/branches/V0.76g-acid/servoboard/servoboard.h
1,14 → 1,15
 
 
#define VERSION "0.32"
#define VERSION "0.40"
#define DEBUG_SIGNAL 1
 
extern uint8_t pwm_position[6];
extern uint8_t pwm_neutral_position[6];
extern uint16_t pwm_limit[6];
extern uint8_t pwm_active;
extern uint8_t pwm_status;
extern volatile uint8_t pwm_position[6];
extern volatile uint8_t pwm_neutral_position[6];
extern volatile uint16_t pwm_limit[6];
#if DEBUG_SIGNAL
extern volatile uint8_t display_values;
#endif
 
 
void set_pwm();
void set_pwm_neutral();
void pwm_check_active();
28,14 → 29,15
#define SERVO5 PB4
#define SERVO6 PB5
 
 
//#define STK500
 
#ifdef STK500
#define LED_OFF PORTD |= 0x80;
#define LED_ON PORTD &= ~0x80
#define LED_IS_ON !(PORTD & 0x80)
#define LED_OFF PORTD |= (1<<PD7);
#define LED_ON PORTD &= ~(1<<PD7)
#define LED_IS_ON !(PORTD & (1<<PD7))
#else
#define LED_ON PORTD |= 0x80;
#define LED_OFF PORTD &= ~0x80
#define LED_IS_ON (PORTD & 0x80)
#define LED_ON PORTD |= (1<<PD7);
#define LED_OFF PORTD &= ~(1<<PD7)
#define LED_IS_ON (PORTD & (1<<PD7))
#endif
/branches/V0.76g-acid/servoboard/servoboard.hex
1,360 → 1,368
:1000000012C02BC02AC029C028C027C026C025C0C6
:1000100024C023C022C020C220C01FC01EC01DC0DB
:100020001CC084C11AC011241FBECFE5D4E0DEBFBE
:10003000CDBF13E0A0E6B0E0EEE7F3E102C005902B
:100040000D92AC34B107D9F713E0ACE4B3E001C0D2
:100050001D92AA3DB107E1F7EFC0D2CFEF92FF9218
:100060000F931F93CF93DF9307E613E021E6E22E71
:1000700023E0F22EEBE5F3E075E0AFE4B3E0E70157
:100080008881E8019881890F8F5780838D919C9199
:100090001197892B89F04D915C9111972D913C918D
:1000A0001197232F3327622F9081941708F44083F0
:1000B0008081681708F42083715012963196089455
:1000C000E11CF11C0F5F1F4F77FFD9CFDF91CF915C
:1000D0001F910F91FF90EF9008958FEF87BBBEDFC8
:1000E00082E08EBD81E083BF08959FE7E1E6F3E003
:1000F00085E09193815087FFFCCFB0DF089520E029
:1001000080914F03909150038F5F9F4F09F021E042
:1001100020936D0380916D03282F33278091510325
:10012000909152038F5F9F4F19F0C901826001C007
:10013000C90180936D0380916D03282F332780912F
:100140005303909154038F5F9F4F19F0C90183604F
:1001500001C0C90180936D0380916D03282F33275F
:1001600080915503909156038F5F9F4F19F0C901FD
:10017000846001C0C90180936D0380916D03282FB5
:10018000332780915703909158038F5F9F4F19F049
:10019000C901856001C0C90180936D0380916D0321
:1001A000282F33278091590390915A038F5F9F4FD7
:1001B00019F0C901866001C0C90180936D030895DB
:1001C000E199FECFE7E6F3E0A0E0B0E086E0182E8C
:1001D0005FD8EFE4F3E0A6E0B0E08CE0182E58D84A
:1001E0008EDF0895F894E7E6F3E0A0E0B0E086E063
:1001F000182E53D8EFE4F3E0A6E0B0E08CE0182E20
:100200004CD878940895CF93DF939C0121503040CF
:100210008FEF2F3F380769F0A0EDB7E0C0E0D0E0E6
:10022000CD010197F1F7215030408FEF2F3F380774
:10023000B9F7DF91CF910895CFE5D4E0DEBFCDBF10
:10024000C0E080E881BB82BB84B3807F84BB85B380
:100250008F6085BBF894D6D0B3DF82E856D03DDFFF
:1002600044DF78941DBC1CBCF89480916D0388BB5E
:10027000CF5F80916D03882311F462E308C0809101
:100280004C03882369F0815080934C0365E08C2FE8
:10029000F3D7992331F4C1E0979B02C0979801C02E
:1002A000979A8CB59DB58C529140D8F390E012BED0
:1002B00080915B03981709F4C09880915C039817AC
:1002C00009F4C19880915D03981709F4C298809150
:1002D0005E03981709F4C39880915F03981709F497
:1002E000C49880916003981709F4C59882B78C333D
:1002F000E8F39F5F9F3FD9F6789418BAAFDE8CB5CC
:100300009DB580529E44D8F3ADCF82B985EC86BFAF
:1003100008953FEF20E0261730F4FC018191382743
:100320002F5F2617D8F3832F992708951F920F92D6
:100330000FB60F9211242F933F934F935F936F93B8
:100340007F938F939F93AF93BF93EF93FF9381B16D
:100350009927887F90708036910569F081369105E4
:100360001CF4892BC9F13BC08038910551F0883FBE
:10037000910579F134C086B7806886BF10924D032D
:1003800030C085E080934C0390914D03903248F447
:10039000E92FFF27E259FC4F83B180839F5F909341
:1003A0004D0380914D03873089F466E08EE693E03B
:1003B000B0DF90917403891749F486E0AEE6B3E0AC
:1003C000E1E6F3E00D9001928A95E1F786B7806847
:1003D00007C086B7806986BF86B7806986BF85EC0F
:1003E00086BFFF91EF91BF91AF919F918F917F91C8
:1003F0006F915F914F913F912F910F900FBE0F9092
:100400001F90189510928E0310928F0388E18AB97D
:10041000599A579A87E689B960E070E08FE192E0D7
:10042000B9D280E690E09F938F9384E690E09F930B
:100430008F93F6D20F900F900F900F900895CF9357
:10044000C82F8A3011F48DE0FADF5D9BFECFCCB966
:1004500080E090E0CF9108951F920F920FB60F9217
:100460001124AF92BF92CF92DF92EF92FF920F933F
:100470001F932F933F934F935F936F937F938F932C
:100480009F93AF93BF93EF93FF93CF93DF93CDB73A
:10049000DEB72497DEBFCDBF80918E03803408F095
:1004A000C9C1FCB08BE2F81619F580914E03E82F14
:1004B000FF27EA59FC4F80818F3F19F080818F5FC1
:1004C0008083808199279F938F9380914E039927F2
:1004D0009F938F9385E790E09F938F93A1D2EDB781
:1004E000FEB736960FB6F894FEBF0FBEEDBFA5C19E
:1004F000FDE2FF1619F580914E03E82FFF27EA5918
:10050000FC4F8081882319F0808181508083808115
:1005100099279F938F9380914E0399279F938F9351
:1005200085E790E09F938F937BD28DB79EB7069619
:100530000FB6F8949EBF0FBE8DBF7FC18F2D7FDF9A
:100540009DE0F91609F06BC18AE079DF80918E0396
:10055000E82FFF27E057FC4F108210928E0368E8C7
:1005600070E080E993E0B4D1892B19F48DE890E034
:1005700050C167E972E080E993E0AAD10097B9F52C
:1005800007E6A02E03E0B02E9C0115E0F12E0F2E01
:10059000FFE4CF2EF3E0DF2EF02DF6018081918174
:1005A000892F99279F938F93819191916F019070DB
:1005B0009F938F93F50181915F0199279F938F936B
:1005C00089010F5F1F4F1F930F938FE992E09F9355
:1005D0008F9326D28DB79EB70A960FB6F8949EBF1A
:1005E0000FBE8DBFFA949801F7FED7CF13C162EC0E
:1005F00072E080E993E06CD10097A9F5E7E6AE2EB2
:10060000E3E0BE2E9C0175E0F72E6FE4C62E63E09A
:10061000D62EF60180819181892F99279F938F9300
:10062000819191916F0190709F938F93F5018191CA
:100630005F0199279F938F9389010F5F1F4F1F932E
:100640000F9389EC92E09F938F93EAD18DB79EB779
:100650000A960FB6F8949EBF0FBE8DBFFA9498010C
:10066000F7FED7CFD7C06AED72E080E993E030D1D2
:10067000892B11F4A5DDCEC06FED72E080E993E027
:1006800027D1892B11F4AEDDC5C044E050E064EE03
:1006900072E080E993E02ED17C01892B59F5AE01FF
:1006A0004F5F5F4F69EE72E080E993E039D1892BAB
:1006B00009F4B0C0AE014F5F5F4F6BEE72E0C7014F
:1006C0002FD1009709F4A6C0D7D0F82EF394863026
:1006D00008F09AC0F0924E038F2D99279F938F9325
:1006E0008CEE92E09F938F939BD10F900F900F9081
:1006F0000F9090C044E050E06EEF72E080E993E02C
:10070000F9D06C01892B09F082C0AE014D5F5F4FBB
:1007100069EE72E080E993E003D1892B09F47AC095
:10072000AE014D5F5F4F63E073E0C601F9D0009703
:1007300009F470C0A1D0082F0150063008F064C041
:10074000AE014D5F5F4F65E073E0C601E9D00097F1
:1007500009F460C0AA24BA2CE02EFF2487010959AD
:100760001C4F8AD0F8018083AE014D5F5F4F65E07A
:1007700073E0C601D5D0009781F07ED0A82EAE01DF
:100780004D5F5F4F6BEE72E0C601CAD0009719F063
:1007900073D0B82E02C04FEFB42E87010E0D1F1D6F
:1007A000015B1C4F8B2D9927982F88272A2D3327E3
:1007B000822B932BF80191838083A1DCF801808147
:1007C0009181892F99279F938F9380819181907038
:1007D0009F938F93F701E959FC4F808199279F934D
:1007E0008F930894E11CF11CFF92EF928FE992E045
:1007F0009F938F9315D18DB79EB70A960FB6F89435
:100800009EBF0FBE8DBF06C087E093E002C085E1AA
:1008100093E01AD18EE313DE80E211DE0EC08091E8
:100820008E03E82FFF27E057FC4FF0828F5F809305
:100830008E0303C080E393E007D12496F894DEBFD3
:10084000CDBFDF91CF91FF91EF91BF91AF919F917C
:100850008F917F916F915F914F913F912F911F9158
:100860000F91FF90EF90DF90CF90BF90AF900F90DF
:100870000FBE0F901F901895FC0188279927E894C8
:1008800021912223E9F02032D9F32930C9F32A300B
:10089000B9F32C30A9F32D3099F3263789F32B3295
:1008A00019F02D3221F468942191222349F020334C
:1008B0003CF02A332CF4205365D0820F911DF4CFE5
:1008C0008115910521F01EF480959095019608956B
:1008D000FB01DC018D916191562F5062513624F05D
:1008E0005B3714F460628062861B11F4662391F713
:1008F000990B0895FB01DC014150504070F08D913F
:100900003191232F2062213624F02B3714F43062EA
:100910008062831B19F4332379F7881B990B0895A0
:10092000009731F4DA018D919C91009709F40EC083
:10093000DC01FB013D912191222319F03217C9F30B
:10094000FACF332331F4DA011D921C9288279927BC
:1009500008951197AF93BF93FB013D9121913217F9
:1009600071F4332321F488279927119702C01E922E
:100970001196FA01A193B0839F918F91089522233C
:1009800069F7EACF7AE0979F902D879F802D910D90
:10099000112408950F931F93CF93DF938C01EB01E4
:1009A000009711F4672BB9F16EE070E081E090E000
:1009B00000D3FC01892B71F180E88383209771F0CB
:1009C000D387C28781E883838091D0039091D1033C
:1009D000892B21F4F093D103E093D0030115110585
:1009E000C9F0118700878381826083838091D2035D
:1009F0009091D303892B71F4F093D303E093D20346
:100A00008091D4039091D503892B21F4F093D503E1
:100A1000E093D403CF01DF91CF911F910F910895FF
:100A2000A0E0B0E0E5E1F5E083C4E5E0F0E0EC0F44
:100A3000FD1F81919191AF01BC018091D2039091F2
:100A4000D30338D0E2E090C40F931F93CF93DF938A
:100A5000EC0100E010E0E091D203F091D303838138
:100A600081FD03C08FEF9FEF20C08991882371F033
:100A7000E091D203F091D30320853185BF01F901C4
:100A80000995892B91F30FEF1FEFEFCFE091D20380
:100A9000F091D30320853185BF018AE0F9010995E2
:100AA000892B11F00FEF1FEFC801DF91CF911F913C
:100AB0000F910895A2E1B0E0EFE5F5E029C4EE243E
:100AC000FF2487011C017E876D872A01CC24DD2449
:100AD000FC01D782C682838181FD55C28FEF9FEFD3
:100AE00065C28D859E8501969E878D87C0FE39C221
:100AF0008F8580538A30D0F49F85903339F46620F7
:100B000029F4C3FC03C0E0E0F1E08DC08AE0689EF8
:100B1000602C1124FF856F0E20ED620E67FE02C06F
:100B20005FE7652EC3FC2FC2762C2DC2C3FE04C026
:100B3000662011F441E0642EEF858E2F992787FD02
:100B40009095883691058CF5853691050CF06EC030
:100B50008335910509F492C084359105CCF48B322C
:100B6000910509F449C08C3291054CF4803291050D
:100B700009F446C08332910509F44AC0EDC18D32B3
:100B8000910509F440C08E32910509F444C0E4C1D6
:100B90008336910509F450C0843691050CF087C066
:100BA0008835910509F4B9C0D7C18037910509F49A
:100BB000AEC08137910584F48C36910591F18D3664
:100BC00091052CF48936910509F471C0C5C18F36A1
:100BD000910509F499C0C0C18537910509F49FC0FA
:100BE0008637910524F48337910571F1B5C18837B3
:100BF000910509F492C0B0C180E190E0C82AD92AD9
:100C0000E0E2F0E010C080E890E0C82AD92ABBC139
:100C1000E0E4F0E008C088E090E0C82AD92A662421
:100C2000B2C1E4E0F0E0CE2ADF2AADC13FE3E32E1B
:100C30007A94F3E6FF8731C1F20182E090E0480E3A
:100C4000591EE0807A9429C1F20182E090E0480EBA
:100C5000591EA081B1817D01C3FE08C0862D992750
:100C600087FD9095BC01CD01CFD21DC0FD01019043
:100C70000020E9F73197EA1BE88B16C0F20182E009
:100C800090E0480E591E0190F081E02D7F01C3FED7
:100C900008C0862D992787FD9095BC01CF01A2D26F
:100CA00002C0CF0196D2888B9889791AF6C0C2FE0D
:100CB0000AC0F20184E090E0480E591E2081318183
:100CC000428153810CC0F20182E090E0480E591E2F
:100CD000808191819C01442737FD4095542F7901F3
:100CE0008A0157FF0CC0E2E0F0E0CE2ADF2A10951F
:100CF0000095F094E094E11CF11C011D111D8FEB97
:100D00009FEFC822D92227C098E0988B08C0E0E462
:100D1000F0E0CE2ADF2AF8E7FF8720E1288BC2FE29
:100D20000AC0F20184E090E0480E591E2081318112
:100D3000428153810AC0F20182E090E0480E591EC0
:100D4000808191819C014427552779018A01EFEC2C
:100D5000FFEFCE22DF22CE0101969A8B898B9889F4
:100D6000892E9924AA24BB24C801B701A5019401A6
:100D7000ADD2DC01CB01E989FA8980838A3024F085
:100D8000FF858F0F815201C0805DE989FA898193C7
:100D9000FA8BE98BC801B701A501940197D27901BB
:100DA0008A012115310541055105F1F6E98881E0F7
:100DB00090E08C0F9D1FE81AC60182739070892BFA
:100DC00009F07A94C6FE0DC0872D992787FD90956E
:100DD000E889E03121F42EEF722E780E02C0782ED1
:100DE0007A94C3FE0FC0262D332727FD30958E2D14
:100DF0009927821793072CF087EF9FEFC822D922FB
:100E000001C06E18C3FE02C0761801C07E18C6016C
:100E100080789170892B49F4872D7A9418162CF4D8
:100E2000B10180E290E0FBD1F7CFC1FE04C0B10177
:100E30008DE290E00BC0C4FE04C0B1018BE290E0F3
:100E400005C0C5FE04C0B10180E290E0E8D1C6FE55
:100E50000EC0B10180E390E0E2D19889903139F47D
:100E6000B101EF858E2F992787FD9095D8D1D0FEBF
:100E700009C0872D7A9418162CF4B10180E390E014
:100E8000CED1F7CFC3FE09C0862D6A9418162CF474
:100E9000B10180E390E0C3D1F7CF90E8B92EBC2038
:100EA00049F4872D7A9418162CF4B10180E290E071
:100EB000B6D1F7CFFF85F33639F48E2DB1019927DE
:100EC00087FD9095ACD13DC02F852337A9F4888943
:100ED0008150888B8F3FA9F1F70180810894E11C34
:100EE000F11CB101992787FD909599D1988991506E
:100EF000988B9F3F89F725C0EF85E33571F4F8891A
:100F0000F150F88BFF3FE9F0F7018491B101992787
:100F100086D10894E11CF11CF2CF6E010894C11C2B
:100F2000D11C89899A898C159D0559F0E989FA891E
:100F30008291FA8BE98BB101992787FD90956FD14A
:100F4000F0CFBB2059F0872D7A9418163CF4B101EC
:100F500080E290E064D1F7CFB10161D1CC24DD24EF
:100F600012C09F85953241F481E0C82ED12C6624B1
:100F7000762CEAE0E88B07C0B101FF858F2F992717
:100F800087FD90954CD1F101838183FF04C0ED85ED
:100F9000FE85F49103C0ED85FE85F081FF872F85E6
:100FA000222309F09ECDF10186819781E2E16296CC
:100FB000CBC10F931F93CF93DF93869F8001879FB1
:100FC000100D969F100D1124C8010DD0EC01009753
:100FD00021F0A80160E070E010D1CE01DF91CF9147
:100FE0001F910F910895CF93DF93AC01029710F4F6
:100FF00042E050E020E030E0A091D803B091D90366
:10100000BD01F901109709F44CC08D919C91119785
:101010008417950731F14817590738F42115310520
:1010200019F08217930708F49C01FD01A281B38196
:10103000109759F721153105A1F1C901841B950BB2
:10104000049708F4A901DB01E0E0F0E0109749F112
:101050008D919C91119782179307F9F442175307CA
:1010600079F4ED018A819B81309719F09383828313
:1010700004C09093D9038093D803CD0102964AC04F
:10108000241B350BFD01E20FF31F419351932250B6
:1010900030402D933C93CF013DC0FD01A281B3812F
:1010A000D5CF8091D6039091D703892B41F48091BD
:1010B0004703909148039093D7038093D603E09120
:1010C0004503F0914603309741F4EDB7FEB78091A8
:1010D000490390914A03E81BF90BA091D603B09104
:1010E000D7039F012A1B3B0B2417350788F0CA0141
:1010F00002962817390760F0CD01840F951F0296DC
:101100009093D7038093D6034D935D93CD0102C096
:1011100080E090E0DF91CF910895CF93DF93009727
:1011200009F454C0DC011297ED011B821A828091F0
:10113000D8039091D903009721F1FC0140E050E0E1
:10114000EA17FB0718F1ED01FB83EA832D913C912F
:101150001197C20FD31FCE0102968E179F0771F40D
:101160008A819B81280F391F2E5F3F4F11963C9338
:101170002E9382819381FD019383828341155105D2
:1011800059F4B093D903A093D80320C0AF010280D3
:10119000F381E02D3097A1F6EA01BB83AA83CA014F
:1011A000029628813981820F931F8A179B0771F459
:1011B0008D919C911197280F391F2E5F3F4F3983D6
:1011C0002883FD01828193819B838A83DF91CF9164
:1011D0000895FC0105900020E9F7809590958E0F09
:1011E0009F1F0895FC010590615070400110D8F7D1
:1011F000809590958E0F9F1F0895DC0101C06D931F
:1012000041505040E0F70895FC016150704001905A
:101210000110D8F7809590958E0F9F1F08950F931A
:101220001F93CF93DF938C01EB018B81992781FF73
:101230001CC082FF0DC02E813F818C819D812817AB
:10124000390764F4E881F9810193F983E88306C0E2
:10125000E885F985802F0995892B39F48E819F8146
:1012600001969F838E83C80102C08FEF9FEFDF91AD
:10127000CF911F910F910895991B79E004C0991F98
:10128000961708F0961B881F7A95C9F780950895E0
:1012900009D001921A94E1F7089501900BD01A94A5
:1012A000E1F70895E199FECFBFBBAEBBE09A11967E
:1012B0000DB20895E199FECFBFBBAEBB0DBA11963A
:1012C0000FB6F894E29AE19A0FBE0895A1E21A2EA1
:1012D000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FDA
:1012E000A217B307E407F50720F0A21BB30BE40B2A
:1012F000F50B661F771F881F991F1A9469F7609571
:101300007095809590959B01AC01BD01CF0108952A
:101310002F923F924F925F926F927F928F929F9205
:10132000AF92BF92CF92DF92EF92FF920F931F93F3
:10133000CF93DF93CDB7DEB7CA1BDB0B0FB6F894A4
:10134000DEBF0FBECDBF09942A88398848885F84E4
:101350006E847D848C849B84AA84B984C884DF8055
:10136000EE80FD800C811B81AA81B981CE0FD11D39
:0E1370000FB6F894DEBF0FBECDBFED0108959D
:10137E00302E3300736572766F626F617264202552
:10138E00730A3E2000534552564F20256420564185
:10139E004C55452025640A0048454C50004449539D
:1013AE00504C415920202020202020202020202079
:1013BE002020202020446973706C6179207365723F
:1013CE00766F2073657474696E67730A4558504F53
:1013DE005254202020202020202020202020202099
:1013EE00202020204578706F7274207372766F20E3
:1013FE0073657474696E67730A53455420733D6E3A
:10140E005B2C6C2C755D202020202020202020209D
:10141E002053657420736572766F207365747469DA
:10142E006E67730A202020202020202020202020DC
:10143E00202020202020202020202020202020209E
:10144E0073203D20736572766F206E756D626572C6
:10145E002028312D36290A2020202020202020204F
:10146E00202020202020202020202020202020206E
:10147E002020206E203D206E65757472616C207088
:10148E006F736974696F6E2028302D323535290AD5
:10149E00202020202020202020202020202020203E
:1014AE002020202020202020202020206C203D20C5
:1014BE006C6F776572206C696D69742028302D32DF
:1014CE003535290A202020202020202020202020F1
:1000100024C023C022C080C220C01FC01EC01DC07B
:100020001CC0B9C11AC011241FBECFE5D4E0DEBF89
:10003000CDBF13E0A0E6B0E0EEEBF3E102C0059027
:100040000D92A838B107D9F714E0A8E8B3E001C0D1
:100050001D92A631B107E1F7E7C0D2CFCF92DF9270
:10006000FF920F931F93CF93DF9303EA13E07DE991
:10007000C72E73E0D72EE7E9F3E065E0F62EABE894
:10008000B3E0E6013881E8018881380F3F573083BB
:100090008D919C911197892B89F04D915C911197CD
:1000A000242F8D919C911197692F7727962F3217C6
:1000B00008F440838081981708F46083FA941296BC
:1000C00031960894C11CD11C0F5F1F4FF7FED9CF8A
:1000D000DF91CF911F910F91FF90DF90CF90089506
:1000E0008FE387BBBBDF82E08EBD81E083BF0895D5
:1000F0009FE7EDE9F3E085E09193815087FFFCCF26
:10010000ADDF089520E080918B0390918C038F5F89
:100110009F4F09F021E02093A903332780918D039D
:1001200090918E038F5F9F4F19F0C901826001C0CB
:10013000C9018093A903282F332780918F039091C1
:1001400090038F5F9F4F19F0C901846001C0C901FE
:100150008093A903282F33278091910390919203D4
:100160008F5F9F4F19F0C901886001C0C90180935A
:10017000A903282F332780919303909194038F5FD5
:100180009F4F19F0C901806101C0C9018093A90383
:10019000282F332780919503909196038F5F9F4F6F
:1001A00019F0C901806201C0C9018093A9030895B3
:1001B000E199FECFE3EAF3E0A0E0B0E086E0182E9C
:1001C00087D8EBE8F3E0A6E0B0E08CE0182E80D80A
:1001D00099DF0895F894E3EAF3E0A0E0B0E086E068
:1001E000182E7BD8EBE8F3E0A6E0B0E08CE0182E08
:1001F00074D878940895CF93DF939C0121503040B8
:100200008FEF2F3F380769F0A0EDB7E0C0E0D0E0F6
:10021000CD010197F1F7215030408FEF2F3F380784
:10022000B9F7DF91CF910895CFE5D4E0DEBFCDBF20
:10023000C0E01C2F80E881BB82BBF89418D1B8DFE6
:1002400082E898D04DDF54DF7894F8941DBC1CBC34
:100250008091A90388BB02DFCF5F8091A903882327
:1002600029F412E381E08093600018C08091890333
:10027000882391F080918903815080938903809134
:100280008903882329F482E08093600031DFE6DE71
:1002900015E01092600002C0112351F08C2F612FE5
:1002A0000BD8992331F4C1E0979B02C0979801C005
:1002B000979A8CB59DB58C529140D8F320E07091FF
:1002C0009703609198035091990340919A0330915C
:1002D0009B0390919C0312BE271709F4C098261720
:1002E00009F4C198251709F4C298241709F4C39892
:1002F000231709F4C498291709F4C59882B78C33D9
:10030000E8F32F5F2F3F39F718BA7894809188036C
:10031000882351F1892F99279F938F9380919B0375
:1003200099279F938F9380919A0399279F938F93F7
:100330008091990399279F938F9380919803992790
:100340009F938F938091970399279F938F9381E633
:1003500090E09F938F9384D38DB79EB70E960FB680
:10036000F8949EBF0FBE8DBF8CB59DB580529E4444
:10037000D8F36BCF82B985EC86BF08953FEF20E0BC
:10038000261730F4FC01819138272F5F2617D8F308
:10039000832F992708951F920F920FB60F92112461
:1003A0002F933F934F935F936F937F938F939F937D
:1003B000AF93BF93EF93FF9381B19927887F90709C
:1003C0008036910569F0813691051CF4892BC9F1BD
:1003D0003BC08038910551F0883F910579F134C0D8
:1003E00086B7806886BF10928A0330C083E080930E
:1003F000890390918A03903248F4E92FFF27E6554C
:10040000FC4F83B180839F5F90938A0380918A031E
:10041000873089F466E08AEA93E0B0DF9091B00318
:10042000891749F486E0AAEAB3E0EDE9F3E00D901C
:1004300001928A95E1F786B7806807C086B7806920
:1004400086BF86B7806986BF85EC86BFFF91EF9136
:10045000BF91AF919F918F917F916F915F914F91DC
:100460003F912F910F900FBE0F901F9018951092F3
:10047000CA031092CB0388E18AB9599A579A87E642
:1004800089B960E070E08FE792E0A4D28DE890E057
:100490009F938F9382E990E09F938F93E1D20F9087
:1004A0000F900F900F900895282F3327F901E20F36
:1004B000F31FE557FC4F80819181892F99279F93E6
:1004C0008F938081918190709F938F93F901ED5567
:1004D000FC4F808199279F938F932F5F3F4F3F93CE
:1004E0002F9383EA90E09F938F93BAD28DB79EB7F4
:1004F0000A960FB6F8949EBF0FBE8DBF0895CF9396
:10050000C82F8A3011F48DE0FADF5D9BFECFCCB9A5
:1005100080E090E0CF9108951F920F920FB60F9256
:100520001124AF92BF92CF92DF92EF92FF920F937E
:100530001F932F933F934F935F936F937F938F936B
:100540009F93AF93BF93EF93FF93CF93DF93CDB779
:10055000DEB72497DEBFCDBF0CB18091CA038034D3
:1005600008F086C10B3211F00D3201F50B3261F447
:1005700080918C00E82FFF27ED55FC4F80818F3F45
:1005800089F080818F5F0DC00D3261F480918C0005
:10059000E82FFF27ED55FC4F8081882319F08081DB
:1005A0008150808380918C007FDF67C1802FA7DF1F
:1005B0000D3009F052C18AE0A2DF8091CA03082FF2
:1005C000112704531C4FF80110821092CA0364ECE7
:1005D00070E08CEC93E09CD1892B19F489EC90E0CD
:1005E00036C16CED72E08CEC93E092D1892B41F432
:1005F000F8010081802F58DF0F5F0630D8F328C143
:1006000064EE72E08CEC93E083D1892B51F4F80115
:10061000908180918803882309F491E09093880366
:1006200017C167EE72E08CEC93E072D1892B11F464
:10063000BFDD0EC16CEE72E08CEC93E069D1892BCA
:1006400011F4C8DD05C144E050E061EF72E08CECCC
:1006500093E070D18C01892B59F5AE014F5F5F4F4C
:1006600066EF72E08CEC93E07BD1892B09F4F0C04B
:10067000AE014F5F5F4F68EF72E0C80171D1009724
:1006800009F4E6C019D1082F8150863008F0DAC08D
:1006900080938C00802F99279F938F938AEF92E00D
:1006A0009F938F93DDD10F900F900F900F90D0C03C
:1006B0006CE073E08CEC93E02BD1892BB9F4409182
:1006C0008C00E42FFF27DF01AE0FBF1FA557BC4FE3
:1006D0008D919C9111978070ED55FC4F20813327AF
:1006E000822B932B11969C938E931FC062E173E033
:1006F0008CEC93E00DD1892BD9F440918C00E42F40
:10070000FF27DF01AE0FBF1FA557BC4F2D913C91B6
:1007100011973070ED55FC4F80819927982F8827CD
:10072000282B392B11963C932E93842FBDDE90C03D
:1007300044E050E068E173E08CEC93E0FBD06C01A6
:10074000892B09F082C0AE014D5F5F4F66EF72E00A
:100750008CEC93E005D1892B09F47AC0AE014D5F92
:100760005F4F6DE173E0C601FBD0009709F470C0E4
:10077000A3D0082F0150063008F064C0AE014D5FD1
:100780005F4F68EF72E0C601EBD0009709F460C0DC
:10079000AA24BA2CE02EFF2487010D551C4F8CD0C3
:1007A000F8018083AE014D5F5F4F68EF72E0C601D4
:1007B000D7D0009781F080D0A82EAE014D5F5F4F5B
:1007C0006FE173E0C601CCD0009719F075D0B82E58
:1007D00002C07FEFB72E87010E0D1F1D05571C4F5E
:1007E0008B2D9927982F88272A2D3327822B932BFF
:1007F000F8019183808386DCF80180819181892FC3
:1008000099279F938F938081918190709F938F936D
:10081000F701ED55FC4F808199279F938F930894A2
:10082000E11CF11CFF92EF9280E293E09F938F9383
:1008300017D18DB79EB70A960FB6F8949EBF0FBE1C
:100840008DBF06C083E493E002C081E593E01CD134
:100850008EE355DE80E253DE10C08091CA03E82F9C
:10086000FF27E453FC4F00838F5F8093CA0305C0CA
:100870008CE693E009D11092CA032496F894DEBF67
:10088000CDBFDF91CF91FF91EF91BF91AF919F913C
:100890008F917F916F915F914F913F912F911F9118
:1008A0000F91FF90EF90DF90CF90BF90AF900F909F
:1008B0000FBE0F901F901895FC0188279927E89488
:1008C00021912223E9F02032D9F32930C9F32A30CB
:1008D000B9F32C30A9F32D3099F3263789F32B3255
:1008E00019F02D3221F468942191222349F020330C
:1008F0003CF02A332CF4205365D0820F911DF4CFA5
:100900008115910521F01EF480959095019608952A
:10091000FB01DC018D916191562F5062513624F01C
:100920005B3714F460628062861B11F4662391F7D2
:10093000990B0895FB01DC014150504070F08D91FE
:100940003191232F2062213624F02B3714F43062AA
:100950008062831B19F4332379F7881B990B089560
:10096000009731F4DA018D919C91009709F40EC043
:10097000DC01FB013D912191222319F03217C9F3CB
:10098000FACF332331F4DA011D921C92882799277C
:1009900008951197AF93BF93FB013D9121913217B9
:1009A00071F4332321F488279927119702C01E92EE
:1009B0001196FA01A193B0839F918F9108952223FC
:1009C00069F7EACF7AE0979F902D879F802D910D50
:1009D000112408950F931F93CF93DF938C01EB01A4
:1009E000009711F4672BB9F16EE070E081E090E0C0
:1009F00000D3FC01892B71F180E88383209771F08B
:100A0000D387C28781E8838380910C0490910D0481
:100A1000892B21F4F0930D04E0930C0401151105CA
:100A2000C9F01187008783818260838380910E04DF
:100A300090910F04892B71F4F0930F04E0930E044E
:100A40008091100490911104892B21F4F0931104EA
:100A5000E0931004CF01DF91CF911F910F91089582
:100A6000A0E0B0E0E5E3F5E083C4E5E0F0E0EC0F02
:100A7000FD1F81919191AF01BC0180910E04909175
:100A80000F0438D0E2E090C40F931F93CF93DF930D
:100A9000EC0100E010E0E0910E04F0910F0483817E
:100AA00081FD03C08FEF9FEF20C08991882371F0F3
:100AB000E0910E04F0910F0420853185BF01F9010A
:100AC0000995892B91F30FEF1FEFEFCFE0910E0403
:100AD000F0910F0420853185BF018AE0F901099565
:100AE000892B11F00FEF1FEFC801DF91CF911F91FC
:100AF0000F910895A2E1B0E0EFE7F5E029C4EE24FC
:100B0000FF2487011C017E876D872A01CC24DD2408
:100B1000FC01D782C682838181FD55C28FEF9FEF92
:100B200065C28D859E8501969E878D87C0FE39C2E0
:100B30008F8580538A30D0F49F85903339F46620B6
:100B400029F4C3FC03C0E0E0F1E08DC08AE0689EB8
:100B5000602C1124FF856F0E20ED620E67FE02C02F
:100B60005FE7652EC3FC2FC2762C2DC2C3FE04C0E6
:100B7000662011F441E0642EEF858E2F992787FDC2
:100B80009095883691058CF5853691050CF06EC0F0
:100B90008335910509F492C084359105CCF48B32EC
:100BA000910509F449C08C3291054CF480329105CD
:100BB00009F446C08332910509F44AC0EDC18D3273
:100BC000910509F440C08E32910509F444C0E4C196
:100BD0008336910509F450C0843691050CF087C026
:100BE0008835910509F4B9C0D7C18037910509F45A
:100BF000AEC08137910584F48C36910591F18D3624
:100C000091052CF48936910509F471C0C5C18F3660
:100C1000910509F499C0C0C18537910509F49FC0B9
:100C20008637910524F48337910571F1B5C1883772
:100C3000910509F492C0B0C180E190E0C82AD92A98
:100C4000E0E2F0E010C080E890E0C82AD92ABBC1F9
:100C5000E0E4F0E008C088E090E0C82AD92A6624E1
:100C6000B2C1E4E0F0E0CE2ADF2AADC13FE3E32EDB
:100C70007A94F3E6FF8731C1F20182E090E0480EFA
:100C8000591EE0807A9429C1F20182E090E0480E7A
:100C9000591EA081B1817D01C3FE08C0862D992710
:100CA00087FD9095BC01CD01CFD21DC0FD01019003
:100CB0000020E9F73197EA1BE88B16C0F20182E0C9
:100CC00090E0480E591E0190F081E02D7F01C3FE97
:100CD00008C0862D992787FD9095BC01CF01A2D22F
:100CE00002C0CF0196D2888B9889791AF6C0C2FECD
:100CF0000AC0F20184E090E0480E591E2081318143
:100D0000428153810CC0F20182E090E0480E591EEE
:100D1000808191819C01442737FD4095542F7901B2
:100D20008A0157FF0CC0E2E0F0E0CE2ADF2A1095DE
:100D30000095F094E094E11CF11C011D111D8FEB56
:100D40009FEFC822D92227C098E0988B08C0E0E422
:100D5000F0E0CE2ADF2AF8E7FF8720E1288BC2FEE9
:100D60000AC0F20184E090E0480E591E20813181D2
:100D7000428153810AC0F20182E090E0480E591E80
:100D8000808191819C014427552779018A01EFECEC
:100D9000FFEFCE22DF22CE0101969A8B898B9889B4
:100DA000892E9924AA24BB24C801B701A501940166
:100DB000ADD2DC01CB01E989FA8980838A3024F045
:100DC000FF858F0F815201C0805DE989FA89819387
:100DD000FA8BE98BC801B701A501940197D279017B
:100DE0008A012115310541055105F1F6E98881E0B7
:100DF00090E08C0F9D1FE81AC60182739070892BBA
:100E000009F07A94C6FE0DC0872D992787FD90952D
:100E1000E889E03121F42EEF722E780E02C0782E90
:100E20007A94C3FE0FC0262D332727FD30958E2DD3
:100E30009927821793072CF087EF9FEFC822D922BA
:100E400001C06E18C3FE02C0761801C07E18C6012C
:100E500080789170892B49F4872D7A9418162CF498
:100E6000B10180E290E0FBD1F7CFC1FE04C0B10137
:100E70008DE290E00BC0C4FE04C0B1018BE290E0B3
:100E800005C0C5FE04C0B10180E290E0E8D1C6FE15
:100E90000EC0B10180E390E0E2D19889903139F43D
:100EA000B101EF858E2F992787FD9095D8D1D0FE7F
:100EB00009C0872D7A9418162CF4B10180E390E0D4
:100EC000CED1F7CFC3FE09C0862D6A9418162CF434
:100ED000B10180E390E0C3D1F7CF90E8B92EBC20F8
:100EE00049F4872D7A9418162CF4B10180E290E031
:100EF000B6D1F7CFFF85F33639F48E2DB10199279E
:100F000087FD9095ACD13DC02F852337A9F4888902
:100F10008150888B8F3FA9F1F70180810894E11CF3
:100F2000F11CB101992787FD909599D1988991502D
:100F3000988B9F3F89F725C0EF85E33571F4F889D9
:100F4000F150F88BFF3FE9F0F7018491B101992747
:100F500086D10894E11CF11CF2CF6E010894C11CEB
:100F6000D11C89899A898C159D0559F0E989FA89DE
:100F70008291FA8BE98BB101992787FD90956FD10A
:100F8000F0CFBB2059F0872D7A9418163CF4B101AC
:100F900080E290E064D1F7CFB10161D1CC24DD24AF
:100FA00012C09F85953241F481E0C82ED12C662471
:100FB000762CEAE0E88B07C0B101FF858F2F9927D7
:100FC00087FD90954CD1F101838183FF04C0ED85AD
:100FD000FE85F49103C0ED85FE85F081FF872F85A6
:100FE000222309F09ECDF10186819781E2E162968C
:100FF000CBC10F931F93CF93DF93869F8001879F71
:10100000100D969F100D1124C8010DD0EC01009712
:1010100021F0A80160E070E010D1CE01DF91CF9106
:101020001F910F910895CF93DF93AC01029710F4B5
:1010300042E050E020E030E0A0911404B0911504AB
:10104000BD01F901109709F44CC08D919C91119745
:101050008417950731F14817590738F421153105E0
:1010600019F08217930708F49C01FD01A281B38156
:10107000109759F721153105A1F1C901841B950B72
:10108000049708F4A901DB01E0E0F0E0109749F1D2
:101090008D919C91119782179307F9F4421753078A
:1010A00079F4ED018A819B81309719F093838283D3
:1010B00004C09093150480931404CD0102964AC095
:1010C000241B350BFD01E20FF31F41935193225076
:1010D00030402D933C93CF013DC0FD01A281B381EF
:1010E000D5CF8091120490911304892B41F4809103
:1010F0008303909184039093130480931204E091EE
:101100008103F0918203309741F4EDB7FEB78091EF
:10111000850390918603E81BF90BA0911204B0910E
:1011200013049F012A1B3B0B2417350788F0CA01C3
:1011300002962817390760F0CD01840F951F02969B
:1011400090931304809312044D935D93CD0102C0DC
:1011500080E090E0DF91CF910895CF93DF930097E7
:1011600009F454C0DC011297ED011B821A828091B0
:10117000140490911504009721F1FC0140E050E027
:10118000EA17FB0718F1ED01FB83EA832D913C91EF
:101190001197C20FD31FCE0102968E179F0771F4CD
:1011A0008A819B81280F391F2E5F3F4F11963C93F8
:1011B0002E9382819381FD01938382834115510592
:1011C00059F4B0931504A093140420C0AF01028019
:1011D000F381E02D3097A1F6EA01BB83AA83CA010F
:1011E000029628813981820F931F8A179B0771F419
:1011F0008D919C911197280F391F2E5F3F4F398396
:101200002883FD01828193819B838A83DF91CF9123
:101210000895FC0105900020E9F7809590958E0FC8
:101220009F1F0895FC010590615070400110D8F790
:10123000809590958E0F9F1F0895DC0101C06D93DE
:1012400041505040E0F70895FC016150704001901A
:101250000110D8F7809590958E0F9F1F08950F93DA
:101260001F93CF93DF938C01EB018B81992781FF33
:101270001CC082FF0DC02E813F818C819D8128176B
:10128000390764F4E881F9810193F983E88306C0A2
:10129000E885F985802F0995892B39F48E819F8106
:1012A00001969F838E83C80102C08FEF9FEFDF916D
:1012B000CF911F910F910895991B79E004C0991F58
:1012C000961708F0961B881F7A95C9F780950895A0
:1012D00009D001921A94E1F7089501900BD01A9465
:1012E000E1F70895E199FECFBFBBAEBBE09A11963E
:1012F0000DB20895E199FECFBFBBAEBB0DBA1196FA
:101300000FB6F894E29AE19A0FBE0895A1E21A2E60
:10131000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F99
:10132000A217B307E407F50720F0A21BB30BE40BE9
:10133000F50B661F771F881F991F1A9469F7609530
:101340007095809590959B01AC01BD01CF010895EA
:101350002F923F924F925F926F927F928F929F92C5
:10136000AF92BF92CF92DF92EF92FF920F931F93B3
:10137000CF93DF93CDB7DEB7CA1BDB0B0FB6F89464
:10138000DEBF0FBECDBF09942A88398848885F84A4
:101390006E847D848C849B84AA84B984C884DF8015
:1013A000EE80FD800C811B81AA81B981CE0FD11DF9
:0E13B0000FB6F894DEBF0FBECDBFED0108955D
:1013BE00010D313A2530336420323A253033642022
:1013CE00333A2530336420343A2530336420353AAD
:1013DE002530336420363A253033640001302E3305
:1013EE003600736572766F626F6172642025730AC0
:1013FE003E2000534552564F202564204E455554ED
:10140E0052414C202564204C494D49542025642DD1
:10141E0025640A0048454C5000444953504C4159EC
:10142E0020202020202020202020202020446973EE
:10143E00706C617920736572766F20736574746950
:10144E006E67730A53455420733D6E5B2C6C2C757E
:10145E005D20202020202020536574207365727635
:10146E006F2073657474696E67730A2020202020C4
:10147E00202020202020202020202020202020205E
:10148E0020202073203D20736572766F206E756D5F
:10149E006265722028312D36290A20202020202036
:1014AE00202020202020202020202020202020202E
:1014BE0020206E203D206E65757472616C20706FF9
:1014CE00736974696F6E2028302D323535290A20E4
:1014DE0020202020202020202020202020202020FE
:1014EE0075203D207570706572206C696D69742071
:1014FE0028302D323535290A435552206E202020B2
:1014EE00202020202020206C203D206C6F776572FC
:1014FE00206C696D69742028302D323535290A200B
:10150E0020202020202020202020202020202020CD
:10151E005365742063757272656E7420736572768E
:10152E006F2E202B203D20696E6372656173652CD2
:10153E00202D203D206465637265617365207661A0
:10154E006C75650A4C4F414420202020202020201D
:10155E002020202020202020202020204C6F61647D
:10156E002073657474696E67732066726F6D206583
:10157E006570726F6D0A5341564520202020202041
:10158E0020202020202020202020202020205772C4
:10159E006974652073657474696E677320746F2047
:1015AE00656570726F6D00444953504C415900533C
:1015BE004552564F2025642C204E45555452414CD1
:1015CE002025642C204C494D49542025642D25643A
:1015DE000A004558504F5254005345542025643D3F
:1015EE0025642C25642C25640A004C4F414400537D
:1015FE00415645004355522000200000435552529B
:10160E00454E5420534552564F2025640A005345EB
:10161E005420003D002C00496E76616C6964207385
:10162E006572766F00496E76616C696420636F6DCA
:10163E006D616E642C20747970652048454C5000A5
:10164E0052656365697665206275666665722066A9
:0C165E00756C6C2E000000DA0320000008
:10151E002020202020202075203D207570706572BF
:10152E00206C696D69742028302D323535290A43B7
:10153E005552206E202020202020202020202020E8
:10154E002020205365742063757272656E7420734B
:10155E006572766F2E202B203D20696E6372656159
:10156E0073652C202D203D20646563726561736563
:10157E002076616C75650A5345544C4C2020202012
:10158E002020202020202020202020536574206C35
:10159E006F776572206C696D697420746F20736546
:1015AE0072766F20706F736974696F6E0A5345544B
:1015BE00554C2020202020202020202020202020BC
:1015CE0020536574207570706572206C696D697436
:1015DE000A4C4F4144202020202020202020202073
:1015EE0020202020204C6F61642073657474696E16
:1015FE0067732066726F6D20656570726F6D0A532A
:10160E004156452020202020202020202020202050
:10161E0020202057726974652073657474696E6733
:10162E007320746F20656570726F6D00444953505E
:10163E004C4159005456004C4F41440053415645BD
:10164E0000435552200020002C0043555252454E67
:10165E005420534552564F2025640A005345544C8E
:10166E004C00534554554C0053455420003D00004A
:10167E00534552564F2025642C204E455554524109
:10168E004C2025642C204C494D49542025642D2591
:10169E00640A00496E76616C696420736572766FB8
:1016AE0000496E76616C696420636F6D6D616E6466
:1016BE002C20747970652048454C50005265636546
:1016CE00697665206275666665722066756C6C2E2D
:0816DE000000001604200000CA
:00000001FF
/branches/V0.76g-acid/servoboard/twislave.c
8,7 → 8,7
 
uint8_t I2C_RXBuffer[32];
uint8_t Byte_Counter = 0;
uint8_t I2C_timeout = 0;
volatile uint8_t I2C_timeout = 0;
 
void i2c_init(uint8_t adr)
{
/branches/V0.76g-acid/servoboard/twislave.h
1,7 → 1,7
#ifndef _TWI_SLAVE_H_
#define _TWI_SLAVE_H_
 
extern uint8_t I2C_timeout;
extern volatile uint8_t I2C_timeout;
 
extern void i2c_init(uint8_t adr);
 
/branches/V0.76g-acid/servoboard/uart.c
10,9 → 10,8
uint8_t rx_buffer[RX_BUFFER_SZ];
//uint8_t tx_buffer[TX_BUFFER_SZ];
uint8_t rx_pos, tx_pos;
uint8_t current_servo = 0;
uint8_t current_servo = 1;
 
 
void uart_init() {
 
rx_pos = 0;
32,24 → 31,29
 
}
 
void display_cur_servo(uint8_t i) {
printf("SERVO %d NEUTRAL %d LIMIT %d-%d\n", i + 1, pwm_neutral_position[i], (pwm_limit[i] & 0xff), (pwm_limit[i] >> 8));
}
 
 
ISR(USART_RXC_vect) {
 
uint8_t i = UDR;
 
if (rx_pos < RX_BUFFER_SZ) {
 
uint8_t i = UDR;
 
if (i == '+') {
if (pwm_neutral_position[current_servo - 1] < 255) {
pwm_neutral_position[current_servo - 1]++;
if (i == '+' || i == '-') {
if (i == '+') {
if (pwm_neutral_position[current_servo] < 255) {
pwm_neutral_position[current_servo]++;
}
} else if (i == '-') {
if (pwm_neutral_position[current_servo] > 0) {
pwm_neutral_position[current_servo]--;
}
}
printf("SERVO %d VALUE %d\n", current_servo, pwm_neutral_position[current_servo - 1]);
display_cur_servo(current_servo);
return;
} else if (i == '-') {
if (pwm_neutral_position[current_servo - 1] > 0) {
pwm_neutral_position[current_servo - 1]--;
}
printf("SERVO %d VALUE %d\n", current_servo, pwm_neutral_position[current_servo - 1]);
return;
}
 
uart_putchar(i);
62,34 → 66,26
rx_pos = 0;
 
if (!strcasecmp(rx_buffer, "HELP")) {
printf("DISPLAY Display servo settings\n"
"EXPORT Export srvo settings\n"
"SET s=n[,l,u] Set servo settings\n"
" s = servo number (1-6)\n"
" n = neutral position (0-255)\n"
" l = lower limit (0-255)\n"
" u = upper limit (0-255)\n"
"CUR n Set current servo. + = increase, - = decrease value\n"
"LOAD Load settings from eeprom\n"
"SAVE Write settings to eeprom\n");
printf("DISPLAY Display servo settings\n"
"SET s=n[,l,u] Set servo settings\n"
" s = servo number (1-6)\n"
" n = neutral position (0-255)\n"
" l = lower limit (0-255)\n"
" u = upper limit (0-255)\n"
"CUR n Set current servo. + = increase, - = decrease value\n"
"SETLL Set lower limit to servo position\n"
"SETUL Set upper limit\n"
"LOAD Load settings from eeprom\n"
"SAVE Write settings to eeprom\n");
} else if (!strcasecmp(rx_buffer, "DISPLAY")) {
for(i = 0; i < 6; i++) {
printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n",
(i + 1),
(pwm_neutral_position[i]),
(pwm_limit[i] & 0xff),
(pwm_limit[i] >> 8)
);
display_cur_servo(i);
}
} else if (!strcasecmp(rx_buffer, "EXPORT")) {
for(i = 0; i < 6; i++) {
printf("SET %d=%d,%d,%d\n",
(i + 1),
(pwm_neutral_position[i]),
(pwm_limit[i] & 0xff),
(pwm_limit[i] >> 8)
);
}
#if DEBUG_SIGNAL
} else if (!strcasecmp(rx_buffer, "TV")) {
display_values = !display_values;
printf("\n");
#endif
} else if (!strcasecmp(rx_buffer, "LOAD")) {
eeprom_init();
} else if (!strcasecmp(rx_buffer, "SAVE")) {
98,11 → 94,11
char *s, *t;
s = strtok_r(rx_buffer, " ", &t);
if (s) {
s = strtok_r(NULL, "", &t);
s = strtok_r(NULL, ",", &t);
if (s) {
i = atoi(s) + 1;
i = atoi(s);
if (i >= 1 && i <= 6) {
current_servo = i;
current_servo = i - 1;
printf("CURRENT SERVO %d\n", i);
} else {
printf("Invalid servo\n");
109,6 → 105,24
}
}
}
} else if (!strcasecmp(rx_buffer, "SETLL")) {
uint8_t l, h;
l = pwm_neutral_position[current_servo];
h = (pwm_limit[current_servo] >> 8);
if (h < l) {
h = l;
}
pwm_limit[current_servo] = (h << 8) | l;
display_cur_servo(current_servo);
} else if (!strcasecmp(rx_buffer, "SETUL")) {
uint8_t l, h;
h = pwm_neutral_position[current_servo];
l = (pwm_limit[current_servo] & 0xff);
if (l > h) {
l = h;
}
pwm_limit[current_servo] = (h << 8) | l;
display_cur_servo(current_servo);
} else if (!strncasecmp(rx_buffer, "SET ", 4)) {
char *s, *t;
uint8_t servo;
164,6 → 178,7
} else {
 
printf("Receive buffer full.\n");
rx_pos = 0;
 
}