No changes between revisions
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.HEX
0,0 → 1,72
:1000000000308A00B12800000A108A100A11820705
:100010000A340D3400340A108A100A1182072A3477
:100020002A342A340A340D3400340A108A100A1192
:100030008207733465346E3473346F347234203411
:100040002534753420342D342034253475340A3465
:100050000D34003427308400000803194028013093
:10006000F800BF30F7006400F70B3328F80B312895
:100070004A30F700F70B3A2800006400800B2F2865
:10008000003483168611831286110830F8000000B0
:1000900000000000F8175B28F813A90C0318861558
:1000A000031C861178175B287813F80B4D28000085
:1000B0000000000086151C308400840B5D280000C1
:1000C00000006400F81B4C28781B542800342A08D0
:1000D000F801290203186F282908F7007B28F70187
:1000E0000830AB00A90DF70D2A0877020318F700B6
:1000F000F80DAB0B7228003478082708A90064308B
:10010000AA0067207708A70078083030031D8F28E1
:10011000A81C9628A8199628281A20309228A811D9
:1001200028122814F8077808A90041202708A900F8
:100130000A30AA0067207708A70078083030031D2E
:10014000A728A819AB28281CAB28281A2030F807A4
:100150007808A90041203030A7072708A9004120CE
:10016000003484011F308305603083168F008611B0
:100170008312861583161F129F121B0880399B005D
:1001800007309C001F129F121B0880397F389B008C
:100190001F1383121F179F1783169F1383121F1499
:1001A00083160108C7390838810083129001003096
:1001B000F800920000308316920007309C0005087A
:1001C00064000230F700F70BE328000000001C0871
:1001D00083120D1383169D0102308312A600FA309C
:1001E000A7002A20A60BEF28941283160611861466
:1001F0000616353083129400403083169400831223
:10020000A60126080420003803190A29A60AA90015
:10021000412001296430A7002A20A60126080B20CE
:10022000003803191729A60AA90041200E296430B5
:10023000A7002A20A5012508063C031C5729250DE7
:10024000F700F70DF70DF830F7051F08C7397704E9
:100250009F006430A7002A201F151F192D291E0892
:10026000A400A60126081520A60AF700A90041202F
:1002700007302602031D32292508A7001B30A800DD
:100280007C202030A90041202D30A90041202030C1
:10029000A90041202408A7001B30A8007C200A30B8
:1002A000A90041200D30A9004120A50A1B29A20167
:1002B0000030F8001F08C73978049F00A3016400CC
:1002C0000230F700F70B6229000000001F151F190C
:1002D00067291E08A4000830F8001F08C7397804F1
:1002E0009F002408453C031C7E292408323C031847
:1002F0007D2921080139A3047E2923141F151F1904
:100300007F291E08A4001030F8001F08C7397804A0
:100310009F002408453C031C96292408323C0318FE
:10032000952921080239A3049629A3141F151F1922
:1003300097291E08A4001830F8001F08C739780450
:100340009F002408453C031CAE292408323C0318B6
:10035000AD2921080439A304AE2923151F151F193F
:10036000AF291E08A4002030F8001F08C739780400
:100370009F002408453C031CC6292408323C03186E
:10038000C52921080839A304C629A3151F151F195B
:10039000C7291E08A4002830F8001F08C7397804B0
:1003A0009F002408453C031CDE292408323C031826
:1003B000DD2921081039A304DE2923161F151F1972
:1003C000DF291E08A4003030F8001F08C739780460
:1003D0009F002408453C031CF6292408323C0318DE
:1003E000F52921082039A304F629A3161F151F1982
:1003F000F7291E08A4002408453C031C082A2408E9
:10040000323C0318072A21084039A304082A23177D
:100410002308A1008316061483120618142A220F3B
:10042000122A132AA20A152AA20122080A3C031C36
:10043000A317A3092308930083161418212A8312F3
:080440001C2A831258296300F5
:04400E00383FFC3FFC
:00000001FF
;PIC16F88
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.LST
0,0 → 1,620
CCS PCM C Compiler, Version 3.245, 27853 05-XI-06 20:45
 
Filename: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.lst
 
ROM used: 548 words (13%)
Largest free fragment is 2048
RAM used: 12 (7%) at main() level
17 (10%) worst case
Stack: 2 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 0B1
0003: NOP
.................... #include ".\cidla.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
.................... #fuses NOWDT,INTRC_IO, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO
.................... #use delay(clock=4000000,RESTART_WDT)
*
002A: MOVLW 27
002B: MOVWF 04
002C: MOVF 00,W
002D: BTFSC 03.2
002E: GOTO 040
002F: MOVLW 01
0030: MOVWF 78
0031: MOVLW BF
0032: MOVWF 77
0033: CLRWDT
0034: DECFSZ 77,F
0035: GOTO 033
0036: DECFSZ 78,F
0037: GOTO 031
0038: MOVLW 4A
0039: MOVWF 77
003A: DECFSZ 77,F
003B: GOTO 03A
003C: NOP
003D: CLRWDT
003E: DECFSZ 00,F
003F: GOTO 02F
0040: RETLW 00
....................
....................
.................... //#include <stdlib.h>
....................
.................... #use rs232(baud=9600,parity=N,xmit=PIN_B3,bits=8,restart_wdt)
0041: BSF 03.5
0042: BCF 06.3
0043: BCF 03.5
0044: BCF 06.3
0045: MOVLW 08
0046: MOVWF 78
0047: NOP
0048: NOP
0049: NOP
004A: BSF 78.7
004B: GOTO 05B
004C: BCF 78.7
004D: RRF 29,F
004E: BTFSC 03.0
004F: BSF 06.3
0050: BTFSS 03.0
0051: BCF 06.3
0052: BSF 78.6
0053: GOTO 05B
0054: BCF 78.6
0055: DECFSZ 78,F
0056: GOTO 04D
0057: NOP
0058: NOP
0059: NOP
005A: BSF 06.3
005B: MOVLW 1C
005C: MOVWF 04
005D: DECFSZ 04,F
005E: GOTO 05D
005F: NOP
0060: NOP
0061: CLRWDT
0062: BTFSC 78.7
0063: GOTO 04C
0064: BTFSC 78.6
0065: GOTO 054
0066: RETLW 00
....................
.................... #define IRRX PIN_B0
....................
.................... #define TRESHOLD_MAX 70 // rozhodovaci uroven pro cidla cerna/bila
.................... #define TRESHOLD_MIN 50
.................... #define CIHLA 10 // doba, po kterou musi byt detekovana cihla
....................
.................... unsigned int8 last_radius; // rozsah
.................... unsigned int8 last_cidla; // co cidla videla minule
.................... unsigned int8 shure; // citac doby, po kterou musi byt detekovana cihla
....................
.................... //tuning
.................... /*#define PULZACE 3 // urcuje rychlost pulzovani pomoci PWM
....................
.................... //Vystup PWM je na PIN_B3
.................... ////////////////////////////////////////////////////////////////////////////////
.................... void pulzovani() // postupne rozsvecuje a zhasina podsvetleni
.................... {
.................... unsigned int8 i,n;
.................... for(n=0;n<=3;n++)
.................... {
.................... for(i=0;i<255;i++) {set_pwm1_duty(i); Delay_ms(PULZACE);} // rozsvecovani
.................... for(i=255;i>0;i--) {set_pwm1_duty(i); Delay_ms(PULZACE);} // zhasinani
.................... }
.................... }
.................... */
.................... ////////////////////////////////////////////////////////////////////////////////
.................... void main()
.................... {
*
00B1: CLRF 04
00B2: MOVLW 1F
00B3: ANDWF 03,F
00B4: MOVLW 60
00B5: BSF 03.5
00B6: MOVWF 0F
00B7: BCF 06.3
00B8: BCF 03.5
00B9: BSF 06.3
00BA: BSF 03.5
00BB: BCF 1F.4
00BC: BCF 1F.5
00BD: MOVF 1B,W
00BE: ANDLW 80
00BF: MOVWF 1B
00C0: MOVLW 07
00C1: MOVWF 1C
.................... int8 cidla;
.................... unsigned int8 a;
.................... unsigned int8 n;
....................
.................... setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5|sAN6|VSS_VDD);
00C2: BCF 1F.4
00C3: BCF 1F.5
00C4: MOVF 1B,W
00C5: ANDLW 80
00C6: IORLW 7F
00C7: MOVWF 1B
.................... setup_adc(ADC_CLOCK_INTERNAL);
00C8: BCF 1F.6
00C9: BCF 03.5
00CA: BSF 1F.6
00CB: BSF 1F.7
00CC: BSF 03.5
00CD: BCF 1F.7
00CE: BCF 03.5
00CF: BSF 1F.0
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
00D0: BSF 03.5
00D1: MOVF 01,W
00D2: ANDLW C7
00D3: IORLW 08
00D4: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
00D5: BCF 03.5
00D6: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
00D7: MOVLW 00
00D8: MOVWF 78
00D9: MOVWF 12
00DA: MOVLW 00
00DB: BSF 03.5
00DC: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
00DD: MOVLW 07
00DE: MOVWF 1C
00DF: MOVF 05,W
00E0: CLRWDT
00E1: MOVLW 02
00E2: MOVWF 77
00E3: DECFSZ 77,F
00E4: GOTO 0E3
00E5: NOP
00E6: NOP
00E7: MOVF 1C,W
00E8: BCF 03.5
00E9: BCF 0D.6
.................... setup_vref(FALSE);
00EA: BSF 03.5
00EB: CLRF 1D
....................
.................... Delay_ms(500);
00EC: MOVLW 02
00ED: BCF 03.5
00EE: MOVWF 26
00EF: MOVLW FA
00F0: MOVWF 27
00F1: CALL 02A
00F2: DECFSZ 26,F
00F3: GOTO 0EF
.................... setup_spi(SPI_SLAVE|SPI_H_TO_L|SPI_SS_DISABLED);
00F4: BCF 14.5
00F5: BSF 03.5
00F6: BCF 06.2
00F7: BSF 06.1
00F8: BSF 06.4
00F9: MOVLW 35
00FA: BCF 03.5
00FB: MOVWF 14
00FC: MOVLW 40
00FD: BSF 03.5
00FE: MOVWF 14
....................
.................... // diagnostika
.................... printf("\n\r");
00FF: BCF 03.5
0100: CLRF 26
0101: MOVF 26,W
0102: CALL 004
0103: IORLW 00
0104: BTFSC 03.2
0105: GOTO 10A
0106: INCF 26,F
0107: MOVWF 29
0108: CALL 041
0109: GOTO 101
.................... Delay_ms(100);
010A: MOVLW 64
010B: MOVWF 27
010C: CALL 02A
.................... printf("***\n\r");
010D: CLRF 26
010E: MOVF 26,W
010F: CALL 00B
0110: IORLW 00
0111: BTFSC 03.2
0112: GOTO 117
0113: INCF 26,F
0114: MOVWF 29
0115: CALL 041
0116: GOTO 10E
.................... Delay_ms(100);
0117: MOVLW 64
0118: MOVWF 27
0119: CALL 02A
.................... for (n=0; n<=6; n++)
011A: CLRF 25
011B: MOVF 25,W
011C: SUBLW 06
011D: BTFSS 03.0
011E: GOTO 157
.................... {
.................... set_adc_channel(n);
011F: RLF 25,W
0120: MOVWF 77
0121: RLF 77,F
0122: RLF 77,F
0123: MOVLW F8
0124: ANDWF 77,F
0125: MOVF 1F,W
0126: ANDLW C7
0127: IORWF 77,W
0128: MOVWF 1F
.................... Delay_ms(100);
0129: MOVLW 64
012A: MOVWF 27
012B: CALL 02A
.................... a=read_adc();
012C: BSF 1F.2
012D: BTFSC 1F.2
012E: GOTO 12D
012F: MOVF 1E,W
0130: MOVWF 24
.................... printf("sensor %u - %u\n\r",n,a);
0131: CLRF 26
0132: MOVF 26,W
0133: CALL 015
0134: INCF 26,F
0135: MOVWF 77
0136: MOVWF 29
0137: CALL 041
0138: MOVLW 07
0139: SUBWF 26,W
013A: BTFSS 03.2
013B: GOTO 132
013C: MOVF 25,W
013D: MOVWF 27
013E: MOVLW 1B
013F: MOVWF 28
0140: CALL 07C
0141: MOVLW 20
0142: MOVWF 29
0143: CALL 041
0144: MOVLW 2D
0145: MOVWF 29
0146: CALL 041
0147: MOVLW 20
0148: MOVWF 29
0149: CALL 041
014A: MOVF 24,W
014B: MOVWF 27
014C: MOVLW 1B
014D: MOVWF 28
014E: CALL 07C
014F: MOVLW 0A
0150: MOVWF 29
0151: CALL 041
0152: MOVLW 0D
0153: MOVWF 29
0154: CALL 041
.................... }
0155: INCF 25,F
0156: GOTO 11B
....................
.................... shure=0;
0157: CLRF 22
.................... while(true)
.................... {
.................... set_adc_channel(0);
0158: MOVLW 00
0159: MOVWF 78
015A: MOVF 1F,W
015B: ANDLW C7
015C: IORWF 78,W
015D: MOVWF 1F
.................... cidla=0;
015E: CLRF 23
.................... Delay_us(10);
015F: CLRWDT
0160: MOVLW 02
0161: MOVWF 77
0162: DECFSZ 77,F
0163: GOTO 162
0164: NOP
0165: NOP
.................... a=read_adc();
0166: BSF 1F.2
0167: BTFSC 1F.2
0168: GOTO 167
0169: MOVF 1E,W
016A: MOVWF 24
....................
.................... set_adc_channel(1);
016B: MOVLW 08
016C: MOVWF 78
016D: MOVF 1F,W
016E: ANDLW C7
016F: IORWF 78,W
0170: MOVWF 1F
.................... if(a<TRESHOLD_MAX) //hystereze cidel
0171: MOVF 24,W
0172: SUBLW 45
0173: BTFSS 03.0
0174: GOTO 17E
.................... {
.................... if(a>TRESHOLD_MIN)
0175: MOVF 24,W
0176: SUBLW 32
0177: BTFSC 03.0
0178: GOTO 17D
.................... {
.................... cidla |= (last_cidla & 0b00000001);
0179: MOVF 21,W
017A: ANDLW 01
017B: IORWF 23,F
.................... }
.................... else cidla |= 0b00000001;
017C: GOTO 17E
017D: BSF 23.0
.................... }
....................
.................... a=read_adc();
017E: BSF 1F.2
017F: BTFSC 1F.2
0180: GOTO 17F
0181: MOVF 1E,W
0182: MOVWF 24
....................
.................... set_adc_channel(2);
0183: MOVLW 10
0184: MOVWF 78
0185: MOVF 1F,W
0186: ANDLW C7
0187: IORWF 78,W
0188: MOVWF 1F
.................... if(a<TRESHOLD_MAX)
0189: MOVF 24,W
018A: SUBLW 45
018B: BTFSS 03.0
018C: GOTO 196
.................... {
.................... if(a>TRESHOLD_MIN)
018D: MOVF 24,W
018E: SUBLW 32
018F: BTFSC 03.0
0190: GOTO 195
.................... {
.................... cidla |= (last_cidla & 0b00000010);
0191: MOVF 21,W
0192: ANDLW 02
0193: IORWF 23,F
.................... }
.................... else cidla |= 0b00000010;
0194: GOTO 196
0195: BSF 23.1
.................... }
....................
.................... a=read_adc();
0196: BSF 1F.2
0197: BTFSC 1F.2
0198: GOTO 197
0199: MOVF 1E,W
019A: MOVWF 24
....................
.................... set_adc_channel(3);
019B: MOVLW 18
019C: MOVWF 78
019D: MOVF 1F,W
019E: ANDLW C7
019F: IORWF 78,W
01A0: MOVWF 1F
.................... if(a<TRESHOLD_MAX)
01A1: MOVF 24,W
01A2: SUBLW 45
01A3: BTFSS 03.0
01A4: GOTO 1AE
.................... {
.................... if(a>TRESHOLD_MIN)
01A5: MOVF 24,W
01A6: SUBLW 32
01A7: BTFSC 03.0
01A8: GOTO 1AD
.................... {
.................... cidla |= (last_cidla & 0b00000100);
01A9: MOVF 21,W
01AA: ANDLW 04
01AB: IORWF 23,F
.................... }
.................... else cidla |= 0b00000100;
01AC: GOTO 1AE
01AD: BSF 23.2
.................... }
....................
.................... a=read_adc();
01AE: BSF 1F.2
01AF: BTFSC 1F.2
01B0: GOTO 1AF
01B1: MOVF 1E,W
01B2: MOVWF 24
....................
.................... set_adc_channel(4);
01B3: MOVLW 20
01B4: MOVWF 78
01B5: MOVF 1F,W
01B6: ANDLW C7
01B7: IORWF 78,W
01B8: MOVWF 1F
.................... if(a<TRESHOLD_MAX)
01B9: MOVF 24,W
01BA: SUBLW 45
01BB: BTFSS 03.0
01BC: GOTO 1C6
.................... {
.................... if(a>TRESHOLD_MIN)
01BD: MOVF 24,W
01BE: SUBLW 32
01BF: BTFSC 03.0
01C0: GOTO 1C5
.................... {
.................... cidla |= (last_cidla & 0b00001000);
01C1: MOVF 21,W
01C2: ANDLW 08
01C3: IORWF 23,F
.................... }
.................... else cidla |= 0b00001000;
01C4: GOTO 1C6
01C5: BSF 23.3
.................... }
.................... a=read_adc();
01C6: BSF 1F.2
01C7: BTFSC 1F.2
01C8: GOTO 1C7
01C9: MOVF 1E,W
01CA: MOVWF 24
....................
.................... set_adc_channel(5);
01CB: MOVLW 28
01CC: MOVWF 78
01CD: MOVF 1F,W
01CE: ANDLW C7
01CF: IORWF 78,W
01D0: MOVWF 1F
....................
.................... if(a<TRESHOLD_MAX)
01D1: MOVF 24,W
01D2: SUBLW 45
01D3: BTFSS 03.0
01D4: GOTO 1DE
.................... {
.................... if(a>TRESHOLD_MIN)
01D5: MOVF 24,W
01D6: SUBLW 32
01D7: BTFSC 03.0
01D8: GOTO 1DD
.................... {
.................... cidla |= (last_cidla & 0b00010000);
01D9: MOVF 21,W
01DA: ANDLW 10
01DB: IORWF 23,F
.................... }
.................... else cidla |= 0b00010000;
01DC: GOTO 1DE
01DD: BSF 23.4
.................... }
.................... a=read_adc();
01DE: BSF 1F.2
01DF: BTFSC 1F.2
01E0: GOTO 1DF
01E1: MOVF 1E,W
01E2: MOVWF 24
....................
.................... set_adc_channel(6);
01E3: MOVLW 30
01E4: MOVWF 78
01E5: MOVF 1F,W
01E6: ANDLW C7
01E7: IORWF 78,W
01E8: MOVWF 1F
.................... if(a<TRESHOLD_MAX)
01E9: MOVF 24,W
01EA: SUBLW 45
01EB: BTFSS 03.0
01EC: GOTO 1F6
.................... {
.................... if(a>TRESHOLD_MIN)
01ED: MOVF 24,W
01EE: SUBLW 32
01EF: BTFSC 03.0
01F0: GOTO 1F5
.................... {
.................... cidla |= (last_cidla & 0b00100000);
01F1: MOVF 21,W
01F2: ANDLW 20
01F3: IORWF 23,F
.................... }
.................... else cidla |= 0b00100000;
01F4: GOTO 1F6
01F5: BSF 23.5
.................... }
.................... a=read_adc();
01F6: BSF 1F.2
01F7: BTFSC 1F.2
01F8: GOTO 1F7
01F9: MOVF 1E,W
01FA: MOVWF 24
....................
.................... if(a<TRESHOLD_MAX)
01FB: MOVF 24,W
01FC: SUBLW 45
01FD: BTFSS 03.0
01FE: GOTO 208
.................... {
.................... if(a>TRESHOLD_MIN)
01FF: MOVF 24,W
0200: SUBLW 32
0201: BTFSC 03.0
0202: GOTO 207
.................... {
.................... cidla |=(last_cidla & 0b01000000);
0203: MOVF 21,W
0204: ANDLW 40
0205: IORWF 23,F
.................... }
.................... else cidla |= 0b01000000;
0206: GOTO 208
0207: BSF 23.6
.................... }
....................
.................... last_cidla=cidla;
0208: MOVF 23,W
0209: MOVWF 21
....................
.................... if (!input(IRRX)) {if (shure<255) shure++;} else {shure=0;};
020A: BSF 03.5
020B: BSF 06.0
020C: BCF 03.5
020D: BTFSC 06.0
020E: GOTO 214
020F: INCFSZ 22,W
0210: GOTO 212
0211: GOTO 213
0212: INCF 22,F
0213: GOTO 215
0214: CLRF 22
.................... if (shure>CIHLA) cidla|=0b10000000;
0215: MOVF 22,W
0216: SUBLW 0A
0217: BTFSS 03.0
0218: BSF 23.7
....................
.................... cidla=~cidla;
0219: COMF 23,F
.................... spi_write(cidla);
021A: MOVF 23,W
021B: MOVWF 13
021C: BSF 03.5
021D: BTFSC 14.0
021E: GOTO 221
021F: BCF 03.5
0220: GOTO 21C
.................... }
0221: BCF 03.5
0222: GOTO 158
.................... }
0223: SLEEP
 
Configuration Fuses:
Word 1: 3F38 NOWDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT INTRC_IO
Word 2: 3FFC NOFCMEN NOIESO
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.PJT
0,0 → 1,44
[PROJECT]
Target=cidla.HEX
Development_Mode=
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[cidla.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=cidla.c
 
[Windows]
0=0000 cidla.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c
2=
3=C:\Program Files\PICC\drivers\stdlib.h
4=C:\Program Files\PICC\drivers\stddef.h
5=C:\Program Files\PICC\drivers\string.h
6=C:\Program Files\PICC\drivers\ctype.h
7=D:\KAKLIK\programy\PIC_C\roboti\istrobot\3Orbis\cidla\cidla.h
8=
[Units]
Count=1
1=D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c (main)
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.SYM
0,0 → 1,59
015 CCP_1_LOW
015-016 CCP_1
016 CCP_1_HIGH
020 last_radius
021 last_cidla
022 shure
023 main.cidla
024 main.a
025 main.n
026 main.@SCRATCH
027 @PRINTF_U_9600_51_41.P1
027 @delay_ms1.P2
028 @PRINTF_U_9600_51_41.P1
029 @PUTCHAR_1_.P1
029 @DIV88.P2
02A @DIV88.P1
02B @DIV88.@SCRATCH
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
002A @delay_ms1
0041 @PUTCHAR_1_
00B1 main
0004 @const10062
000B @const10067
0015 @const10080
0067 @DIV88
007C @PRINTF_U_9600_51_41
00B1 @cinit
 
Project Files:
D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c
D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.h
C:\Program Files\PICC\devices\16F88.h
 
Units:
D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c (main)
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.err
INHX8: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.hex
Symbols: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.sym
List: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.lst
Debug/COFF: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.cof
Call Tree: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.tre
Statistics: D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.sta
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.c
0,0 → 1,157
#include ".\cidla.h"
//#include <stdlib.h>
 
#use rs232(baud=9600,parity=N,xmit=PIN_B3,bits=8,restart_wdt)
 
#define IRRX PIN_B0
 
#define TRESHOLD_MAX 70 // rozhodovaci uroven pro cidla cerna/bila
#define TRESHOLD_MIN 50
#define CIHLA 10 // doba, po kterou musi byt detekovana cihla
 
unsigned int8 last_radius; // rozsah
unsigned int8 last_cidla; // co cidla videla minule
unsigned int8 shure; // citac doby, po kterou musi byt detekovana cihla
 
//tuning
/*#define PULZACE 3 // urcuje rychlost pulzovani pomoci PWM
 
//Vystup PWM je na PIN_B3
////////////////////////////////////////////////////////////////////////////////
void pulzovani() // postupne rozsvecuje a zhasina podsvetleni
{
unsigned int8 i,n;
for(n=0;n<=3;n++)
{
for(i=0;i<255;i++) {set_pwm1_duty(i); Delay_ms(PULZACE);} // rozsvecovani
for(i=255;i>0;i--) {set_pwm1_duty(i); Delay_ms(PULZACE);} // zhasinani
}
}
*/
////////////////////////////////////////////////////////////////////////////////
void main()
{
int8 cidla;
unsigned int8 a;
unsigned int8 n;
 
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5|sAN6|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
 
Delay_ms(500);
setup_spi(SPI_SLAVE|SPI_H_TO_L|SPI_SS_DISABLED);
// diagnostika
printf("\n\r");
Delay_ms(100);
printf("***\n\r");
Delay_ms(100);
for (n=0; n<=6; n++)
{
set_adc_channel(n);
Delay_ms(100);
a=read_adc();
printf("sensor %u - %u\n\r",n,a);
}
 
shure=0;
while(true)
{
set_adc_channel(0);
cidla=0;
Delay_us(10);
a=read_adc();
 
set_adc_channel(1);
if(a<TRESHOLD_MAX) //hystereze cidel
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00000001);
}
else cidla |= 0b00000001;
}
 
a=read_adc();
 
set_adc_channel(2);
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00000010);
}
else cidla |= 0b00000010;
}
 
a=read_adc();
 
set_adc_channel(3);
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00000100);
}
else cidla |= 0b00000100;
}
 
a=read_adc();
 
set_adc_channel(4);
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00001000);
}
else cidla |= 0b00001000;
}
a=read_adc();
 
set_adc_channel(5);
 
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00010000);
}
else cidla |= 0b00010000;
}
a=read_adc();
 
set_adc_channel(6);
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |= (last_cidla & 0b00100000);
}
else cidla |= 0b00100000;
}
a=read_adc();
 
if(a<TRESHOLD_MAX)
{
if(a>TRESHOLD_MIN)
{
cidla |=(last_cidla & 0b01000000);
}
else cidla |= 0b01000000;
}
 
last_cidla=cidla;
 
if (!input(IRRX)) {if (shure<255) shure++;} else {shure=0;};
if (shure>CIHLA) cidla|=0b10000000;
 
cidla=~cidla;
spi_write(cidla);
}
}
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.h
0,0 → 1,5
#include <16F88.h>
#device adc=8
#fuses NOWDT,INTRC_IO, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO
#use delay(clock=4000000,RESTART_WDT)
 
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.sta
0,0 → 1,35
 
ROM used: 548 (13%)
548 (13%) including unused fragments
 
1 Average locations per line
6 Average locations per statement
 
RAM used: 12 (7%) at main() level
17 (10%) worst case
 
Lines Stmts % Files
----- ----- --- -----
158 92 100 D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.c
6 0 0 D:\KAKLIK\projekty\roboti\istrobot\3Orbis\cidla\cidla.h
279 0 0 C:\Program Files\PICC\devices\16F88.h
----- -----
886 184 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 23 4 1 @delay_ms1
0 38 7 1 @PUTCHAR_1_
0 371 68 4 main
0 7 1 0 @const10062
0 10 2 0 @const10067
0 21 4 0 @const10080
0 21 4 3 @DIV88
0 53 10 2 @PRINTF_U_9600_51_41
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-007FF 544 1500
00800-00FFF 0 2048
 
/Designs/ROBOTS/3Orbis/SW/cidla/cidla.tre
0,0 → 1,30
ÀÄcidla
ÀÄmain 0/371 Ram=4
ÃÄ??0??
ÃÄ@delay_ms1 0/23 Ram=1
ÃÄ@const10062 0/7 Ram=0
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@delay_ms1 0/23 Ram=1
ÃÄ@const10067 0/10 Ram=0
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@delay_ms1 0/23 Ram=1
ÃÄ@delay_ms1 0/23 Ram=1
ÃÄ@const10080 0/21 Ram=0
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PRINTF_U_9600_51_41 0/53 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/38 Ram=1
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/38 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PRINTF_U_9600_51_41 0/53 Ram=2
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/38 Ram=1
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/38 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/38 Ram=1
ÃÄ@PUTCHAR_1_ 0/38 Ram=1
ÀÄ@PUTCHAR_1_ 0/38 Ram=1
/Designs/ROBOTS/3Orbis/SW/cidla/macro.ini
/Designs/ROBOTS/3Orbis/SW/main.HEX
0,0 → 1,148
:1000000000308A006C2A0000FF00030E8301A1006B
:100010007F08A0000A08A8008A01A00E0408A20018
:100020007708A3007808A4007908A5007A08A6003C
:100030007B08A700831383128C308400801C222845
:100040008C183528220884002308F7002408F800BB
:100050002508F9002608FA002708FB0028088A006E
:10006000210E8300FF0E7F0E09008A1147280830F9
:10007000BD02031C46283D3084000310800C00089C
:100080000319462844286400800B43280034831653
:1000900086128312861664000930BC006D30BD00E4
:1000A0003720BC0B4E282C08BB00BB0803195E2868
:1000B0006400000000000000BB0355288316861270
:1000C000831286128C108A1122283A30840000088C
:1000D00003197C280230F800BF30F7006400F70BEA
:1000E0006E28F80B6C289630F700F70B7528000087
:1000F00000006400800B6A280034B901E130AC00D4
:100100006430BA0065202B08023C031D89280330A7
:10011000AB00AB08031D8E280330AB002B08FE3C60
:10012000031D9428FD30AB000330BA006520831610
:100130000610831206101308930183161418A228C0
:1001400083129D2883121308AA00AA098316061099
:10015000831206140330BA0065202B08033C031DEC
:10016000DB280108A03C031CBE288316051083125F
:1001700005108316851083128514C6288316051072
:100180008312051083168510831285100108A03C88
:10019000031CD32883168513831285138316051336
:1001A00083120517DB2883160513831205138316A4
:1001B0008513831285132B08FD3C031D09290108B3
:1001C000A03C031CEC288316051383120513831629
:1001D000851383128517F4288316051383120513DC
:1001E00083168513831285130108A03C031C012983
:1001F000831685108312851083160510831205144B
:1002000009298316051083120510831685108312A1
:100210008510AB08031D1E298316051083120510D7
:100220008316851083128510831605138312051318
:100230008316851383128513B90A1F29B90139085A
:10024000633C031C592983160610831206101308F9
:100250009301831614182E29831229298312130857
:10026000AA00AA098316061083120614AA1D3A29A9
:10027000AB01AA282A1C3F290330AB00AA282A1F59
:100280004429FD30AB00AA28AA1C49290330AB0041
:10029000AA28AA1E4E29FD30AB00AA282A1D5329E0
:1002A0000330AB00AA282A1E5829FD30AB00AA282B
:1002B000AA28003483168510831285108316051032
:1002C00083120514831605138312051383168513F1
:1002D000831285170230B9009630BA006520B90B39
:1002E0006C2983160510831205108316851083125E
:1002F00085148316851383128513831605138312C1
:1003000005176430BA0065208316051083120510A6
:100310008316851083128510831605138312051327
:1003200083168513831285138030AC0083168510E5
:100330008312851083160510831205148316851306
:100340008312851383160513831205170230B90033
:10035000BE30BA006520B90BA8294930AC0083161D
:1003600005108312051083168510831285108316DD
:100370008513831285138316051383120517BE3068
:10038000BA0065208030AC00831685138312851374
:1003900083160513831205178316851083128510A3
:1003A00083160510831205140230B9009630BA0086
:1003B0006520B90BD6294930AC008316851383120A
:1003C00085138316051383120517831605108312F0
:1003D00005108316851083128510BE30BA00652083
:1003E0008030AC00831685138312851383160513A2
:1003F0008312051783168510831285108316051046
:10040000831205146430BA0065202A08FE390319E6
:10041000182A1308930183161418102A83120B2A22
:1004200083121308AA00AA090330BA006520052A1E
:100430008316051083120510831685108312851408
:1004400083160513831205138316851383128517EC
:10045000FA30BA006520E130AC00831685108312B3
:100460008510831605108312051483160513831255
:10047000051383168513831285172A08FE3903197D
:10048000502A1308930183161418482A8312432A0A
:1004900083121308AA00AA090330BA0065203D2A76
:1004A000831605108312051083168510831285109C
:1004B0008316051383120513831685138312851380
:1004C0000230B9009630BA006520B90B622AFD30BF
:1004D000AB007D208A11CF2B84011F308305703043
:1004E00083168F001F129F121B0880399B00073054
:1004F0009C008312AB0183161F129F121B088039C8
:1005000074389B001F1383121F179F1783169F13A6
:1005100083121F14941283160611861406123130AA
:10052000831294000030831694000108C7390838FC
:1005300081003030831290007830F8000638920045
:100540008C308316920072308F00051383120513CE
:1005500083168513831285138316051083120510E5
:100560008316851083128510B101B001B301B20169
:100570008030AC00AF0183168C14C03083128B0422
:1005800083160611831206110830B900FA30BA003A
:100590006520B90BC62A2030F8001F08C739780437
:1005A0009F000130BA0065201F151F19D52A1E08AB
:1005B000F700F70CF70C3F30F7057708643EB800FA
:1005C0001030F8001F08C73978049F000130BA00C6
:1005D000652020302D02B9001F151F19ED2A1E08B5
:1005E000F700F70CF70C3F30F70577083907AE0036
:1005F000C830AD000108801F002BB11F082B022B53
:10060000B11B112BB108031D082B3002031C112B49
:100610008316851083128510831605108312051426
:10062000192B83160510831205108316851083126B
:1006300085100108801F1F2BB31F272B212BB31BF5
:10064000302BB308031D272B3202031C302B8316DB
:100650008513831285138316051383120517382B10
:1006600083160513831205138316851383128513CE
:1006700064000130BA0065200930B900A9018B1B64
:10068000A9178B136D30BD003720A91B8B17B90B31
:100690003E2B2A08B7008316061083120610130893
:1006A000930183161418562B8312512B83121308AF
:1006B000AA00AA098316061083120614B501B40114
:1006C0003408063C031C722B2A08F7003408F80093
:1006D00003196E2B0310F70CF80B6A2B7718B50A69
:1006E000B40A602B3508043C03189E2B83160510B2
:1006F0008312051083168510831285148316051343
:100700008312051383168513831285170230B900EF
:100710009630BA006520B90B882B83160513831217
:100720000513831685138312851383160510831210
:10073000051083168510831285109D2BAA1FCF2BC1
:1007400083160513831205138316851383128517E9
:1007500083160510831205108316851083128514E5
:100760000230B900C830BA006520B90BB22B83162D
:1007700005138312051383168513831285138316BD
:1007800005108312051083168510831285106430BE
:10079000BA0065207D206430BA0065205A292D08F2
:1007A0003802031CAD03AA1DE72B8030AC00FA0110
:1007B0002D08B0007A08B100FA012D08B2007A08BD
:1007C000B300AB012F0FE52BE62BAF0AFA2A2A1C48
:1007D000F52B5330AC00B101B001FA012E08B20084
:1007E0007A08B3000330AB00FA2A2A1F032CAD307D
:1007F000AC00B301B201FA012E08B0007A08B100D2
:10080000FD30AB00FA2AAA1C152C6730AC0046302C
:100810002D02FA01B0007A08B100FA012D08B200E9
:100820007A08B3000230AB00FA2AAA1E272C9930AE
:10083000AC0046302D02FA01B2007A08B300FA018A
:100840002D08B0007A08B100FE30AB00FA2A2A1D4C
:100850003D2C7630AC0014302D02FA01B0007A083D
:10086000B100FA012D08B2007A08B3000230AB00E3
:100870002F0F3B2C3C2CAF0AFA2A2A1E532C8A300D
:10088000AC0014302D02FA01B2007A08B300FA016C
:100890002D08B0007A08B1000230AB002F0F512CA8
:1008A000522CAF0AFA2A2B08033C03195B2C2B08A5
:1008B000FD3C031D802C2F08323C03187D2C831631
:1008C0000510831205108316851083128514831674
:1008D000051383120513831685138312851764305D
:1008E000BA0065202F08FA3C031C7A2C2D08AA3C7C
:1008F00003187D2C3230BA006520AF01C830AD003E
:04090000FA2A63006C
:04400E00383FFC3FFC
:00000001FF
;PIC16F88
/Designs/ROBOTS/3Orbis/SW/main.LST
0,0 → 1,1625
CCS PCM C Compiler, Version 3.245, 27853 30-IV-06 21:17
 
Filename: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.lst
 
ROM used: 1154 words (28%)
Largest free fragment is 2048
RAM used: 32 (18%) at main() level
35 (20%) worst case
Stack: 5 worst case (3 in main + 2 for interrupts)
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 26C
0003: NOP
0004: MOVWF 7F
0005: SWAPF 03,W
0006: CLRF 03
0007: MOVWF 21
0008: MOVF 7F,W
0009: MOVWF 20
000A: MOVF 0A,W
000B: MOVWF 28
000C: CLRF 0A
000D: SWAPF 20,F
000E: MOVF 04,W
000F: MOVWF 22
0010: MOVF 77,W
0011: MOVWF 23
0012: MOVF 78,W
0013: MOVWF 24
0014: MOVF 79,W
0015: MOVWF 25
0016: MOVF 7A,W
0017: MOVWF 26
0018: MOVF 7B,W
0019: MOVWF 27
001A: BCF 03.7
001B: BCF 03.5
001C: MOVLW 8C
001D: MOVWF 04
001E: BTFSS 00.1
001F: GOTO 022
0020: BTFSC 0C.1
0021: GOTO 035
0022: MOVF 22,W
0023: MOVWF 04
0024: MOVF 23,W
0025: MOVWF 77
0026: MOVF 24,W
0027: MOVWF 78
0028: MOVF 25,W
0029: MOVWF 79
002A: MOVF 26,W
002B: MOVWF 7A
002C: MOVF 27,W
002D: MOVWF 7B
002E: MOVF 28,W
002F: MOVWF 0A
0030: SWAPF 21,W
0031: MOVWF 03
0032: SWAPF 7F,F
0033: SWAPF 7F,W
0034: RETFIE
0035: BCF 0A.3
0036: GOTO 047
.................... #include ".\main.h"
.................... #include <16F88.h>
.................... //////// Standard Header file for the PIC16F88 device ////////////////
.................... #device PIC16F88
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES INTRC_IO
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES NOBROWNOUT //Reset when brownout detected
.................... #FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOFCMEN //Fail-safe clock monitor enabled
.................... #FUSES NOIESO //Internal External Switch Over mode enabled
....................
.................... #use delay(clock=8000000,RESTART_WDT)
0037: MOVLW 08
0038: SUBWF 3D,F
0039: BTFSS 03.0
003A: GOTO 046
003B: MOVLW 3D
003C: MOVWF 04
003D: BCF 03.0
003E: RRF 00,F
003F: MOVF 00,W
0040: BTFSC 03.2
0041: GOTO 046
0042: GOTO 044
0043: CLRWDT
0044: DECFSZ 00,F
0045: GOTO 043
0046: RETLW 00
*
0065: MOVLW 3A
0066: MOVWF 04
0067: MOVF 00,W
0068: BTFSC 03.2
0069: GOTO 07C
006A: MOVLW 02
006B: MOVWF 78
006C: MOVLW BF
006D: MOVWF 77
006E: CLRWDT
006F: DECFSZ 77,F
0070: GOTO 06E
0071: DECFSZ 78,F
0072: GOTO 06C
0073: MOVLW 96
0074: MOVWF 77
0075: DECFSZ 77,F
0076: GOTO 075
0077: NOP
0078: NOP
0079: CLRWDT
007A: DECFSZ 00,F
007B: GOTO 06A
007C: RETLW 00
....................
....................
....................
.................... #define KOLMO1 225 // predni kolecko sroubem dopredu
.................... #define KOLMO2 30 // predni kolecko je hlavou sroubu dozadu
.................... #define STRED 128 // sredni poloha zataceciho kolecka
.................... #define BEAR1 10//10 // 3 stupne zataceni
.................... #define BEAR2 25//25
.................... #define BEAR3 45//45
.................... #define R 100 // Rozumna rychlost
.................... #define R17 200 // X nasobek rozumne rychlosti
.................... #define PRED_CIHLOU 100 // rychlost pri dalkove detekci cihly
.................... //#define L1 1 // cara vlevo
.................... #define L2 2 // cara vlevo
.................... #define L3 3 // cara vlevo
.................... #define S 0 // cara mezi sensory
.................... //#define R1 -1 // cara vpravo
.................... #define R2 -2 // cara vpravo
.................... #define R3 -3 // cara vpravo
....................
.................... // servo
.................... #define SERVO PIN_B5
....................
.................... // kroutitka
.................... #define CERVENA 4 // AN4
.................... //#define CERNA 5 // AN5
.................... //#define ZELENA 6 // AN6
.................... #define MODRA 2 // AN2
....................
.................... // IR
.................... #define IRTX PIN_B2
.................... #define CIHLA PIN_A3
....................
.................... //motory
.................... #define FR output_low(PIN_A7); output_high(PIN_A6) // Vpred
.................... #define FL output_low(PIN_A1); output_high(PIN_A0)
.................... #define BR output_low(PIN_A6); output_high(PIN_A7) // Vzad
.................... #define BL output_low(PIN_A0); output_high(PIN_A1)
.................... #define STOPR output_low(PIN_A6);output_low(PIN_A7)
.................... #define STOPL output_low(PIN_A0);output_low(PIN_A1)
....................
.................... //HID
.................... #define LED1 PIN_B1 //oranzova
.................... #define LED2 PIN_B2 //zluta
....................
.................... #define STROBE PIN_B0
.................... //#define SW1 PIN_A2 // Motory On/off
....................
.................... unsigned int8 sensors; // pomocna promenna pro cteni cidel na caru
.................... signed int8 line = S; // na ktere strane byla detekovana cara
*
0279: BCF 03.5
027A: CLRF 2B
.................... //unsigned int8 dira; // pocita dobu po kterou je ztracena cara
.................... unsigned int8 uhel; // urcuje aktualni uhel zataceni
.................... unsigned int8 speed; // maximalni povolena rychlost
.................... unsigned int8 turn; // rychlost toceni
.................... unsigned int8 rovinka; // pocitadlo na zjisteni rovinky
....................
.................... signed int16 Lmotor; // promene, ktere urcuji velikost vykonu na levem
.................... signed int16 Rmotor; // a pravem motoru
....................
.................... // makro pro PWM pro motory
.................... #define GO(motor, direction, power) if(get_timer0()<=power) \
.................... {direction##motor;} else {stop##motor;}
.................... ////////////////////////////////////////////////////////////////////////////////
.................... #int_TIMER2
.................... TIMER2_isr() // ovladani serva
.................... {
.................... unsigned int8 n;
....................
.................... output_high(SERVO);
*
0047: BSF 03.5
0048: BCF 06.5
0049: BCF 03.5
004A: BSF 06.5
.................... delay_us(1000);
004B: CLRWDT
004C: MOVLW 09
004D: MOVWF 3C
004E: MOVLW 6D
004F: MOVWF 3D
0050: CALL 037
0051: DECFSZ 3C,F
0052: GOTO 04E
.................... for(n=uhel; n>0; n--) Delay_us(2);
0053: MOVF 2C,W
0054: MOVWF 3B
0055: MOVF 3B,F
0056: BTFSC 03.2
0057: GOTO 05E
0058: CLRWDT
0059: NOP
005A: NOP
005B: NOP
005C: DECF 3B,F
005D: GOTO 055
.................... output_low(SERVO);
005E: BSF 03.5
005F: BCF 06.5
0060: BCF 03.5
0061: BCF 06.5
.................... }
....................
.................... ////////////////////////////////////////////////////////////////////////////////
0062: BCF 0C.1
0063: BCF 0A.3
0064: GOTO 022
.................... int8 IRcheck() // potvrdi detekci cihly
.................... {
.................... output_high(IRTX); // vypne vysilac IR
.................... delay_ms(10);
....................
.................... output_low(STROBE);
.................... sensors = spi_read(0); // cteni senzoru
.................... sensors=~sensors;
.................... output_high(STROBE);
....................
.................... if(bit_test(sensors,7)) // otestuje, jestli je stale detekovan IR signal
.................... {
.................... output_low(IRTX); // zapne vysilac IR
.................... delay_ms(10);
....................
.................... output_low(STROBE);
.................... sensors = spi_read(0); // cteni senzoru
.................... sensors=~sensors;
.................... output_high(STROBE);
....................
.................... if(!bit_test(sensors,7)) // otestuje, jestli je detekovana cihla
.................... {
.................... output_high(IRTX); // vypne vysilac IR
.................... delay_ms(10);
....................
.................... output_low(STROBE);
.................... sensors = spi_read(0); // cteni senzoru
.................... sensors=~sensors;
.................... output_high(STROBE);
....................
.................... output_low(IRTX); // zapne vysilac IR
....................
.................... if(bit_test(sensors,7)) return 1; // vrat 1, kdyz je stale cihla
.................... }
.................... };
.................... output_low(IRTX); // zapne vysilac IR
.................... return 0; // vrat 0, kdyz je detekovano ruseni
.................... }
.................... ////////////////////////////////////////////////////////////////////////////////
.................... #include ".\objizdka_centrovani_R.c"
.................... #define DOLEVA 0
.................... #define DOPRAVA 1
....................
.................... void cikcak()
.................... {
.................... unsigned int8 i=0;
*
007D: CLRF 39
....................
.................... uhel=KOLMO1; // aby se dalo tocit na miste
007E: MOVLW E1
007F: MOVWF 2C
.................... Delay_ms(100);
0080: MOVLW 64
0081: MOVWF 3A
0082: CALL 065
....................
.................... if (line==L2) line=L3; // poznamenej, kde byla cara pred brzdenim
0083: MOVF 2B,W
0084: SUBLW 02
0085: BTFSS 03.2
0086: GOTO 089
0087: MOVLW 03
0088: MOVWF 2B
.................... if (line==S) line=L3;
0089: MOVF 2B,F
008A: BTFSS 03.2
008B: GOTO 08E
008C: MOVLW 03
008D: MOVWF 2B
.................... if (line==R2) line=R3;
008E: MOVF 2B,W
008F: SUBLW FE
0090: BTFSS 03.2
0091: GOTO 094
0092: MOVLW FD
0093: MOVWF 2B
....................
.................... Delay_ms(3); // prodleva na cteni senzoru pred prenosem
0094: MOVLW 03
0095: MOVWF 3A
0096: CALL 065
....................
.................... output_low(STROBE); // zapni zobrazovani na posuvnem registru
0097: BSF 03.5
0098: BCF 06.0
0099: BCF 03.5
009A: BCF 06.0
.................... sensors = spi_read(0); // cteni senzoru
009B: MOVF 13,W
009C: CLRF 13
009D: BSF 03.5
009E: BTFSC 14.0
009F: GOTO 0A2
00A0: BCF 03.5
00A1: GOTO 09D
00A2: BCF 03.5
00A3: MOVF 13,W
00A4: MOVWF 2A
.................... sensors=~sensors;
00A5: COMF 2A,F
.................... output_high(STROBE); // vypni zobrazovani na posuvnem registru
00A6: BSF 03.5
00A7: BCF 06.0
00A8: BCF 03.5
00A9: BSF 06.0
....................
.................... while(true)
.................... {
.................... Delay_ms(3);
00AA: MOVLW 03
00AB: MOVWF 3A
00AC: CALL 065
....................
.................... if (line==L3)
00AD: MOVF 2B,W
00AE: SUBLW 03
00AF: BTFSS 03.2
00B0: GOTO 0DB
.................... {
.................... GO(L,B,160);GO(R,F,160);
00B1: MOVF 01,W
00B2: SUBLW A0
00B3: BTFSS 03.0
00B4: GOTO 0BE
00B5: BSF 03.5
00B6: BCF 05.0
00B7: BCF 03.5
00B8: BCF 05.0
00B9: BSF 03.5
00BA: BCF 05.1
00BB: BCF 03.5
00BC: BSF 05.1
00BD: GOTO 0C6
00BE: BSF 03.5
00BF: BCF 05.0
00C0: BCF 03.5
00C1: BCF 05.0
00C2: BSF 03.5
00C3: BCF 05.1
00C4: BCF 03.5
00C5: BCF 05.1
00C6: MOVF 01,W
00C7: SUBLW A0
00C8: BTFSS 03.0
00C9: GOTO 0D3
00CA: BSF 03.5
00CB: BCF 05.7
00CC: BCF 03.5
00CD: BCF 05.7
00CE: BSF 03.5
00CF: BCF 05.6
00D0: BCF 03.5
00D1: BSF 05.6
00D2: GOTO 0DB
00D3: BSF 03.5
00D4: BCF 05.6
00D5: BCF 03.5
00D6: BCF 05.6
00D7: BSF 03.5
00D8: BCF 05.7
00D9: BCF 03.5
00DA: BCF 05.7
.................... };
.................... if (line==R3)
00DB: MOVF 2B,W
00DC: SUBLW FD
00DD: BTFSS 03.2
00DE: GOTO 109
.................... {
.................... GO(R,B,160);GO(L,F,160);
00DF: MOVF 01,W
00E0: SUBLW A0
00E1: BTFSS 03.0
00E2: GOTO 0EC
00E3: BSF 03.5
00E4: BCF 05.6
00E5: BCF 03.5
00E6: BCF 05.6
00E7: BSF 03.5
00E8: BCF 05.7
00E9: BCF 03.5
00EA: BSF 05.7
00EB: GOTO 0F4
00EC: BSF 03.5
00ED: BCF 05.6
00EE: BCF 03.5
00EF: BCF 05.6
00F0: BSF 03.5
00F1: BCF 05.7
00F2: BCF 03.5
00F3: BCF 05.7
00F4: MOVF 01,W
00F5: SUBLW A0
00F6: BTFSS 03.0
00F7: GOTO 101
00F8: BSF 03.5
00F9: BCF 05.1
00FA: BCF 03.5
00FB: BCF 05.1
00FC: BSF 03.5
00FD: BCF 05.0
00FE: BCF 03.5
00FF: BSF 05.0
0100: GOTO 109
0101: BSF 03.5
0102: BCF 05.0
0103: BCF 03.5
0104: BCF 05.0
0105: BSF 03.5
0106: BCF 05.1
0107: BCF 03.5
0108: BCF 05.1
.................... };
.................... if (line==S) {STOPL;STOPR; i++;} else i=0;
0109: MOVF 2B,F
010A: BTFSS 03.2
010B: GOTO 11E
010C: BSF 03.5
010D: BCF 05.0
010E: BCF 03.5
010F: BCF 05.0
0110: BSF 03.5
0111: BCF 05.1
0112: BCF 03.5
0113: BCF 05.1
0114: BSF 03.5
0115: BCF 05.6
0116: BCF 03.5
0117: BCF 05.6
0118: BSF 03.5
0119: BCF 05.7
011A: BCF 03.5
011B: BCF 05.7
011C: INCF 39,F
011D: GOTO 11F
011E: CLRF 39
....................
.................... if (i>=100) break; // pokud je dostatecne dlouho cara vprostred, vypadni
011F: MOVF 39,W
0120: SUBLW 63
0121: BTFSS 03.0
0122: GOTO 159
....................
.................... output_low(STROBE); // zapni zobrazovani na posuvnem registru
0123: BSF 03.5
0124: BCF 06.0
0125: BCF 03.5
0126: BCF 06.0
.................... sensors = spi_read(0); // cteni senzoru
0127: MOVF 13,W
0128: CLRF 13
0129: BSF 03.5
012A: BTFSC 14.0
012B: GOTO 12E
012C: BCF 03.5
012D: GOTO 129
012E: BCF 03.5
012F: MOVF 13,W
0130: MOVWF 2A
.................... sensors=~sensors;
0131: COMF 2A,F
.................... output_high(STROBE); // vypni zobrazovani na posuvnem registru
0132: BSF 03.5
0133: BCF 06.0
0134: BCF 03.5
0135: BSF 06.0
....................
.................... if(bit_test(sensors,3)) //...|...//
0136: BTFSS 2A.3
0137: GOTO 13A
.................... {
.................... line=S;
0138: CLRF 2B
.................... continue;
0139: GOTO 0AA
.................... }
....................
.................... if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
013A: BTFSS 2A.0
013B: GOTO 13F
.................... {
.................... line=L3;
013C: MOVLW 03
013D: MOVWF 2B
.................... continue;
013E: GOTO 0AA
.................... }
....................
.................... if(bit_test(sensors,6)) //......|//
013F: BTFSS 2A.6
0140: GOTO 144
.................... {
.................... line=R3;
0141: MOVLW FD
0142: MOVWF 2B
.................... continue;
0143: GOTO 0AA
.................... }
....................
.................... if(bit_test(sensors,1)) //.|.....//
0144: BTFSS 2A.1
0145: GOTO 149
.................... {
.................... line=L3;
0146: MOVLW 03
0147: MOVWF 2B
.................... continue;
0148: GOTO 0AA
.................... }
....................
.................... if(bit_test(sensors,5)) //.....|.//
0149: BTFSS 2A.5
014A: GOTO 14E
.................... {
.................... line=R3;
014B: MOVLW FD
014C: MOVWF 2B
.................... continue;
014D: GOTO 0AA
.................... }
....................
.................... if (bit_test(sensors,2)) //..|....//
014E: BTFSS 2A.2
014F: GOTO 153
.................... {
.................... line=L3;
0150: MOVLW 03
0151: MOVWF 2B
.................... continue;
0152: GOTO 0AA
.................... }
....................
.................... if (bit_test(sensors,4)) //....|..//
0153: BTFSS 2A.4
0154: GOTO 158
.................... {
.................... line=R3;
0155: MOVLW FD
0156: MOVWF 2B
.................... continue;
0157: GOTO 0AA
.................... }
.................... }
0158: GOTO 0AA
.................... }
0159: RETLW 00
.................... ////////////////////////////////////////////////////////////////////////////////
.................... void objizdka()
.................... {
.................... FL;BR; // doprava 90
015A: BSF 03.5
015B: BCF 05.1
015C: BCF 03.5
015D: BCF 05.1
015E: BSF 03.5
015F: BCF 05.0
0160: BCF 03.5
0161: BSF 05.0
0162: BSF 03.5
0163: BCF 05.6
0164: BCF 03.5
0165: BCF 05.6
0166: BSF 03.5
0167: BCF 05.7
0168: BCF 03.5
0169: BSF 05.7
.................... Delay_ms(300);
016A: MOVLW 02
016B: MOVWF 39
016C: MOVLW 96
016D: MOVWF 3A
016E: CALL 065
016F: DECFSZ 39,F
0170: GOTO 16C
.................... BL;FR; // brzdi z toceni
0171: BSF 03.5
0172: BCF 05.0
0173: BCF 03.5
0174: BCF 05.0
0175: BSF 03.5
0176: BCF 05.1
0177: BCF 03.5
0178: BSF 05.1
0179: BSF 03.5
017A: BCF 05.7
017B: BCF 03.5
017C: BCF 05.7
017D: BSF 03.5
017E: BCF 05.6
017F: BCF 03.5
0180: BSF 05.6
.................... Delay_ms(100);
0181: MOVLW 64
0182: MOVWF 3A
0183: CALL 065
.................... STOPL;STOPR;
0184: BSF 03.5
0185: BCF 05.0
0186: BCF 03.5
0187: BCF 05.0
0188: BSF 03.5
0189: BCF 05.1
018A: BCF 03.5
018B: BCF 05.1
018C: BSF 03.5
018D: BCF 05.6
018E: BCF 03.5
018F: BCF 05.6
0190: BSF 03.5
0191: BCF 05.7
0192: BCF 03.5
0193: BCF 05.7
....................
.................... uhel=STRED;
0194: MOVLW 80
0195: MOVWF 2C
.................... FL;FR;
0196: BSF 03.5
0197: BCF 05.1
0198: BCF 03.5
0199: BCF 05.1
019A: BSF 03.5
019B: BCF 05.0
019C: BCF 03.5
019D: BSF 05.0
019E: BSF 03.5
019F: BCF 05.7
01A0: BCF 03.5
01A1: BCF 05.7
01A2: BSF 03.5
01A3: BCF 05.6
01A4: BCF 03.5
01A5: BSF 05.6
.................... Delay_ms(380); // rovne
01A6: MOVLW 02
01A7: MOVWF 39
01A8: MOVLW BE
01A9: MOVWF 3A
01AA: CALL 065
01AB: DECFSZ 39,F
01AC: GOTO 1A8
....................
.................... uhel=STRED-55;
01AD: MOVLW 49
01AE: MOVWF 2C
.................... STOPL;FR;
01AF: BSF 03.5
01B0: BCF 05.0
01B1: BCF 03.5
01B2: BCF 05.0
01B3: BSF 03.5
01B4: BCF 05.1
01B5: BCF 03.5
01B6: BCF 05.1
01B7: BSF 03.5
01B8: BCF 05.7
01B9: BCF 03.5
01BA: BCF 05.7
01BB: BSF 03.5
01BC: BCF 05.6
01BD: BCF 03.5
01BE: BSF 05.6
.................... Delay_ms(190); // doleva
01BF: MOVLW BE
01C0: MOVWF 3A
01C1: CALL 065
....................
.................... uhel=STRED;
01C2: MOVLW 80
01C3: MOVWF 2C
.................... FR;FL;
01C4: BSF 03.5
01C5: BCF 05.7
01C6: BCF 03.5
01C7: BCF 05.7
01C8: BSF 03.5
01C9: BCF 05.6
01CA: BCF 03.5
01CB: BSF 05.6
01CC: BSF 03.5
01CD: BCF 05.1
01CE: BCF 03.5
01CF: BCF 05.1
01D0: BSF 03.5
01D1: BCF 05.0
01D2: BCF 03.5
01D3: BSF 05.0
.................... Delay_ms(300); // rovne
01D4: MOVLW 02
01D5: MOVWF 39
01D6: MOVLW 96
01D7: MOVWF 3A
01D8: CALL 065
01D9: DECFSZ 39,F
01DA: GOTO 1D6
....................
.................... uhel=STRED-55;
01DB: MOVLW 49
01DC: MOVWF 2C
.................... FR;STOPL;
01DD: BSF 03.5
01DE: BCF 05.7
01DF: BCF 03.5
01E0: BCF 05.7
01E1: BSF 03.5
01E2: BCF 05.6
01E3: BCF 03.5
01E4: BSF 05.6
01E5: BSF 03.5
01E6: BCF 05.0
01E7: BCF 03.5
01E8: BCF 05.0
01E9: BSF 03.5
01EA: BCF 05.1
01EB: BCF 03.5
01EC: BCF 05.1
.................... Delay_ms(190); // doleva
01ED: MOVLW BE
01EE: MOVWF 3A
01EF: CALL 065
....................
.................... uhel=STRED;
01F0: MOVLW 80
01F1: MOVWF 2C
.................... FR;FL;
01F2: BSF 03.5
01F3: BCF 05.7
01F4: BCF 03.5
01F5: BCF 05.7
01F6: BSF 03.5
01F7: BCF 05.6
01F8: BCF 03.5
01F9: BSF 05.6
01FA: BSF 03.5
01FB: BCF 05.1
01FC: BCF 03.5
01FD: BCF 05.1
01FE: BSF 03.5
01FF: BCF 05.0
0200: BCF 03.5
0201: BSF 05.0
.................... Delay_ms(100); // rovne
0202: MOVLW 64
0203: MOVWF 3A
0204: CALL 065
....................
.................... While((sensors & 0b11111110)!=0) //dokud neni cara
.................... {
0205: MOVF 2A,W
0206: ANDLW FE
0207: BTFSC 03.2
0208: GOTO 218
.................... sensors = spi_read(0); // cteni senzoru
0209: MOVF 13,W
020A: CLRF 13
020B: BSF 03.5
020C: BTFSC 14.0
020D: GOTO 210
020E: BCF 03.5
020F: GOTO 20B
0210: BCF 03.5
0211: MOVF 13,W
0212: MOVWF 2A
.................... sensors=~sensors;
0213: COMF 2A,F
.................... Delay_ms(3); // cekani na SLAVE nez pripravi data od cidel
0214: MOVLW 03
0215: MOVWF 3A
0216: CALL 065
.................... }
0217: GOTO 205
.................... BL;BR; // zabrzdi
0218: BSF 03.5
0219: BCF 05.0
021A: BCF 03.5
021B: BCF 05.0
021C: BSF 03.5
021D: BCF 05.1
021E: BCF 03.5
021F: BSF 05.1
0220: BSF 03.5
0221: BCF 05.6
0222: BCF 03.5
0223: BCF 05.6
0224: BSF 03.5
0225: BCF 05.7
0226: BCF 03.5
0227: BSF 05.7
.................... Delay_ms(250);
0228: MOVLW FA
0229: MOVWF 3A
022A: CALL 065
....................
.................... uhel=KOLMO1;
022B: MOVLW E1
022C: MOVWF 2C
.................... FL;BR; // doprava
022D: BSF 03.5
022E: BCF 05.1
022F: BCF 03.5
0230: BCF 05.1
0231: BSF 03.5
0232: BCF 05.0
0233: BCF 03.5
0234: BSF 05.0
0235: BSF 03.5
0236: BCF 05.6
0237: BCF 03.5
0238: BCF 05.6
0239: BSF 03.5
023A: BCF 05.7
023B: BCF 03.5
023C: BSF 05.7
.................... While((sensors & 0b11111110)!=0) //dokud neni cara
.................... {
023D: MOVF 2A,W
023E: ANDLW FE
023F: BTFSC 03.2
0240: GOTO 250
.................... sensors = spi_read(0); // cteni senzoru
0241: MOVF 13,W
0242: CLRF 13
0243: BSF 03.5
0244: BTFSC 14.0
0245: GOTO 248
0246: BCF 03.5
0247: GOTO 243
0248: BCF 03.5
0249: MOVF 13,W
024A: MOVWF 2A
.................... sensors=~sensors;
024B: COMF 2A,F
.................... Delay_ms(3); // cekani na SLAVE nez pripravi data od cidel
024C: MOVLW 03
024D: MOVWF 3A
024E: CALL 065
.................... }
024F: GOTO 23D
.................... STOPL;STOPR; // zabrzdi
0250: BSF 03.5
0251: BCF 05.0
0252: BCF 03.5
0253: BCF 05.0
0254: BSF 03.5
0255: BCF 05.1
0256: BCF 03.5
0257: BCF 05.1
0258: BSF 03.5
0259: BCF 05.6
025A: BCF 03.5
025B: BCF 05.6
025C: BSF 03.5
025D: BCF 05.7
025E: BCF 03.5
025F: BCF 05.7
.................... Delay_ms(300);
0260: MOVLW 02
0261: MOVWF 39
0262: MOVLW 96
0263: MOVWF 3A
0264: CALL 065
0265: DECFSZ 39,F
0266: GOTO 262
.................... // delay_ms(250);
....................
.................... line=R3;
0267: MOVLW FD
0268: MOVWF 2B
.................... cikcak();
0269: CALL 07D
.................... }
026A: BCF 0A.3
026B: GOTO 3CF (RETURN)
....................
....................
.................... ////////////////////////////////////////////////////////////////////////////////
.................... void main()
.................... {
026C: CLRF 04
026D: MOVLW 1F
026E: ANDWF 03,F
026F: MOVLW 70
0270: BSF 03.5
0271: MOVWF 0F
0272: BCF 1F.4
0273: BCF 1F.5
0274: MOVF 1B,W
0275: ANDLW 80
0276: MOVWF 1B
0277: MOVLW 07
0278: MOVWF 1C
....................
.................... unsigned int8 n;
.................... unsigned int8 i,j;
.................... unsigned int8 last_sensors;
.................... unsigned int8 RozumnaRychlost;
....................
.................... setup_adc_ports(sAN5|sAN2|sAN4|sAN6|VSS_VDD); // AD pro kroutitka
*
027B: BSF 03.5
027C: BCF 1F.4
027D: BCF 1F.5
027E: MOVF 1B,W
027F: ANDLW 80
0280: IORLW 74
0281: MOVWF 1B
.................... setup_adc(ADC_CLOCK_INTERNAL);
0282: BCF 1F.6
0283: BCF 03.5
0284: BSF 1F.6
0285: BSF 1F.7
0286: BSF 03.5
0287: BCF 1F.7
0288: BCF 03.5
0289: BSF 1F.0
.................... setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
028A: BCF 14.5
028B: BSF 03.5
028C: BCF 06.2
028D: BSF 06.1
028E: BCF 06.4
028F: MOVLW 31
0290: BCF 03.5
0291: MOVWF 14
0292: MOVLW 00
0293: BSF 03.5
0294: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
0295: MOVF 01,W
0296: ANDLW C7
0297: IORLW 08
0298: MOVWF 01
.................... setup_timer_1(T1_DISABLED|T1_DIV_BY_8);
0299: MOVLW 30
029A: BCF 03.5
029B: MOVWF 10
.................... setup_timer_2(T2_DIV_BY_16,140,16);
029C: MOVLW 78
029D: MOVWF 78
029E: IORLW 06
029F: MOVWF 12
02A0: MOVLW 8C
02A1: BSF 03.5
02A2: MOVWF 12
.................... setup_oscillator(OSC_8MHZ|OSC_INTRC);
02A3: MOVLW 72
02A4: MOVWF 0F
....................
.................... STOPR; STOPL; // zastav motory
02A5: BCF 05.6
02A6: BCF 03.5
02A7: BCF 05.6
02A8: BSF 03.5
02A9: BCF 05.7
02AA: BCF 03.5
02AB: BCF 05.7
02AC: BSF 03.5
02AD: BCF 05.0
02AE: BCF 03.5
02AF: BCF 05.0
02B0: BSF 03.5
02B1: BCF 05.1
02B2: BCF 03.5
02B3: BCF 05.1
.................... Lmotor=0;Rmotor=0;
02B4: CLRF 31
02B5: CLRF 30
02B6: CLRF 33
02B7: CLRF 32
....................
.................... uhel = STRED; // nastav zadni kolecko na stred
02B8: MOVLW 80
02B9: MOVWF 2C
.................... rovinka = 0;
02BA: CLRF 2F
....................
.................... enable_interrupts(INT_TIMER2);
02BB: BSF 03.5
02BC: BSF 0C.1
.................... enable_interrupts(GLOBAL);
02BD: MOVLW C0
02BE: BCF 03.5
02BF: IORWF 0B,F
....................
.................... output_low(IRTX); // zapni IR vysilac
02C0: BSF 03.5
02C1: BCF 06.2
02C2: BCF 03.5
02C3: BCF 06.2
....................
.................... delay_ms(2000); // musime pockat na diagnostiku slave CPU
02C4: MOVLW 08
02C5: MOVWF 39
02C6: MOVLW FA
02C7: MOVWF 3A
02C8: CALL 065
02C9: DECFSZ 39,F
02CA: GOTO 2C6
....................
.................... //nastaveni rychlosti
.................... set_adc_channel(CERVENA);
02CB: MOVLW 20
02CC: MOVWF 78
02CD: MOVF 1F,W
02CE: ANDLW C7
02CF: IORWF 78,W
02D0: MOVWF 1F
....................
.................... Delay_ms(1);
02D1: MOVLW 01
02D2: MOVWF 3A
02D3: CALL 065
.................... RozumnaRychlost=R+(read_adc()>>2); // rychlost rovne +63; kroutitko dava 0-63
02D4: BSF 1F.2
02D5: BTFSC 1F.2
02D6: GOTO 2D5
02D7: MOVF 1E,W
02D8: MOVWF 77
02D9: RRF 77,F
02DA: RRF 77,F
02DB: MOVLW 3F
02DC: ANDWF 77,F
02DD: MOVF 77,W
02DE: ADDLW 64
02DF: MOVWF 38
.................... set_adc_channel(MODRA);
02E0: MOVLW 10
02E1: MOVWF 78
02E2: MOVF 1F,W
02E3: ANDLW C7
02E4: IORWF 78,W
02E5: MOVWF 1F
.................... Delay_ms(1);
02E6: MOVLW 01
02E7: MOVWF 3A
02E8: CALL 065
.................... turn=speed-32+(read_adc()>>2); // rychlost toceni +-32; kroutitko dava 0-63
02E9: MOVLW 20
02EA: SUBWF 2D,W
02EB: MOVWF 39
02EC: BSF 1F.2
02ED: BTFSC 1F.2
02EE: GOTO 2ED
02EF: MOVF 1E,W
02F0: MOVWF 77
02F1: RRF 77,F
02F2: RRF 77,F
02F3: MOVLW 3F
02F4: ANDWF 77,F
02F5: MOVF 77,W
02F6: ADDWF 39,W
02F7: MOVWF 2E
....................
.................... speed=R17;
02F8: MOVLW C8
02F9: MOVWF 2D
....................
.................... while(true)
.................... {
....................
.................... GO(L,F,Lmotor);GO(R,F,Rmotor); // zapni motory PWM podle promenych Lmotor a Rmotor
02FA: MOVF 01,W
02FB: BTFSS 00.7
02FC: GOTO 300
02FD: BTFSS 31.7
02FE: GOTO 308
02FF: GOTO 302
0300: BTFSC 31.7
0301: GOTO 311
0302: MOVF 31,F
0303: BTFSS 03.2
0304: GOTO 308
0305: SUBWF 30,W
0306: BTFSS 03.0
0307: GOTO 311
0308: BSF 03.5
0309: BCF 05.1
030A: BCF 03.5
030B: BCF 05.1
030C: BSF 03.5
030D: BCF 05.0
030E: BCF 03.5
030F: BSF 05.0
0310: GOTO 319
0311: BSF 03.5
0312: BCF 05.0
0313: BCF 03.5
0314: BCF 05.0
0315: BSF 03.5
0316: BCF 05.1
0317: BCF 03.5
0318: BCF 05.1
0319: MOVF 01,W
031A: BTFSS 00.7
031B: GOTO 31F
031C: BTFSS 33.7
031D: GOTO 327
031E: GOTO 321
031F: BTFSC 33.7
0320: GOTO 330
0321: MOVF 33,F
0322: BTFSS 03.2
0323: GOTO 327
0324: SUBWF 32,W
0325: BTFSS 03.0
0326: GOTO 330
0327: BSF 03.5
0328: BCF 05.7
0329: BCF 03.5
032A: BCF 05.7
032B: BSF 03.5
032C: BCF 05.6
032D: BCF 03.5
032E: BSF 05.6
032F: GOTO 338
0330: BSF 03.5
0331: BCF 05.6
0332: BCF 03.5
0333: BCF 05.6
0334: BSF 03.5
0335: BCF 05.7
0336: BCF 03.5
0337: BCF 05.7
....................
.................... delay_us(2000); // cekani na SLAVE, nez pripravi data od cidel
0338: CLRWDT
0339: MOVLW 01
033A: MOVWF 3A
033B: CALL 065
033C: MOVLW 09
033D: MOVWF 39
033E: CLRF 29
033F: BTFSC 0B.7
0340: BSF 29.7
0341: BCF 0B.7
0342: MOVLW 6D
0343: MOVWF 3D
0344: CALL 037
0345: BTFSC 29.7
0346: BSF 0B.7
0347: DECFSZ 39,F
0348: GOTO 33E
....................
.................... last_sensors=sensors;
0349: MOVF 2A,W
034A: MOVWF 37
....................
.................... output_low(STROBE); // vypni zobrazovani na posuvnem registru
034B: BSF 03.5
034C: BCF 06.0
034D: BCF 03.5
034E: BCF 06.0
.................... sensors = spi_read(0); // cteni senzoru
034F: MOVF 13,W
0350: CLRF 13
0351: BSF 03.5
0352: BTFSC 14.0
0353: GOTO 356
0354: BCF 03.5
0355: GOTO 351
0356: BCF 03.5
0357: MOVF 13,W
0358: MOVWF 2A
.................... sensors=~sensors; // neguj prijata data
0359: COMF 2A,F
.................... output_high(STROBE); // zobraz data na posuvnem registru
035A: BSF 03.5
035B: BCF 06.0
035C: BCF 03.5
035D: BSF 06.0
....................
.................... i=0; // havarijni kod
035E: CLRF 35
.................... for (n=0; n<=6; n++)
035F: CLRF 34
0360: MOVF 34,W
0361: SUBLW 06
0362: BTFSS 03.0
0363: GOTO 372
.................... {
.................... if(bit_test(sensors,n)) i++;
0364: MOVF 2A,W
0365: MOVWF 77
0366: MOVF 34,W
0367: MOVWF 78
0368: BTFSC 03.2
0369: GOTO 36E
036A: BCF 03.0
036B: RRF 77,F
036C: DECFSZ 78,F
036D: GOTO 36A
036E: BTFSC 77.0
036F: INCF 35,F
.................... }
0370: INCF 34,F
0371: GOTO 360
.................... if (i>4) // zastavi, kdyz je cerno pod vice nez tremi cidly
0372: MOVF 35,W
0373: SUBLW 04
0374: BTFSC 03.0
0375: GOTO 39E
.................... {
.................... BL; BR;
0376: BSF 03.5
0377: BCF 05.0
0378: BCF 03.5
0379: BCF 05.0
037A: BSF 03.5
037B: BCF 05.1
037C: BCF 03.5
037D: BSF 05.1
037E: BSF 03.5
037F: BCF 05.6
0380: BCF 03.5
0381: BCF 05.6
0382: BSF 03.5
0383: BCF 05.7
0384: BCF 03.5
0385: BSF 05.7
.................... delay_ms(300);
0386: MOVLW 02
0387: MOVWF 39
0388: MOVLW 96
0389: MOVWF 3A
038A: CALL 065
038B: DECFSZ 39,F
038C: GOTO 388
.................... STOPR; STOPL;
038D: BSF 03.5
038E: BCF 05.6
038F: BCF 03.5
0390: BCF 05.6
0391: BSF 03.5
0392: BCF 05.7
0393: BCF 03.5
0394: BCF 05.7
0395: BSF 03.5
0396: BCF 05.0
0397: BCF 03.5
0398: BCF 05.0
0399: BSF 03.5
039A: BCF 05.1
039B: BCF 03.5
039C: BCF 05.1
.................... While(true);
039D: GOTO 39D
.................... };
....................
.................... /*
.................... if (!input(CIHLA)) // dalkova detekce cihly
.................... {
.................... speed=PRED_CIHLOU;
.................... }
.................... else
.................... {
.................... speed=RozumnaRychlost;
.................... }
.................... */
.................... if (bit_test(sensors,7)) // detekce cihly
039E: BTFSS 2A.7
039F: GOTO 3CF
.................... {
.................... BR;BL;
03A0: BSF 03.5
03A1: BCF 05.6
03A2: BCF 03.5
03A3: BCF 05.6
03A4: BSF 03.5
03A5: BCF 05.7
03A6: BCF 03.5
03A7: BSF 05.7
03A8: BSF 03.5
03A9: BCF 05.0
03AA: BCF 03.5
03AB: BCF 05.0
03AC: BSF 03.5
03AD: BCF 05.1
03AE: BCF 03.5
03AF: BSF 05.1
.................... Delay_ms(400);
03B0: MOVLW 02
03B1: MOVWF 39
03B2: MOVLW C8
03B3: MOVWF 3A
03B4: CALL 065
03B5: DECFSZ 39,F
03B6: GOTO 3B2
.................... STOPR;STOPL;
03B7: BSF 03.5
03B8: BCF 05.6
03B9: BCF 03.5
03BA: BCF 05.6
03BB: BSF 03.5
03BC: BCF 05.7
03BD: BCF 03.5
03BE: BCF 05.7
03BF: BSF 03.5
03C0: BCF 05.0
03C1: BCF 03.5
03C2: BCF 05.0
03C3: BSF 03.5
03C4: BCF 05.1
03C5: BCF 03.5
03C6: BCF 05.1
.................... // if (1==IRcheck()) // kontrola, jestli nebylo rusene cidlo
.................... {
.................... Delay_ms(100);
03C7: MOVLW 64
03C8: MOVWF 3A
03C9: CALL 065
.................... cikcak();
03CA: CALL 07D
.................... delay_ms(100);
03CB: MOVLW 64
03CC: MOVWF 3A
03CD: CALL 065
.................... objizdka(); // objede cihlu
03CE: GOTO 15A
.................... }
.................... }
....................
.................... if (speed > RozumnaRychlost) speed--; // postupne zpomaleni na Roz. Rychl.
03CF: MOVF 2D,W
03D0: SUBWF 38,W
03D1: BTFSS 03.0
03D2: DECF 2D,F
....................
.................... if(bit_test(sensors,3)) //...|...//
03D3: BTFSS 2A.3
03D4: GOTO 3E7
.................... {
.................... uhel=STRED;
03D5: MOVLW 80
03D6: MOVWF 2C
.................... Lmotor=speed;
03D7: CLRF 7A
03D8: MOVF 2D,W
03D9: MOVWF 30
03DA: MOVF 7A,W
03DB: MOVWF 31
.................... Rmotor=speed;
03DC: CLRF 7A
03DD: MOVF 2D,W
03DE: MOVWF 32
03DF: MOVF 7A,W
03E0: MOVWF 33
.................... line=S;
03E1: CLRF 2B
.................... if (rovinka < 255) rovinka++;
03E2: INCFSZ 2F,W
03E3: GOTO 3E5
03E4: GOTO 3E6
03E5: INCF 2F,F
.................... continue;
03E6: GOTO 2FA
.................... }
....................
.................... if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
03E7: BTFSS 2A.0
03E8: GOTO 3F5
.................... {
.................... uhel=STRED - BEAR3;
03E9: MOVLW 53
03EA: MOVWF 2C
.................... Lmotor=0;
03EB: CLRF 31
03EC: CLRF 30
.................... Rmotor=turn;
03ED: CLRF 7A
03EE: MOVF 2E,W
03EF: MOVWF 32
03F0: MOVF 7A,W
03F1: MOVWF 33
.................... line=L3;
03F2: MOVLW 03
03F3: MOVWF 2B
.................... continue;
03F4: GOTO 2FA
.................... }
....................
.................... if(bit_test(sensors,6)) //......|//
03F5: BTFSS 2A.6
03F6: GOTO 403
.................... {
.................... uhel=STRED + BEAR3;
03F7: MOVLW AD
03F8: MOVWF 2C
.................... Rmotor=0;
03F9: CLRF 33
03FA: CLRF 32
.................... Lmotor=turn;
03FB: CLRF 7A
03FC: MOVF 2E,W
03FD: MOVWF 30
03FE: MOVF 7A,W
03FF: MOVWF 31
.................... line=R3;
0400: MOVLW FD
0401: MOVWF 2B
.................... continue;
0402: GOTO 2FA
.................... }
....................
.................... if(bit_test(sensors,1)) //.|.....//
0403: BTFSS 2A.1
0404: GOTO 415
.................... {
.................... uhel=STRED - BEAR2;
0405: MOVLW 67
0406: MOVWF 2C
.................... Lmotor=speed-70;
0407: MOVLW 46
0408: SUBWF 2D,W
0409: CLRF 7A
040A: MOVWF 30
040B: MOVF 7A,W
040C: MOVWF 31
.................... Rmotor=speed;
040D: CLRF 7A
040E: MOVF 2D,W
040F: MOVWF 32
0410: MOVF 7A,W
0411: MOVWF 33
.................... line=L2;
0412: MOVLW 02
0413: MOVWF 2B
.................... continue;
0414: GOTO 2FA
.................... }
....................
.................... if(bit_test(sensors,5)) //.....|.//
0415: BTFSS 2A.5
0416: GOTO 427
.................... {
.................... uhel=STRED + BEAR2;
0417: MOVLW 99
0418: MOVWF 2C
.................... Rmotor=speed-70;
0419: MOVLW 46
041A: SUBWF 2D,W
041B: CLRF 7A
041C: MOVWF 32
041D: MOVF 7A,W
041E: MOVWF 33
.................... Lmotor=speed;
041F: CLRF 7A
0420: MOVF 2D,W
0421: MOVWF 30
0422: MOVF 7A,W
0423: MOVWF 31
.................... line=R2;
0424: MOVLW FE
0425: MOVWF 2B
.................... continue;
0426: GOTO 2FA
.................... }
....................
.................... if (bit_test(sensors,2)) //..|....//
0427: BTFSS 2A.2
0428: GOTO 43D
.................... {
.................... uhel=STRED - BEAR1;
0429: MOVLW 76
042A: MOVWF 2C
.................... Lmotor=speed-20;
042B: MOVLW 14
042C: SUBWF 2D,W
042D: CLRF 7A
042E: MOVWF 30
042F: MOVF 7A,W
0430: MOVWF 31
.................... Rmotor=speed;
0431: CLRF 7A
0432: MOVF 2D,W
0433: MOVWF 32
0434: MOVF 7A,W
0435: MOVWF 33
.................... line=L2;
0436: MOVLW 02
0437: MOVWF 2B
.................... if (rovinka<255) rovinka++;
0438: INCFSZ 2F,W
0439: GOTO 43B
043A: GOTO 43C
043B: INCF 2F,F
.................... continue;
043C: GOTO 2FA
.................... }
....................
.................... if (bit_test(sensors,4)) //....|..//
043D: BTFSS 2A.4
043E: GOTO 453
.................... {
.................... uhel=STRED + BEAR1;
043F: MOVLW 8A
0440: MOVWF 2C
.................... Rmotor=speed-20;
0441: MOVLW 14
0442: SUBWF 2D,W
0443: CLRF 7A
0444: MOVWF 32
0445: MOVF 7A,W
0446: MOVWF 33
.................... Lmotor=speed;
0447: CLRF 7A
0448: MOVF 2D,W
0449: MOVWF 30
044A: MOVF 7A,W
044B: MOVWF 31
.................... line=L2;
044C: MOVLW 02
044D: MOVWF 2B
.................... if (rovinka<255) rovinka++;
044E: INCFSZ 2F,W
044F: GOTO 451
0450: GOTO 452
0451: INCF 2F,F
.................... continue;
0452: GOTO 2FA
.................... }
....................
....................
.................... if ((L3==line) || (R3==line)) // Brzdeni pri vyjeti z trate
0453: MOVF 2B,W
0454: SUBLW 03
0455: BTFSC 03.2
0456: GOTO 45B
0457: MOVF 2B,W
0458: SUBLW FD
0459: BTFSS 03.2
045A: GOTO 480
.................... {
.................... if (rovinka>50)
045B: MOVF 2F,W
045C: SUBLW 32
045D: BTFSC 03.0
045E: GOTO 47D
.................... {
.................... BL; BR;
045F: BSF 03.5
0460: BCF 05.0
0461: BCF 03.5
0462: BCF 05.0
0463: BSF 03.5
0464: BCF 05.1
0465: BCF 03.5
0466: BSF 05.1
0467: BSF 03.5
0468: BCF 05.6
0469: BCF 03.5
046A: BCF 05.6
046B: BSF 03.5
046C: BCF 05.7
046D: BCF 03.5
046E: BSF 05.7
.................... Delay_ms(100);
046F: MOVLW 64
0470: MOVWF 3A
0471: CALL 065
.................... if (rovinka > 250 || speed > 170) delay_ms(50);
0472: MOVF 2F,W
0473: SUBLW FA
0474: BTFSS 03.0
0475: GOTO 47A
0476: MOVF 2D,W
0477: SUBLW AA
0478: BTFSC 03.0
0479: GOTO 47D
047A: MOVLW 32
047B: MOVWF 3A
047C: CALL 065
.................... };
.................... rovinka=0;
047D: CLRF 2F
.................... speed=R17;
047E: MOVLW C8
047F: MOVWF 2D
.................... };
.................... }
0480: GOTO 2FA
.................... }
0481: SLEEP
 
Configuration Fuses:
Word 1: 3F38 NOWDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB0 NOPROTECT INTRC_IO
Word 2: 3FFC NOFCMEN NOIESO
/Designs/ROBOTS/3Orbis/SW/main.PJT
0,0 → 1,41
[PROJECT]
Target=main.HEX
Development_Mode=
Processor=0x688F
ToolSuite=CCS
 
[Directories]
Include=C:\Program Files\PICC\devices\;C:\Program Files\PICC\dr
Library=
LinkerScript=
 
[Target Data]
FileList=D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
 
[main.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
 
[mru-list]
1=main.c
 
[Windows]
0=0000 main.c 0 0 796 451 3 0
 
[Opened Files]
1=D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c
2=D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.h
3=C:\Program Files\PICC\devices\16F88.h
4=D:\KAKLIK\programy\PIC_C\roboti\3Orbis\objizdka_centrovani_R.c
5=
[Units]
Count=1
1=D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c (main)
/Designs/ROBOTS/3Orbis/SW/main.SYM
0,0 → 1,76
015-016 CCP_1
015 CCP_1_LOW
016 CCP_1_HIGH
020 @INTERRUPT_AREA
021 @INTERRUPT_AREA
022 @INTERRUPT_AREA
023 @INTERRUPT_AREA
024 @INTERRUPT_AREA
025 @INTERRUPT_AREA
026 @INTERRUPT_AREA
027 @INTERRUPT_AREA
028 @INTERRUPT_AREA
029 @INTERRUPT_AREA
02A sensors
02B line
02C uhel
02D speed
02E turn
02F rovinka
030-031 Lmotor
032-033 Rmotor
034 main.n
035 main.i
036 main.j
037 main.last_sensors
038 main.RozumnaRychlost
039 cikcak.i
039 objizdka.@SCRATCH
039 main.@SCRATCH
03A @delay_ms1.P1
03A cikcak.@SCRATCH
03A main.@SCRATCH
03B TIMER2_isr.n
03C TIMER2_isr.@SCRATCH
03D @delay_us1.P1
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
07B @SCRATCH
09C.6 C1OUT
09C.7 C2OUT
 
0065 @delay_ms1
0037 @delay_us1
0047 TIMER2_isr
007D cikcak
015A objizdka
026C main
026C @cinit
 
Project Files:
D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c
D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.h
C:\Program Files\PICC\devices\16F88.h
D:\KAKLIK\programy\PIC_C\roboti\3Orbis\objizdka_centrovani_R.c
 
Units:
D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c (main)
 
Compiler Settings:
Processor: PIC16F88
Pointer Size: 8
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: 1,8,16
 
Output Files:
Errors: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.err
INHX8: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.hex
Symbols: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.sym
List: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.lst
Debug/COFF: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.cof
Call Tree: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.tre
Statistics: D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.sta
/Designs/ROBOTS/3Orbis/SW/main.c
0,0 → 1,288
#include ".\main.h"
 
#define KOLMO1 225 // predni kolecko sroubem dopredu
#define KOLMO2 30 // predni kolecko je hlavou sroubu dozadu
#define STRED 128 // sredni poloha zataceciho kolecka
#define BEAR1 10//10 // 3 stupne zataceni
#define BEAR2 25//25
#define BEAR3 45//45
#define R 100 // Rozumna rychlost
#define R17 200 // X nasobek rozumne rychlosti
#define PRED_CIHLOU 100 // rychlost pri dalkove detekci cihly
//#define L1 1 // cara vlevo
#define L2 2 // cara vlevo
#define L3 3 // cara vlevo
#define S 0 // cara mezi sensory
//#define R1 -1 // cara vpravo
#define R2 -2 // cara vpravo
#define R3 -3 // cara vpravo
 
// servo
#define SERVO PIN_B5
 
// kroutitka
#define CERVENA 4 // AN4
//#define CERNA 5 // AN5
//#define ZELENA 6 // AN6
#define MODRA 2 // AN2
 
// IR
#define IRTX PIN_B2
#define CIHLA PIN_A3
 
//motory
#define FR output_low(PIN_A7); output_high(PIN_A6) // Vpred
#define FL output_low(PIN_A1); output_high(PIN_A0)
#define BR output_low(PIN_A6); output_high(PIN_A7) // Vzad
#define BL output_low(PIN_A0); output_high(PIN_A1)
#define STOPR output_low(PIN_A6);output_low(PIN_A7)
#define STOPL output_low(PIN_A0);output_low(PIN_A1)
 
//HID
#define LED1 PIN_B1 //oranzova
#define LED2 PIN_B2 //zluta
 
#define STROBE PIN_B0
//#define SW1 PIN_A2 // Motory On/off
 
unsigned int8 sensors; // pomocna promenna pro cteni cidel na caru
signed int8 line = S; // na ktere strane byla detekovana cara
//unsigned int8 dira; // pocita dobu po kterou je ztracena cara
unsigned int8 uhel; // urcuje aktualni uhel zataceni
unsigned int8 speed; // maximalni povolena rychlost
unsigned int8 turn; // rychlost toceni
unsigned int8 rovinka; // pocitadlo na zjisteni rovinky
 
signed int16 Lmotor; // promene, ktere urcuji velikost vykonu na levem
signed int16 Rmotor; // a pravem motoru
 
// makro pro PWM pro motory
#define GO(motor, direction, power) if(get_timer0()<=power) \
{direction##motor;} else {stop##motor;}
////////////////////////////////////////////////////////////////////////////////
#int_TIMER2
TIMER2_isr() // ovladani serva
{
unsigned int8 n;
 
output_high(SERVO);
delay_us(1000);
for(n=uhel; n>0; n--) Delay_us(2);
output_low(SERVO);
}
 
////////////////////////////////////////////////////////////////////////////////
int8 IRcheck() // potvrdi detekci cihly
{
output_high(IRTX); // vypne vysilac IR
delay_ms(10);
 
output_low(STROBE);
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE);
 
if(bit_test(sensors,7)) // otestuje, jestli je stale detekovan IR signal
{
output_low(IRTX); // zapne vysilac IR
delay_ms(10);
 
output_low(STROBE);
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE);
 
if(!bit_test(sensors,7)) // otestuje, jestli je detekovana cihla
{
output_high(IRTX); // vypne vysilac IR
delay_ms(10);
 
output_low(STROBE);
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE);
 
output_low(IRTX); // zapne vysilac IR
 
if(bit_test(sensors,7)) return 1; // vrat 1, kdyz je stale cihla
}
};
output_low(IRTX); // zapne vysilac IR
return 0; // vrat 0, kdyz je detekovano ruseni
}
////////////////////////////////////////////////////////////////////////////////
#include ".\objizdka_centrovani_R.c"
////////////////////////////////////////////////////////////////////////////////
void main()
{
 
unsigned int8 n;
unsigned int8 i,j;
unsigned int8 last_sensors;
unsigned int8 RozumnaRychlost;
 
setup_adc_ports(sAN5|sAN2|sAN4|sAN6|VSS_VDD); // AD pro kroutitka
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED|T1_DIV_BY_8);
setup_timer_2(T2_DIV_BY_16,140,16);
setup_oscillator(OSC_8MHZ|OSC_INTRC);
 
STOPR; STOPL; // zastav motory
Lmotor=0;Rmotor=0;
 
uhel = STRED; // nastav zadni kolecko na stred
rovinka = 0;
 
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
 
output_low(IRTX); // zapni IR vysilac
 
delay_ms(2000); // musime pockat na diagnostiku slave CPU
 
//nastaveni rychlosti
set_adc_channel(CERVENA);
 
Delay_ms(1);
RozumnaRychlost=R+(read_adc()>>2); // rychlost rovne +63; kroutitko dava 0-63
set_adc_channel(MODRA);
Delay_ms(1);
turn=speed-32+(read_adc()>>2); // rychlost toceni +-32; kroutitko dava 0-63
 
speed=R17;
 
while(true)
{
 
GO(L,F,Lmotor);GO(R,F,Rmotor); // zapni motory PWM podle promenych Lmotor a Rmotor
 
delay_us(2000); // cekani na SLAVE, nez pripravi data od cidel
 
last_sensors=sensors;
 
output_low(STROBE); // vypni zobrazovani na posuvnem registru
sensors = spi_read(0); // cteni senzoru
sensors=~sensors; // neguj prijata data
output_high(STROBE); // zobraz data na posuvnem registru
 
i=0; // havarijni kod
for (n=0; n<=6; n++)
{
if(bit_test(sensors,n)) i++;
}
if (i>4) // zastavi, kdyz je cerno pod vice nez tremi cidly
{
BL; BR;
delay_ms(300);
STOPR; STOPL;
While(true);
};
 
/*
if (!input(CIHLA)) // dalkova detekce cihly
{
speed=PRED_CIHLOU;
}
else
{
speed=RozumnaRychlost;
}
*/
if (bit_test(sensors,7)) // detekce cihly
{
BR;BL;
Delay_ms(400);
STOPR;STOPL;
// if (1==IRcheck()) // kontrola, jestli nebylo rusene cidlo
{
Delay_ms(100);
cikcak();
delay_ms(100);
objizdka(); // objede cihlu
}
}
 
if (speed > RozumnaRychlost) speed--; // postupne zpomaleni na Roz. Rychl.
 
if(bit_test(sensors,3)) //...|...//
{
uhel=STRED;
Lmotor=speed;
Rmotor=speed;
line=S;
if (rovinka < 255) rovinka++;
continue;
}
 
if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
{
uhel=STRED - BEAR3;
Lmotor=0;
Rmotor=turn;
line=L3;
continue;
}
 
if(bit_test(sensors,6)) //......|//
{
uhel=STRED + BEAR3;
Rmotor=0;
Lmotor=turn;
line=R3;
continue;
}
 
if(bit_test(sensors,1)) //.|.....//
{
uhel=STRED - BEAR2;
Lmotor=speed-70;
Rmotor=speed;
line=L2;
continue;
}
 
if(bit_test(sensors,5)) //.....|.//
{
uhel=STRED + BEAR2;
Rmotor=speed-70;
Lmotor=speed;
line=R2;
continue;
}
 
if (bit_test(sensors,2)) //..|....//
{
uhel=STRED - BEAR1;
Lmotor=speed-20;
Rmotor=speed;
line=L2;
if (rovinka<255) rovinka++;
continue;
}
 
if (bit_test(sensors,4)) //....|..//
{
uhel=STRED + BEAR1;
Rmotor=speed-20;
Lmotor=speed;
line=L2;
if (rovinka<255) rovinka++;
continue;
}
 
 
if ((L3==line) || (R3==line)) // Brzdeni pri vyjeti z trate
{
if (rovinka>50)
{
BL; BR;
Delay_ms(100);
if (rovinka > 250 || speed > 170) delay_ms(50);
};
rovinka=0;
speed=R17;
};
}
}
/Designs/ROBOTS/3Orbis/SW/main.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/SW/main.err
0,0 → 1,2
No Errors
0 Errors, 0 Warnings.
/Designs/ROBOTS/3Orbis/SW/main.h
0,0 → 1,18
#include <16F88.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //Reset when brownout detected
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor enabled
#FUSES NOIESO //Internal External Switch Over mode enabled
 
#use delay(clock=8000000,RESTART_WDT)
 
/Designs/ROBOTS/3Orbis/SW/main.sta
0,0 → 1,35
 
ROM used: 1154 (28%)
1154 (28%) including unused fragments
 
2 Average locations per line
3 Average locations per statement
 
RAM used: 32 (18%) at main() level
35 (20%) worst case
 
Lines Stmts % Files
----- ----- --- -----
289 190 49 D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.c
19 0 0 D:\KAKLIK\programy\PIC_C\roboti\3Orbis\main.h
279 0 0 C:\Program Files\PICC\devices\16F88.h
140 200 34 D:\KAKLIK\programy\PIC_C\roboti\3Orbis\objizdka_centrovani_R.c
----- -----
1454 780 Total
 
Page ROM % RAM Functions:
---- --- --- --- ----------
0 24 2 1 @delay_ms1
0 16 1 1 @delay_us1
0 30 3 2 TIMER2_isr
0 221 19 2 cikcak
0 274 24 1 objizdka
0 534 46 7 main
 
Segment Used Free
--------- ---- ----
00000-00003 4 0
00004-00036 51 0
00037-007FF 1099 894
00800-00FFF 0 2048
 
/Designs/ROBOTS/3Orbis/SW/main.tre
0,0 → 1,36
ÀÄmain
ÃÄmain 0/534 Ram=7
³ ÃÄ??0??
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_us1 0/16 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄcikcak 0/221 Ram=2
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÀÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÃÄobjizdka 0/274 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÀÄcikcak 0/221 Ram=2
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÃÄ@delay_ms1 0/24 Ram=1
³ ³ ÀÄ@delay_ms1 0/24 Ram=1
³ ÃÄ@delay_ms1 0/24 Ram=1
³ ÀÄ@delay_ms1 0/24 Ram=1
ÀÄTIMER2_isr 0/30 Ram=2
ÀÄ@delay_us1 0/16 Ram=1
/Designs/ROBOTS/3Orbis/SW/objizdka_centrovani.c
0,0 → 1,131
#define DOLEVA 0
#define DOPRAVA 1
 
void cikcak()
{
unsigned int8 i=0;
 
uhel=KOLMO1; // aby se dalo tocit na miste
Delay_ms(100);
 
if (line==L2) line=L3; // poznamenej, kde byla cara pred brzdenim
if (line==S) line=L3;
if (line==R2) line=R3;
 
Delay_ms(3); // prodleva na cteni senzoru pred prenosem
 
output_low(STROBE); // zapni zobrazovani na posuvnem registru
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE); // vypni zobrazovani na posuvnem registru
 
while(true)
{
Delay_ms(3);
 
if (line==L3)
{
GO(L,B,160);GO(R,F,160);
};
if (line==R3)
{
GO(R,B,160);GO(L,F,160);
};
if (line==S) {STOPL;STOPR; i++;} else i=0;
 
if (i>=100) break; // pokud je dostatecne dlouho cara vprostred, vypadni
 
output_low(STROBE); // zapni zobrazovani na posuvnem registru
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE); // vypni zobrazovani na posuvnem registru
 
if(bit_test(sensors,3)) //...|...//
{
line=S;
continue;
}
 
if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
{
line=L3;
continue;
}
 
if(bit_test(sensors,6)) //......|//
{
line=R3;
continue;
}
 
if(bit_test(sensors,1)) //.|.....//
{
line=L3;
continue;
}
 
if(bit_test(sensors,5)) //.....|.//
{
line=R3;
continue;
}
 
if (bit_test(sensors,2)) //..|....//
{
line=L3;
continue;
}
 
if (bit_test(sensors,4)) //....|..//
{
line=R3;
continue;
}
}
}
////////////////////////////////////////////////////////////////////////////////
void objizdka()
{
BL;FR;
Delay_ms(300);
FL;BR;
Delay_ms(100);
STOPL;STOPR;
 
uhel=STRED;
FL;FR;
Delay_ms(360); // rovne
 
uhel=STRED+55;
STOPR;FL;
Delay_ms(190); // doprava
 
uhel=STRED;
FR;FL;
Delay_ms(300); // rovne
 
uhel=STRED+55;
FL;STOPR;
Delay_ms(190); // doprava
 
uhel=STRED;
FR;FL;
Delay_ms(200); // rovne
 
While((sensors & 0b11111110)!=0) //dokud neni cara
{
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
Delay_ms(3); // cekani na SLAVE nez pripravi data od cidel
}
BL;BR;
Delay_ms(300);
 
uhel=STRED-55;
FR;STOPL; // doleva
delay_ms(250);
 
line=L3;
cikcak();
}
 
/Designs/ROBOTS/3Orbis/SW/objizdka_centrovani_R.c
0,0 → 1,139
#define DOLEVA 0
#define DOPRAVA 1
 
void cikcak()
{
unsigned int8 i=0;
 
uhel=KOLMO1; // aby se dalo tocit na miste
Delay_ms(100);
 
if (line==L2) line=L3; // poznamenej, kde byla cara pred brzdenim
if (line==S) line=L3;
if (line==R2) line=R3;
 
Delay_ms(3); // prodleva na cteni senzoru pred prenosem
 
output_low(STROBE); // zapni zobrazovani na posuvnem registru
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE); // vypni zobrazovani na posuvnem registru
 
while(true)
{
Delay_ms(3);
 
if (line==L3)
{
GO(L,B,160);GO(R,F,160);
};
if (line==R3)
{
GO(R,B,160);GO(L,F,160);
};
if (line==S) {STOPL;STOPR; i++;} else i=0;
 
if (i>=100) break; // pokud je dostatecne dlouho cara vprostred, vypadni
 
output_low(STROBE); // zapni zobrazovani na posuvnem registru
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
output_high(STROBE); // vypni zobrazovani na posuvnem registru
 
if(bit_test(sensors,3)) //...|...//
{
line=S;
continue;
}
 
if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
{
line=L3;
continue;
}
 
if(bit_test(sensors,6)) //......|//
{
line=R3;
continue;
}
 
if(bit_test(sensors,1)) //.|.....//
{
line=L3;
continue;
}
 
if(bit_test(sensors,5)) //.....|.//
{
line=R3;
continue;
}
 
if (bit_test(sensors,2)) //..|....//
{
line=L3;
continue;
}
 
if (bit_test(sensors,4)) //....|..//
{
line=R3;
continue;
}
}
}
////////////////////////////////////////////////////////////////////////////////
void objizdka()
{
FL;BR; // doprava 90
Delay_ms(300);
BL;FR; // brzdi z toceni
Delay_ms(100);
STOPL;STOPR;
 
uhel=STRED;
FL;FR;
Delay_ms(380); // rovne
 
uhel=STRED-55;
STOPL;FR;
Delay_ms(190); // doleva
 
uhel=STRED;
FR;FL;
Delay_ms(300); // rovne
 
uhel=STRED-55;
FR;STOPL;
Delay_ms(190); // doleva
 
uhel=STRED;
FR;FL;
Delay_ms(100); // rovne
 
While((sensors & 0b11111110)!=0) //dokud neni cara
{
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
Delay_ms(3); // cekani na SLAVE nez pripravi data od cidel
}
BL;BR; // zabrzdi
Delay_ms(250);
 
uhel=KOLMO1;
FL;BR; // doprava
While((sensors & 0b11111110)!=0) //dokud neni cara
{
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
Delay_ms(3); // cekani na SLAVE nez pripravi data od cidel
}
STOPL;STOPR; // zabrzdi
Delay_ms(300);
// delay_ms(250);
 
line=R3;
cikcak();
}
 
/Designs/ROBOTS/3Orbis/SW/objizdka_cidla.c
0,0 → 1,64
void objizdka()
{
int8 shure=0;
unsigned int16 n;
 
// toceni na miste dokud nezmizi cihla
//------------------------------------
uhel=KOLMO1; // nastav zataceci kolecko kolmo na osu robota
Delay_ms(100);
BL;FR;
Delay_ms(200); // minimalni toceni, kdyby se zastavilo sikmo k cihle
 
While(bit_test(sensors,7)) // toc, dokud neni cihla z primeho senzoru
{
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
Delay_ms(4); // cekani na SLAVE nez pripravi data od cidel
}
STOPL; STOPR;
 
for (n=0;n<1000;n++) // vystred se na hranu cihly
{
if(!input(CIHLA))
{
GO(L,B,180);GO(R,F,160); // zapni motory PWM podle promenych Lmotor a Rmotor
} else
{
GO(L,F,180);GO(R,B,160); // zapni motory PWM podle promenych Lmotor a Rmotor
};
delay_ms(1);
}
STOPR;STOPL;
 
uhel=STRED; // dopredu
delay_ms(100);
FR; FL;
delay_ms(500);
BL;BR;
delay_ms(200);
STOPL;STOPR;
 
uhel=STRED+BEAR3; // doprava
delay_ms(100);
FL;
delay_ms(400);
uhel=STRED+BEAR2; // min doprava
FL;FR;
delay_ms(100);
uhel=STRED+BEAR1; // jeste min doprava
FL;FR;
delay_ms(200);
While((sensors & 0b11111110)!=0) //dokud neni cara
{
sensors = spi_read(0); // cteni senzoru
sensors=~sensors;
Delay_ms(4); // cekani na SLAVE nez pripravi data od cidel
}
BL; BR;
delay_ms(400);
 
uhel=STRED-BEAR3; // doleva
}
 
////////////////////////////////////////////////////////////////////////////////
/Designs/ROBOTS/3Orbis/3Orbis_Small.jpg
0,0 → 1,376
ÿØÿàJFIF``ÿþSoftware: Microsoft OfficeÿÛC 
+ÙVâ­0TWsZÄáŒ0¿ãåÛ´®,•b’¤Ý;‘ªZK
+Â4‘®ÜܸeãúŠ3Ñ\Ä$‰Ã)ô¥ËÕk” æܾ.ªíëÜoI‘Ö4,çPQD=JWKSœ4‡}h%üê.#‚Ìx—%IÜéÍOWYü:9’G`*f…`°Ù­Ü‹þbuæbt€Sá‹bõ'ׅïÿ…Ë%|ïøÿÒFf4ëA
+¬§ØÖý*¨Y“R›t‹ÝçÙÜïoڂËÀó+”ðTŸjf.3ÔÖ>_ˆl
+I¨Ó£]ƒûÑ2þb¡ †-äjÞ\`Ïpo€a@£”܉m Â*¿,RnXò,hpÒP}sùU¾YIR¿æ%ç?é!òâ>µ €AdÕâ¨E
+ ~—O’IQšþÖ]ÚP>ñ>ƒ·Ê…K¨ õÞPX©RÈ7ö;ûÓoÄ<C§ê‘Ço†-:ÂåG݂zg>Ù4yv¦ û¤ÂŽ¸×Àü¾<áH-uY +ñ‡Â‘²ýI¡7šÅüúԚqðÐË/+ãÌ3íZ:ñ~‘¨êï§Ia߄ ñŠñԏlÕfçŒx6Êù揆 kÇÎÀýwÍ*8ã'¸Ñ¨×äxâåiøªþä®´Õ忑ôÝA –ê sÆwè6«¬âG‚ûP¿k[Ü*A(ÊâjŠßi%¤ÍaiµºŽPòŒúíC¬ø›J¹ÓÞk­9¯n\$×OåÛÓéGpRÝ\™5œú™]m_«4."Ö/àÓÞûOžÍ¡‰y¦Gb‡±ªêë¬\ÅŠ`yN\Êyr=z£êVPݹ¼ºi-IÞ2¼Ê=75r{ý'P…Z ‹YR1þ”˜÷Á¢íòžoO¢»{ —d> ?„ƒÚŒèWVv Op—–R+† »+ª¥V¯"±‚ú9EÝÀԘ$«g¡#¦7¢wöº~©©¦&©5¥ÄƒCÌÄd“A«[²<o¦iÃ8Ïœ—(–Ö°ëdÓCjg´ÍȓxñþÞ´1´óic'„“]êÜsò…ä0©è¨;{Ò´ýSáû­Bî æöéÍäËÊÇ÷HΦµÙ¿¾±°]É&'c“€FÄ
+xëi,ėFó·Š?Ìó7ohJ3NíÓ¾œ7e¨ÝZ\éPJ €±øÉÃl¿þRÔú‘Ó¥y­éˤpºÁsyjòM¨AÉðñùc
+z õÅCàËÛ­kRŠm>‡O·
+¶Ñ&:ã×ùÔoµNJçMµ‚K |H¤NŒÄù¾´Óõv/#d”’“e²øi£M½¿¹k‡Ž8‹B[È\³ŒïU=[´ø a…Ü
+IcHŸÌdÕÚ #Ä<ihÞK¦€Æêû2í¶!X,¶z–³%šÅ2ÝÅ)G@Ítt󋋆GküäƠԚ‚§Úü˕¾›¤êœI¶Z…Ôª™–é$Œ&ðǭ՝t­2[Ցá“
+é¯b“ÚËq)žx'lg‡4RÏ7Á#•¾#¢Z!­¬dñªòܹß?J³„
+¡@Ø
+GðÛÑrá{Ó-"Eh¡V»b»PéÕ:ô“)¨t¥È4t'ëWíEâ©iÏ*SZ.“P¾Â‘.ƹ[›n•Žg4@#cL[ÅâÜƝمD“4mßÀÒ-Ó‘š*Gµ7i‡h?uE>G­hFbÓ]^sQ]Ì=EãÚêó™}Ew2ÿ¨CÚêO:ÿ®ç_â*º“â'ñ
+šæw8DåùÔ-Y¹míìC›Ó¯)Øÿ:3̾¢€ßÜEwg}70À_
+¥É¢‘ñæ¯0éŒU>}_P³Ôll¦¶h î< çë늕Äw×qsI}+ËX<yG¡=Êм)ÿ­…T¼£D2úw‹'+܋m¤ÚÝë©\€ÝɈÊäs»î©Ô–êz
+—|ºE¦³<Rho­K
+9€ºv¦oø’âÄñdB¡ˆFÀõ¬L¯reÇfý³áÍOˆõé#HäŠÓN±N–±°Qp(7q`½áã¦<ᗕ³ÊGzD,:…°¸ÖtÕmðòçÿ/jqø
+Î{v¸Òn—R(2aY9[éëOǤi&×ùúŒ”ðGàŒ—>íÿ`÷k®·öœò±€'èjÉÇz>¥+´úf#~`Ûúç±ô¬ËCž;;¨ÑKE,o÷ºbßÞµž'×nìxwMÕ­–9`g\Æý#cžÛÖ“•8äêïÀ“ôã<r¦­Z+:mݤ–ÐB-;Ñ&&i çÇ¡Cãû¹¬x‘ J…FÇçWŠt‚ðIcÍ-ҁ! €÷Rz³¾(¸—[½7¢ÙÖbpÀtÅ?
+”ro‘Ï¿O²}–n“VÔµD’àOðù™È<¤ã gÞ´Ž‚çV¹‚è»Í4"h 1ålˎž”ìÉg^²Žè*-ÌÅâL`²¨ê~xüªíÄ
+G¾S3(½É×Í+sÚ ¤vÃqêOý©ÝGDÓõUÿ3.? ‹³¯Ö«ü{ñ6Ž}à'Ú­Y5nN2¥ÚàÁ&ý™[6ú «ÌŒoìvQ´ˆ=qދišÎ«ÄÖáKÜmˆ©¤æ©ú× ¯ôr`Ÿ<Íœ>£ûS7Ã'ûœ?uÿböI~ùOÒLMéT½#‹nídø]QòœÆ
+üÅ\¡¼Žâ!,RCÜPO =¢Ô›tøgÛқ1ŸJ‘ãW —¸¥P\žjv†=ÈØw£q늨_ÃÈP(9ڂI.˜Îµ_ëW30`¼Ø2{1ekEÖ ‰ |È{U
+«ˆ§¡$aÄÐ…¶¼cí ¥ÿˆ ]>ôÿúužËÇúÃ?4J‘¯aËQߍx‚_þ`¯ÉE&˜Û4¯Û³ÈÓ/1î W~ÚºÆe܏™²ÇâmvC½ìŸCL¾µ«ÉøïdÿÕSk.ÍzÛUšâ`’Ú<+üLˆ˜¬Éÿ¨Vo¯Üïvÿúª-Ýíê*¢Ü9f8ÎzTÚÉfìú…š¾ê!óq\5[ÒòG‚¬$©ifvn䚍6 -‰H󝳚“vWžîý­ìZÙñ¾ï“•Kä×Xì–À|Ídße÷ÒGƐ—ñ"eÉüëi¸Õ!·|&¥$]þZÆÒ[ü¦¢ÞéúµÅ£Ç-Äë…^â¥.¸&,v÷Oïr`S“øÓ&c˜ÅôÍU”ãj™ÿÒÕ-S¼µYäJ§fSH>•ä–Òi.̼äCÊ00O§Ï
+Ä­O†Äuü]¿*cZÑ`†Õb¹æIÝ¡9$tßÓ§zŸ«=†…¬j"Ò&šÐ†Š:†ažÿÏzL7S§]À
+·žáû…c‰‹€«ê;üèEÑÀŒ®wjÉ®Èí¼6Œ"C'.ÎîsšwFà«î$³[\[ÆnY3“ùSwZ¹á¸^Ôy‰V6Äs|ÜT[y®t»t%F¥r ƒ¹åÔ·œ-#é3,RyTJTg©Îƙ¾¸ŽgiU
++î£Ú—‰J3r
+ðÃ`àŒÒôð%¾Kà•¨£¤­‘ÉÊ­y­ß5¡µy2ƒ Ó|Qϳ»WÖx€ÚOq2Ã"òԌ`þµPýŠ,f‰mä[ÒüÂfr@;rôö«w[iö:|·ê¶ë4ºc–&rÒ/EÎÛ{P|)p¨'–mÛa.(µÕukKwoÏœÅMôC™•2?ÇLÕ?Šµ‹{ÍÁY^KÝQ›qâ >•ªhz™]VâÅÄ*²ªK
+¦Ï¦ZHó4àÜ a’&B`uÔôªâ–\ÝÍ=/s'ƒ9ŸaŸZ¨Gdœ—’åñEEø"ßjWò.%fbzgaKÓµK½.ín-gxÙ=Zž48•˜0•F½-twò†“?:-üØ;#UEæÆâӎ,<uT‹\<Ü»xËèj×gqÙ¾©¥:‘qDªž¡Æãõ‡XÍ{ÃzÒºÈc•A¨÷­Ó…x¦ ÉÖO†ÿ7*…eS4­D}H©.…Ê–*´ù_*0›\ø~aÞ­<9¤K¬ÍÊ䥔;Ï)Øè©£º·𾉫\.¢÷bRæ_…¡Ž@Èê>µSՎ¡a¦"YÙHy1¶Ç¹Åh‚I&ٞsmÔQ¥ð¹¤j—¶\Œð.x…m¥Õåi·²9VÿÚjµö{ÁÖÜ(×÷"éfg5t>B½Iö9íDøžà/
+± ËË€Ò«¯öi >K‰ÄRƔƒrçÛë^|C{UÐý™ÞÁ!úןü-ÕencÄT,¥›—9¦ZñVýjá7Ù^ºCG ÿkb¼‹ìÃR1{vvõªvZ¢žfñŽ~¾ô»=óSeã—}ݎæjÿaöI!Ìí óæ5i°û.´·åñï®$÷TòŠ…ªE…t-?‡g[ÛÍB9n@¬{…Ïó«øgnKK9®Ùv¢ö|/¤XÉhŒGwó֊)ŠÂ*¨€Å WÛ%ûõƒ]¸+É6èFüçqO/Ü˽æ¤ä cŠ=ß¡ü©"c 뚮 É.Ò£h<cë+¦[O¸Ò¤i4njÄw6óý-ڊåÔ9$.ÙÍ[`ìR|‚¯5©Õ㝴ۨncÛ*¼êËÜUK]â9[ŽåîæƒÁ9H¼• dö¡:þ‹µ§<nƒÇ1IÁôÏ¥R’NÁ–5Ä¿ƒÿÓ+®}£ßFKxѭáÈ:탚§_ý£kWÊ¡¦
+ ròŽ‡éQx„=°–ÞU*èü¥MWþ‰»ýÁ/‡|f«j»
+7I7Ðj÷‹µ{ы‹‚ñ’¹÷vTWÕ®¯å坁p”9—È7ïR4ÙV+†,Ê҉ÒnßgÐßÿ†iÿ&ÿù²–ªÇÙòÁv·^sÿî4cTÔ­4ëvñ®d;ÎOåA¶Mð‚y"—,¨<rÂæF;ˆã$ú„–*Ò¨‰U呱w½ô¡K 77Æì[ʼß餎Yßߺ*ácZu¯vO‰2à¹Ø(þè(z[çÈÅ«Ô’ú#ãø"º®^S
+;ü;¥YÀ%76ჱèåŽ~˜­þçDÑ.¤7údÅǙ¤E%¾g½fZÇXj7ÒÛXCÍÌdY-Ür/¢òŒìMŠ¥ò½É»ògÓÝÎÁbi•NÀž”±4™VçczNµjÚuܶì9c!X7cQdâν›­12¨~î?ŠåWi9O^A’MxøNæÞ0ìQãUÈ܁œÒbÒ¯¸‚ySO¶/*…<ŠÁ@í¶jÉÿfúƒ;ˆÖ6qŽväu/!'W~§Ö—(n儥µ^Ú_ðވ¡$獜#m«Fû=åƒE@Ò[\P^ ¹·[h¡ñ’Àì±»êF'2(
+á7îgjq¤E8åXS9å횼qq$še _,¹8É¢P¸ŽíŒ'*§lõ"¬IÑ 2aBÈڑw¥Ai”EᲶKôm”¨ry„Vöڄa aÈêØÜã®)»k˜Î '×4UœÏahÖÁ«9dæÝFÀSÒ*d° ïA]–þE¥´‡Öî•m¦·‚ERKÏøqS¬…Ƈ­Bgº†iA´M‘×oåB8^B×3Ëv8‚»lÇ(Mµë.¨È»ÄI
+OQU’ÚÛàfž~žE&i¿k6ëNÓ¸†ʲx2ãßuýr+7±•ÞâQ–S‘[€#âνѥ Èc>{7Põ
+~¯„P¯Í؃¸4<ê.>Áj1úyMG‡ø’ãNÒn¡kFš%pN:®Gý¨v¹Å"m:ýl#o†šÛïVEêsÛûн^K¹¬õC (“Í–RpuÇåŠ ¶÷_á[鋏—š<‘Ë‘Ò¢ŸÁ_0~/$Ü|eøÀ^y2@í½_aâ{ø•`YHŒy@ö¬òÕKKã"­‹q„ëëޚÒt¬ë}™ã'(nEÆÛV–Þ%”`øPžP~t'ZâQªÚª‚LŒ$G·Ê’·1µŒª§Î"aËÜ櫃 àì}(3ÁÇ,›é×ð?ìÝ.ªm®µvø>!yy,¤Jõ©pwڋ'µžR¨˜h‰ß
+VoíDsüT‘ÎGîŸ_—­G^$¼Q‚Á¾c4¯ñ ·ã†6Ï]¨°Êx§¹uå{‹ÉöVIF‚\xðx…pÃg_Cý©°y§ށ¶¿œœŠŠl„V;
+n§éPn8[K¹ÿRÕjò0}£?ܚé˜\»LF¥¥w5´Ïö£ÍŸ»eù„>Í4ô4r¸ÁÏZ‹[‰–ôÓ@­*/Ê1íDTQ•á
+0©.ÃÔW‡‡ç^Œ¦©gÆü‚ðÍx!Z§‰:/©­oM‡Â²…1ÑEgzn“4Wñ4 r5¥C,AT
+ø*z\!OJr’]W©ªgžÝ ª;
+eî‘ïQd¿ÁÂäüª­‚JI‘GznåsÐI23uj§ ¶°‹]"÷Ë^øA54ûÕY{I-q#wÇʛ,ORi ׄÕ‘ÄíŠ\R*li³^µ «iy¶)‰gŽ/ÆÀT[ËÁ
+•Cæõô WwxRd'ó«ì K¢^§¨M2²[Ê;œÕ^çV½ÒÜ\x¬yOgʟb*>«¬2«8©7úÝ֎\ò7cWH®{#qv¨uKù.ʅ39r«Ò‡Ã4‡„L€Èn‹ç·(ÀÅO±Ó¢Õæhe¹0ªD_›Øu¡—+m([5²´²Î%Kœž`€ˎ€½®‹®[__¹ŽÚ'”ƒ¾Ãæ{UƒLáÿ
+´L¬|§›˜ü€ÅVî&³¹ã µyU0(U 7‚W9ü÷íS$ùI4Ú<™ä¸ñ£Ç{Æwšu—„P•7Ï6XzV=Kˆ¹¸£EŽ2ÔA™"\!æ]¹ýqŒÓí¯Y[ë£R¹·Š1tyüŒÙHõ÷¤Øjšy½˜ÚÛ ‡–7¢€Ì
+õ'ۮԸͥLÔþÍË[«‚,\AÏö†Å¬!6kn#ð€û øÎqüT½'[Y8ßWy¬b{B¡a×îԌg”zõýivšžok4~Bvʆ¿¹Æh%¥¨¸Èe•‚d‡8³Ûz%‘?³òÅÖз kiq¬k’\éðË‹Í”yA;/·Jo…uðú>«5݄32»È>Ø\dö ±Hž!V¸û—8òþ÷µ.ö1m$–é'$%~l ÷¢Þ…­U'¯üü‚:N¾ÑðÜÓéË-Ø<¹ñŸÃíªN£=¾¡Âü?jcµ·šü}äùc"òƒžqêNôÂÜ\Ç"xŽJŽvŒ?(
+:±4ê^ƺŽ˜‘N QG f 6ý?­\f·¤ú-&W‹|côÿ T¼ ~'Êhî QÍ,À…ðÆ{‚j>·Ãò薱ÜÇqÚ3ò²Æ+ïWÁ{áC5§…nû¿‰_—ÐzSú~¡olÒ$ЇWHR0|1ó=+|£‰BY^ Å©yc‰Çâ«C0BÍЀ1¾õ"ûDºµXo'ðÈìàúÂËN¸¶€ÚYYvÞ%$÷Fõ1íÙ_ápKk&CÂP`×¥bnÆ^×LÉøW~­-ˆå؏c֗öƒÁsqÕæ™ 2O¸ÂÿpÀ?­#Šã‹K×"Ž h­M¸äðãۙrHo¨5¥i:ªßpº^ñ$<ã¹uü«#{2n]3nO gåpÿèȬtî#šÒÖÖé.
+\sY#¯7§nµ7Jà>!øIí<H"ófÊ°ôÚ´aÅ\©ÊÑ;7Ã
+œJ¸/ó=Í]moÅÀG®^«r[Zܯ™F=ÆGåQÂæг˜Œn¼ËýÅ3ÔÆÿké×èÝ¢Ýâ—äøýÍÃð¢9üM×#PˆJ²#Œä«f«ËÆŒ1o­˜üU£:V»§Ü ÂÅ,½ùÎôœ˜§ø£Êù[>ªúŸÿÕÒ¬®DjÖÂÒHã‹ð¹aÊs¾Ô.ë@ºÕ59oÄP¤G
+«Ï»c©8j壖D*ž„Q+K›`H¾&0TccY£?q®5É\^
+?Óãpÿ;É°ßj¶ ËÿæbÿÕ]ñ'¥Ì;ú0¦&Šä§?ùIŒžÙ«
+iK§Å;øa]Èz
+•$–˜ÿZ=¿Ü(_†VRmò;Õ§l§ÐôŒ¨…Û ¬2ùoï-®µ‚@µŽä¯)= ÿZܤOysÁüª¯wÁëyc=ðíífºø†ð˜’zd`³Šc°Q“q$Sƒ¤ËäË-»3Žë’v?J§«.™wnFvód`šØõo³ího¿F‡8(øØöúUŒ4;…žÞ]ÄrîÜđGʳÊÏQ¡ûKÁ‡ÿ¶QVC’u`v§ŸÅ’ìÊä̇ŒoW;Ë-%xTܛ(×Áä¹PAóNG~”‡-´ýCY[{—ç…¦ÁØb9z
+ƒRÚnÓ$ÇÍàbùsV$TM‘U~B£iš]¦‘§Ece‡oò©bÝwêk˘eÍoÄ=©ñ´/–Jy%%Ófmö± È.­5ûuʨ\èO”ÿOʽû7ÔÂÏ%„§)(åå==¿L֓¨ØÁªé²Ú\§4R¦Mbþ¼3Äë'Տ}ö¤æ£N‘îoþ®?°^Óeáî(½±RÂ4”´[þãn¿¡ÇÒ­¼5§|}Õ¼NËÌ19>loG¸ÓD·Ö¢±Õ•.úŽ£úÔ=
+õ †ür±úÒ嬊ðÒKË4ùu{8Ԗ™p:ïP&â[$¬èܖêÄýkÏ'cIzÙ7´‹Ë.§[7Ì €;Ðþy¥ó<‡'ޘ³+‰¤´¤º
+îi—À›ìâêN‘cԀԠkgLX¥g4žjôêÊ=¯E&½ Íy^Wg¡f¼Íyšó5bmZƒÉ­Áf’Ç¹Þ²•jÓ>Ùm^>'Yðye‰H?LVh£›…®Ù¨ðÏÙzޙ£.·ŠCåˆ[ë¹ÆÿJ¯X6¬ÝX‡/á7(vêñ4Ïý¤j\-
+¸ÕQA­c‹lô8þñüIˆÚ5;ý}*•{öŸ­LÄ[xvéÛ “ùÕ>òæ[»©&•‹319&£Ñ(‘"Ҝ¯‡ËÞxƒøYAfÎa¹u[èRvšˆ¬÷4êTÚ®× trÊ*»^Æí¦q|Ћ$‚êÓ³/QGW†÷-gH¸Ãf°þ×WIÔcq|E“žYc'£ÐÖ»7™­ãÔt+õ+*ó¢1;ƒÛ›½ q“¬«ó_ö‹”qÉ^'µû>¿'à5-È£’3`²‡ü ÷Ï¥8$B£<¥ð°ªºk¦‹7&³c:.9|@¸Sé¿J³iŸ¨ÙøxSaW#™G¦?:©iÒV¹B7É:|3ÿÖ¹\Fòs<¬6¿Ê´K(Ä60F ¥S Óá-4Y9UëÐg5w_Â>T¬qIð›k“Úðç;
+5§·œ%ÐBž Žnùµg]ˆÓnÖFuˆFØ`àÐ䏎”sÇ&ÉÉò—?UÐvöÔÚNW9FÑ·ñQ³Ví+OmSFu{c-ºäÃ60qè3UK˜<™Pó¨8 ZL¯™è´Ú¨e{/•û‘É9=«Îô¢§;ÒÒv
+(é°kÞmêÊȯE7šW5K ¼×„ÒsIfô¨]sWf¡]êV–I›‰Ñ=³’~”ãŠ$—)an}¤“ûPK$cÛ0”ºDo´~C sEÊ.­²è[naÜWÏÚÉ­!§ú㻿n{ÉÝÿۜô¨·'¤^H$¸³V~ì3KŽ²)ÕpÒ¾ìÂఒâA#4„ãaZ‡
+ð p[™µ4,Ò.Ð秹÷«Ž…¦iäk8ãaûØÉü蚠¥åÕ9*ãÀ£ËäÎõ~º·æ—Is*uðXá‡È÷ª•ÆŸu÷6ÒÂÙÁ¤o[ž½EÔ´Û}RÑ­®G2Áî§ÔPÇS5à â‹0ïŸ Š¸êœ¨Y;41üD=š1¿ÔU~KY"nWB§Ñ†+Ls'Óðƒ
+0êÈêHÉÜSZv¦ŒyíLY¼H¨H9de=Ž)©ú¥¹†è¶<­½A§§f~¸<§›ìud=ësû šßWáû›”--¤€« òߝaÊ+aûN}wSVÏ'Ï~aA8Ú
+JM
+‰ì*Ñ ð¼š^¶÷¡bHL(~fæؒvÆ6§ŽtäÁxg
+z³ùf½ÿiXÙ.?ôïW¿–UIø,ÀÐ
+ñäH¼Œ¨£rXà
+±‹xyþ—û2TwCË$²r"’|ÕW<k­#7,«ÊNÀ 8£Zô‚-”6ò7/^ÝêšcÚ´I#©ön› ç’)Øhqæ±ÊA0{òTË^9ži+Ëxò¿—µUü!éKH±/҆ÓÐéd¿¶F٬戩9Í†öڃϢêpO,Ë|G$g#s^ØjÝa
+麱;çµ4Aw2LæY Ë3¦›ÒážK>?O#‹ ðÖ¯qf÷Öú£Éq7ܸüYÆã'¶{Óz›iד‰fێ^Ì9³îsPŒ¸1íP§¼
+.xíOÅ6~û›-òÂ>T @RGqJÎ⪐ÉfÉ%¶Rt?{}=ô…搑ÙGE¡ºF„×|kkp2Êäö"¥zÑ
+Ð5âæâÆ4nF!âòý(ã}áMò—‚R!‹˜ã8ùÖ­ÙT7é;Ú߈¼9Y9d; w&ï€Æ—uWq·3J)Øg®õvø·VQ㈒FNq·zú쇆®ørÆëQÔ#1Íxª±ÂFPo“éŸJ%ü ðùIííÌ÷ dOqæ#ä:
+²Çs¶æádþfÛa±?*[›}ڗ #. áIU«:†»z$*²`{T™õK3­]ÉãÜrÄD„ô
+rMdϖuð³FŸ¹šö{©JüÛí“F>
+û[P$›”íüUYdš3/2C±¤‚ö©²/ÁVÒ?ÿÐÏljþ._λöÖ¤3þr_Πs
+â«Ӈ°ÍÌ!û{Tüä•ïøƒUéñ²~”3˜d
+â{šžœ=‹ÜÂC_ÕÍ¿ä+‡jŠÀüSî æȯI^”=‰½û„Ïê¬Ùk¦'Ü
+ôq¨ù“ù
+i@Tx¡ìMò÷
+"ÕA\îN?£©xŀ”ð*£ó\Bƒ»Š¶Z¹ÜÀRå‹°Ürl›owx:ÌIÎ:Q [½Bw $˜]ò1Ò¡ÄÑ4xäœçÐæŠÀD,càØü±CècöäÇ.EÓé—Ìâ3ÈHÛ5ì«W }%Œ§ 2•Áõ~ɘ^Ù9¬ù’~ãÇHˆ2 £
+ƒHG1Àö¢0ÚÅà.ÿÅë^‡T ¤Ip1×zТ‘›Qö†lÜ7KÙÜííLIrª079¨3Þã;æ†Ét[=~†ˆÂN¹Ô˜ŒïíC¤¸f'sŸLÓ\Üˌoë^¨dààôª,ôæCš÷— šó>•çC½Bt;RƒRXœ…5âw¨ArIÊpjHº’tŽ±»[E*fš+c.O±(|˜cŽjÖþ̯”è²ZøRI2Î
+oëíD¢ŸaG$±ÉJ=•›[½Ë
+6Ɩƙv¥††Ý©‡juˆ¨Ò5QdK©"vså&²ÝoZ’ÍÛážW?v‹ýjñÄ×¢ 6Bpn}ª¥ÁbÃX¾ŸRžh¹"~Hcc¹>¦µâk7‘™s^Izkó<ÑøŠmÚ/ñ5»¬Sœ$ØÝO½[a^D&´•%‰º04í"{­B¥ø ©ªöWöú¢$Ò΂_2„;mµ=M¤ßlF]'üM-¥eˆރêU¦Ø‚ž7/ðG¹ª\Óêú»fîå’3ÿN?(©VšL0…ß½yéjRèôÒ¾åÀí×jú‰+j‚Ö#ß«Th4—‘ü[§i\õ,sEc„.Àb¤¢‘Ú‘,³—fˆÂéa´H¿
+â¦"àS‹ŽâœzP"ÛlJæ EpU¥rZ I6+ӄ¸•¢SÜ
+i_–\¥×,âØ9sì*¼J#„üÍV†})@ŸJ[ÔÍô1ià» I¯\ÉЅÕïg”ù¦o΢¨§Uh7ÍöÃÙô…‡fêÔsM@¶e»± X­ãä´Eö­hܬǭ•B†'ÀSž‡­EDQ)åt©ÓÇΘ¨ }è
+qäaµlg;øŠÆˆÀE|y¾%¿ªMâkH£÷j飔XõýñrÄþB³ýrU:ìÌN nh_á"—úÆ«w¥GÉ'!–5óÝÎ2hÚ.°ºo¥µ€y^f–5'•èqê•áÈ"Ô4+NiDt1“Ö†]pý”—²ë–êyϕœ‚7éYùŒlé6¥%eC‡õîÔ"ðµ-*òÐe™üÅ\ô&á|Íw¦ÊchÏ#üCn;ì*ü$å &µjW±ñj»y ç6âvÂyA^ïI‹ŒѦ0ŽEIÓÿ<´n Šíõ+Û¹ã·E”Ç9ÁeæÎï@)Wœq¤[8h̗?…p?Z¢]X\!ËdŠ$ :æ‹×o¡±Ò(òݗOZF#O‰•iFXoíUC‰µ{í¦º“—øTà~”.AᑐNN2J_!xl[#°©¹¾Yj‹¤…ÙëWVwK'3I·/)ß#ÓåVMk‰4uáhZã…`[‰[ýcâÇ¡çz«6Ÿyp9!‡ÎÛ7¨3® ö‘E1•âAåRÙ÷Å? ¢»2êa&ø@ »ícU]Ï*ô¥x ïÊvÛ4ì‹nR9Oº×xJfn»2Œt9¯<Aèj@…ExÐ ç?¥B ó}Î+ÇuètÁŠdõBÿÑÉçlŠO;zÎ—ðç¯ݪÆ’`u§|}©?
+Óõ›Í9þâSÉûÈz4È[pwô¤˜ýhf‘¬AªC̤$Ày“4Wëߥv(;סˆe+Ôt'}ézð7íP‡­‘¹i¦pxï‘Þ£K/j…Ž4Àu?JŠò’|¦’['9&¼­VPôrs&äV·öVÓ|Èx›‘›"LmÓ¦k0Óôé®eH¢¤™ÎTdÖûÃ:\š?ÛYÊePK€r4Åì€gœG¨® Þ\+bNNHÇû›aüê¹ÃÖ?­ÛÛ6öúD˜v3¾çòÛò§8¾ñ?iÙZσ°kۏp ò®æ(¿Ú=¾‚—3ÿö›×72Ÿvޙ‘SñÁ]]]@A©3L±©EA¨ÒFAÍ AXßJ+lsNË'-BysœíTYGãGy-®•IȌY·ƒ™Io•ký¿4 n1ŸOáû.÷F„5¤,юS•ÚµgµŠ>ÆLRO$£äÏáèâF.£¦NqS¯tç½´²Uƒ˜D¸rÙ¢ÚuºÞæÊ.Ey<5 КÑtþ‚ÚÑ»*3ŠDx•Ž}R3T€z
+yaö¥*vÍ8çOEg‹àSë\ §8É`¶x¥·Jô0î)Áˎ•eXJ÷¥€¸ëJ
+“hEp¥\ªIڈ•KÉ>•m´àMEၮ•¢–á<H` —eõ>•„xz]_U–5mÚ¶Y¾Ï¾/M†k#x÷`y_c\zä“êh[ö*ÌWPÒït CÄXl±#äjգꉩY«çïÃ/¥¹°¼›KÔ£Ô2YÈ"¹IO™fʳ7Rm;V~W-r§ÆvªjË4Nl So ™
+%ãGe¡vgÚÈË 1‚qU®}Eµ«*=’R[ÄÎÀw­KPÐὉ”Rj²86öÒí§·•KzƒƒZñÊDzF,Мrz#OÃ×Vz”w•#é«5¾¯ ˆ H˜v+š&™­DrZFù55ãêñV†b~Yªx/¦ŠõÚ|ŁE+b)ÆqN©ä¨õG°žÕèPwÅ(Û­*ÏcޕÈ1֔ޖó«H«ia½,éKډ [öÍ8)À¿û4 (Ò±šqI=«Ð£Òœ=(Ò³ÕÅ,rׁkйE1Å`zâ½
+zO)ô¯@5e
+äô¯yi=+ÞcDPô´³*®zäû
+ÎÔ곆¼õÆIà
+ôFAëM,Œ{Ó«+Ù¢H\J})fl‘÷avéJWÆ(è±¥âœRž´â…'µ@¶6¸"–µ/]á⊁³Àzõ®
+¼§•óýhWÞÝÁ¤Ï2Jй^‘œcë@Û*ÝÃL©¯Ì‹ À”OLƒ¿ò©öèIi0>ñûz¯G g,z÷«.š®°'e[''’w5Æg¸3òÀª;SoÊ 3*Œšª(m½C½Ù\ã¯!¬'Epˆ·ºÇ…u¥ËÃBÅØ|ÏOÊ´ë) °ôåPãn Ö1­#EqjHò¼@©­3‡ïæºážy.¡Íºòœr³nŒÛnûVÜKƒ—©§Ê qÙm­ìSjzLÑZʊ^X¤<¨qÔçµevß´l¼ÉüJsŠÒ¸û]»Âh³Ï¬ =Ƀ ;ãeù
+•öuÀì¢={T”¦SáZrNÙlöôÅh]›³ÿÔÏãcqå`6éOËÌֆЊÛuá{ܼV­o!ýëwåý:U]à´°½–+[àÉ+“¾Ù»EM4ObÌ3b«rÀѹt«?Nj[Ÿ…^Yºrô®kg½»Ž$µf’BÇ
+—vù
+ú™Tá’×V†ôiQ$8Cÿ¨žäï½k5⪢…U
+ `6½ ú„ݳ«««ªuuuuB]]]P‡WWWT!ÕÕÕÕuuuuBr¤Ç–;ŠTVÁ@'sî)à•Â£µg€ gâé\ޜäÅZ@¶p\ž´àÞ¼•ý⎁= íKǽ'p)[Š$ èÎzÒÃ0ïHæÛå\MBć¦)bOUÅ7ßҔ1Ž»ûÔ(pH)\à÷¦w•èùQ=‘ê+Ü
+á–ß—ZµÉp›ƒ»×ÊÖñ\ÝÜÉq6Su`{ƒëV]Œ8ªÚo˱ó…2¯>9º·ÏÜÑâmóM4·ñ¬S8‰¹ƒzdSKfäÉÊ ä;‘¿çYDßhÚ®™xŒb†b
+óóùU6>ä±·º±­çdæ œ«qڝ]væ̬Zµ£(]„Ñn¦³)Õ¨òt'v×.(;(\ìwô¨ Ì­º¶Æ¼‡Qµ¼NhgGÏ¡¤s`çµf¦»6nMpâ1#Á<gšÂIüIV> ¼ø® ’o e™_?”s)üÅG¸1Ig ™C(Bwíµ3o, ež/éZ1äuɏ6%Òév£[×![Ó#G,¾$Ì –+ÔÿïÞµÛÎ&áý5[»§E–5HÉ°².Ô®í¯fG"Ί*0T{Ñh§Ð&ãKñÆ^<qCnž
+Ð)¶Ý©­GR±º¹šM:Ùí¬‹âwælz“úÒ4ø÷P†Ì 2LÁco÷•d#YXÜÜêöéH^NE|~6é_Fè:\Z.™om1‰•’EP›¾ýzÐþà88yÖòk–¾¾DäY¤Rî{|éOWº×nßFМéuz¿…¸Sý*8ÅÍðuÉÿÕ´q6³ÍÚÚéqËȁñ]Q¡=÷úP!¦\ܞkû–aÿ‡À«Õž•i£i¿ Xâ#ï$rú“UíFÒÞgŠÜ›‡ÎGÐýk&¦o¼
+üÅU²é{—ªê¢„ø·Mói\ZӁÒ+زÔgùWŸâN6Ó~æÿ…¾6NÓY¾U¾~Ÿ¥K~ÄÛìBäaޜ㠦÷ÏSJôÎ+Œ‘ÕOîҀQÞ¹N)A†zD Àz5+”ú
+𥀧¹«(O)÷®¥èk€>Ƭ‚q]ƒÅ/æµç—Њ²>µîk‚ŽÆ½Çmªì‡™Íz¥vzW‡ëWeóTûˆ<RT³lzPêv;‡yyPqLƒIÛiµH:$SÔíO«ÆGQUõ¼QœÀ?ò¶)Å¿ÿÍ_®iêq~LïƒR‚úÓ£“s“ïPä=EÀòZRÝ#§…¶éâbŠÓò ‹^%gó
+&KˆÏÝHŽ6uqý½©\Ïe‚'d0yOQéNƒá³6þ&áË×õÙnn£[B0¨Ý íù
+¼§Ùþ|¤ xI܍™j­Ã qah‹RO™õ5yÓu†i ‘WF⚩™%enûìÓO°*Ë
+œä„z 'è÷MÓ¿µ^µýbÎ[@­0Y3²¸µV†þ§–S…êõ%DVENÑ´èŠ'< ~â¯*Ð}RHí`h­aŠ=J®ÿ¼Ôâä8 ÍòëTýVêYـ£¶7¡à$Tµ̗,ÀË×5ÛHÈɃïEd…ÙöùS°Û(ñº2Æ}ª÷Qu`C _ÅùÓ°'Þ.ô^[A!O®=G¤`Æ\oUºÂŠä¸FÞ´KÓ Ì­åp
+>5¹ÕQdâó°ùôþtØƗ4"sÝ%¶Æïo/4ÉùõkDº,"hà\È|·¦ÕæÆ]n×QÖVæuµ· âOzüÒJìpªý㎝€¥]‹ H
+ÿZcSÑm¬âW³·H@ëȽGÏ­[V5ÅÌ),lÜw¤Î
+°¼Òø’3œïCx†ìXðÿ'6$¸ncòíDDfYÒûç!Þ¨üw© Wáão$[V÷т*Ý,¦²Šõe¹´k¾#9í։Í']ÆåѺbK~ŸQ@­á&sûÕá‡Âk$²´éã†2VÂri:]ÓodOe2Ïç^IÂ҆ÂÀ$ÎàÅ2µº‹89¨À²Œ«•ôÁÅE“Ü¿FºeœðܑŽr'Œöç„ãó¯A”Œ$°±ô-Ëüê¼5mNÐQ¸@7å~F”8Ó]×I(¤‰Oô£S‹íéÍtÃW\?¨å·/ŽèÁ¿•F{ «PD–²¡r¦˜‡íù|FŸg(î4b×íÙÆ&ÑnÔzÅ(#ò4wd^<ÅÓµ1Ÿ‰½Ž0*yÛ½*ͨqN‘6•3Ú$ëpS . _(=pwÞ ZꑦC<ÐŨ^N9åRUsÛ Ž”ìX¥?À¬FL”þ ®™©-¹ z¹iÚ¥—†[âǜàmÚ²I5–™³k`#Bz†$·j–§m‹‡sÊÀméFð8v×ê{¹I—ëf±Ô´Ë›ëÛ»‘X·‰܄$îsAìna]T‘b(Ä ç'¶MV´­zà[”Xc”‹†5:fÒÞB÷0ˇ¹éC%Õ?Íä—e¢HLʃŠu¤JP_zåâ}9bW;oå¨sñ„2±KKygž?–inN¨$×dFÓ&ü¨k߃¸>UŒœwÅ$êzÍÎTKmj§øÜd3Qä‹ÅÏÅñû„oîh~¬5ì=,%oT‰±Ñ˜
+=å´oþ¯6=J[^‹Í=á”ÿº^¿AR ¸áÕ|[Å?nHËŠŸ ¶Érý©$ -µ›Éïƒ^xz­ÀÜÇn§ßÒ¬òxqB%’4·‹³Ïäü‡SùPiµë_’Ü™ ýà˜AÔֈé¥W*Šùÿ`}{t®Oä@]XæâifoA°§>ÒÔíhG¶MLšTKq$æDæÜ+yOÑGõ¦-¯­"ó|;3gn˜O&Ÿ¼Ÿè¿¸KióÄv!¤‘€hàséÎ1úTK§¹H^iT¨QÔ/õ4oöÜcqlI÷jÄ:³\hï„ ,¤œÕ-sº‚Kè‰-#«•¿Ì®5Á›I<é&•o=¿ÄxmâeAÉ-¶æ’ ˆÚZ1–Y²O°=)SF³]Ü! ,Äúu?:'=Î؍´J˜ÜÅ3:ÂóÄ$ç\ã8ê(ž›}­ZFß
+íG•Û#Ú5ßYi¾5ÓÍu¨º•X„Dˆ‡`3µ»º»/,om‡îüMŽ(æ‹ÛŚN“ö™¯hÖQ.¡§Auf£ã<¤˜«5¿Úރ<AÞ;ˆ›¡^oÔVa¦jÍà±´s9'-„QÜÕ÷Mû8µ‚kÛÙd˜Ž‘yUOõ œãØqÆåÒ.CíS@™Ê«H?ä1S¡ãK+±›t2/³-e·Ü&Ú<ÿ5¢ê}ÈÈ`=H&òÙtòº–‹rþ|Ñ3y£?ÔPïRü,'Š»FÃ{¨E¨*ºÀÈêw<ÀíP ÜÕ‡8š=JñÒ)Ð~&ØsPâ‹+Vðáoˆ“ åè½`Í Ê}rmÅ(F>^&$ŠyÄ6a¹¤Ùz~t#áµÍlóL>Øôç½—ûÑ+>Óí
+-¤Œu’7ò¢Zo麑äI|9Îh®Iõ º·iښ–tÎ? юVúÔß þ%_Bmk¦#®E%”ïT›MZÿ†ï’ÃWoÑÎ"¹ôùÕÍYC‚HÈ ÒòcpçÀIßJ檢ˊìnÉ*ò“î?ú՜Â:äÐ.(¶k0O̖íâ uÇz!¥_‹Í:ƒ•ÁùÓ'ñbRöà§õ%4XèÇê)²ŽPjG9aÔ~t–'çYìmŒŽqÓ?COG©^¼±Ï2@ƼÈÿؤ’¾ôQœ£Ó)¤ûA©-.mBfT†$2yº°ž-¼i†²ã ­/Ž… ÎŒË.17?ʲÕИ¢°èޕè#§QðqÞ¢Ro’Zñ…Ð;Gt]f[ë;Ëéãÿ/h£Ê§G==†Ù5Y<;p7
+õq¿$omÅyδ÷ìûqá6}©ÆäÑ|U<rö/|=ÄåOzìm^yGXÛò¯ r/î·åUµ—¹{Š;Z㞴jÓA
+6ôçueͪØö×$»ƒn±ÚÈK²ù姰©ÖWz\$·ÌÆcÕTŠêef‘É,Ç'5váí>Ûö\2xŒŒ2X­SÏðì@úM=ï°YtŒšt7’·î¬ˆ PZM_…gÒâ·' Î.~„íùVùXG§Àˆ²"”Ry[Û&³Ÿ´q&‡aÅ¡ŽF’d‰RQ܍Î^Ö¹B·¹pٝ¾™}diʼ¡²XyúŠ…+,rü?ù™fV(ú~u/SׯìgÐÅÌT7z~kÙÓBý¢ñ"»Hˆ£±È'úP»ì8×D{í®"-=¤Êz/›ô©VºkÄ$)z;¤jãہɬßH<¬¨=Qj žs';K!o^jË’âèkÇ *’ Ü=Ü,~3HFÿw'õâôìùôìň¤A­j~† vmêXâ˜ÖÚSêÈ)Ë[—ÊOò@}׆×æÄG¨i‘œ¦”¬{s¹ÅLN!ÔXxZ|ڃ·ùx¼ßŸZ`k£÷tÛ@}y+××oˆ+HG¤h µ¹z\}
+,“Êd•Ë±îMHzŒ•.<֒ØÔ8¶iB/N˜’"¤ŽÛÓ“Ï|Ðۉ‡ïoý(UîTI5µÙ\¶•ä©9·–§Å`íjì§20'jˆ¬ŠæhТ‡ÉVê*Ãa$n¨ªG0ê;×Nøàä>ÎÓ5k;(#I-›â`ù¦5ýQµ ’{Q?éF]Ï©ö«]Õºr[̪0냷B(V¡¨ZY˜6ë%ôHV݉F;s• WÍã܏Àúˆƒˆ%@…ÁÓ­\·(,[w'jÂ⸒‡¸¦FÚP»1ôÏz¿ÅÃZö²«.±ª˜b`†“ä)â›NèцMZêS¥Ø%¹IøSz¥]øºåãK¤é3$n0ØÙß}ªåaÂz>œC­¨šQÿRcεØQ°…gSŒDZÎ.j™xSÆò$¤[ɣǛ:Òô+-2 (§µ·Pî¹iÌÄüÍWøâÄ ËK¸¿Ô`PûӚ7XéúD‚îNV‰Ž¹öÌ­åĤ…ãK]¥ÌÈ=i—¸…6ycSîEQΣÄ<PÇöl?eœx­¶¿Ò¤EÀż÷z¥ÃÈzòŒ
+ˆaŠ<³sÀ=E&xåÊ
+qVœ¶¼*·w)
+ø«I+`È}w¬Kx˜Îi鵀–qYÜg‹+uÆ{S¥6PŠn 8çŒm,í­L½†{¤˜H|6 ßÜSÄ­r46¹e•¶"±®
+G‚n,Äm¨kŒÁԐ"CÔvÉ?Ò¡M gê6×üE<‰2¼qªÆ¬FÝ\Õ&[«l¹sè£5ڔÖÖ:´ðá®7Âø§9út§ââxÂxbÖ4^üªIöÊW\^WÆVÒB=Xb´~ àÍ~ãM7ÖZžš— ©w#°'oçUH8¶ÒÜ6mF#l튲pHï—œÓ\ʑ/7)»tªi ãe¸}™<ìZÿ‰õI،7) ŸÏ4âý“ðê坯gl՜œŸ¦*Ç©;"¨R_Ô¯ZãªKá°8 rïR‘VÊ,_fšøµ­ R|:[‰0ÍÌK“ê{Wºßiö¬6–K,r#3ƒ#Ô
+'cÅ:}_.­wáHÐFbfRy†ùéô¦ïxößüMXFn­DŽHåósglÕ:閔¸h€œ5h0Ê=”ÒÿÃZV<öRüƏÁƋ2ý—!#®§ãâûyS'Nœ|—šƒÒˆ^¤×’°Ü+¡·ÿ/0÷ç5ç„4ay\]áFq䟐Å]ÿÄÚqygp›~ôUâñ†ÇÍ©ÛÍ^ŒKõ²{™+évŽ·Û\Å"œ¨š@~[c­n ѯ4fÕõKû›f¯*•&FyG¥M½â5x‚ëQšÛŎ%嵄)n€·êqï^ia{1ÔõéYðÜÑYFžAîݱþßΙ‹Mõ'Ä’òê&ªïɛÞJlY4ë¤V“s#È=êÜì,á?w ó·ñ?z³ñ>¨·úýæ¡„’gۂ:(æùC¡±Ž8@¤§=O­;&G4’T—HDU;nÛ~ϐÜàUã†ãUÑâV2’1Œž´•pAÅlŸg1iÓðÚ*6$f$õ¬î7ÀÕ6¹
+Œæ¬œUÃóÞO
+épÛÀ
+SN™óºFAè*TkžÆµøø3VŽBò-¬Ëü/
+š”xEÎï¤ÙŸp¸¥=<½Ç}ö>Æ8jZ­kOÁèvý‘o¿¡ÅDŸ„€òiÉ=cBôÒ-kaìcڝ²5Ì
+G*ÈpJÔ¹¬b‚ÜJdäx×øüUjâž¿·²ñ ·ËÄÜþ]ö¨1ÍÅڜrü–6øû¬Ÿ¾nàOSOÇÅ$ٟ&\r¹$Wˆ¯n-aÓÕÒ(ËäLF=ºÕ‚ß…l­e·™î’úWEsŒ&IÆ1ߥhrp~›«j §On‰Ûìz`öüè<Ü­p=újú|)«éðåŒGwŒzò÷Ǩ¦¿„ì®iÜ5ªêº¢ÝëΩknÄCn€(`ðŽƒõ«^³­Ûh¶©=—çnUEëV
+Œ‘Ïe¡c+²¯AR7õüè^ƒasi«ê: æ2ZÈy=×±ü±V#¤ßç ¥s2éæ¤é¡ž­?#\ßñ©Ÿ²¯ó†b~UÇI¿ÿð¯šKÁ“þ,g­þH©h–ZšèR_ݑzŠ o}s Ý-¥û…ŽNƯ?²ï±‘o'åPµŸRµh.-]•†Ç—qïL„rÇá”[@Êxß*JÆãd–0ñ°e;ŒR‚ŒîµRŽ]Kƒ¯–ÓUŠCa#b)ØmòÍ\ᵞêž™âq•uèE+&šq
+´sE®XÁ Ž„UYº·—4ßPåW+Øç¥+‰¸½ÃÍe§>r0;ŸP?½á=&ïUՒ[[Ie0°f•G•~f´éô²ŠsŸ
+äAõ躊A̬¬=AÚ¨>b=~tfÊçT’¶¶¶‚ÀPd‚OzDþÏuðrβ?ÕÁs¾û=Ôo¯’Öâî8m
+{Rq¢)O·˜ Ÿ
+¶¸Ž{Õ{ëí:wê‘ÆÍËÿh;þã½u!
+à†oâ1ýiÙ­a¸@“B’ 9
+²)»3*Ý$6Ë!—ñ’™È¨Ý ‚³é¿W1f.y²J•-,ï–RÁ$MöæÏëX~‘¯ë:|à|eÜcܚ¾éšÝÞ£%ƯrÀõC!ÕE©2¥Äòÿ‡Æ·¯Ouñ ­ªgÔë[gg7,daŽn^”JÂÞh˜FˆnbI$“ó¢;±1E_%nuÁÏGkF'â]Ãv;
+âÉ s•;v­
+%¶Í¦´E
+˵S™.-¤šÖlóFä0Ïz¨É1i“$Õ%ÁÀÆÝ©ŸÚ¯Ž›Ói‚£;mCçÊÈAڌ#Fû;ã íâüÛ¤R$Á s€FzcçV«Þ0Õ5MA.þ#áŒiáªBž^¹Îç­gÜ5nŸ³R^_3“ëVx”(Xòei´˜ð¦­–H¸XxÀý±"‘¹ÌYþ´êñ®£”ë+ÊFùˆÐ(ð=…a½
+Ë"Þ†Wˆuc¿í˜=boí^?ë+øu;i3Ð#ùŠ ȸ«É”HSƒëV²È†!9x“ZÇúÖ®1¸ÎsóȨCˆ5Xy ^ºÆ…U @PNýª+3šr£Ÿ˜ßßj/Qµ@zQNËV…®ÞÝj2MssÌÐBy]€dà
+³Ç®jꪦKU8ï ªFƒl#±¹ºˆ1’BªIߦM]CàÙnîA‡.å€Á¦+¡2«àĶÒYuûKØ´ëèüÌð?*¹ù樺ßküWoíà0GŸÂ¡KŸ|u¢:Ϋ}Çڗ‡FßI·;…Û˜úŸsA à=Fñ¦ž;¸bDr±£äò¢Ýó"9m>,‘Ý©ƒ0ñ‹•ìÔìÅ̾Ïᜧ¯ÊžÅ(û¦þ7ÀBvR›(ç¡«Ç
+À7 4×(ˆÍ™ =mY%Ž;³Ò~‘RÓ®±òTí4˛»ÅQÊç,ê¹zÖÙ¡qM—éi¶:S$Q3<Ò7v'¹ªéÚ¯ Jg°Í͙üHw QHx²ÒæÅäBDê0b=A¤ÏS7ñcV‰÷h%þ£¢ð>Ñ­z=§.ûª¥Çšuä"$‹ÌÌÁ¬êÉeiD­Ì\’j¶š¸Ñõ“@dHäæ\6)ØsK"º1TѺñŸ[ž
+wuà áz
+™­¤2¬° ƱÔãµÒ&’1þeÎ?ïB ²¾½gh!’R˜¨Î3Z£–|jQý¥ŠYdípÿÒ»ñšÇí…ÍÓÊefäåˆgõÅEž~øI=.îqä™Û$žÙÉ©üW
+ÁêüCz¥%êF/ɋRÞä‹x
+ö¸Wf»HÊ%ùy `0j¤ºÅ¶‹¬êÓ»Ä{`OEUÆ~E³Š°jS?Àݤ@‡6ôV{ªjï7
+ËiªOLd™@,~Ò­AÉðVŒFêG!šA‘’r{æœà†ÄÆPáAR¹=:U–çTà»$Ê+߲졆Gå^é\Yk=äP[éÑÃŒBá@ÇåS&ž;^ù¤jš’¤†7ûÐ]NÖ[ù£Îñò'†Œmô£÷ˆŠÊÙ°È ”½ë‰š3Óeq³§Ç,m¢%±kxV!4¤¯ïsšx_\¯K¹‡§œ×¦,÷ÅGxŽ}i¬®ìj„j¨“ûVý’úqÿžŸ‡ZÔò]ï¥ðÐo“úP¶„¶ÆûR'ÎÐDr¨w#¹®–6Þl­ìîü#®•bƾ)~ËË é:ðÕ%x¤ä<í€O/¦k¿Ä÷ú}ÜÿèŸ9dæ'êØúO4‡üÄìñé@¯n¹-‰gä/ùš7,Ù彺¿ØSôp-‰_ý–½W[½Ö­í4›gê˜2ŒŸÞ­2ýŽÇsc Ô„QF¼ÅÄYgs×;ô¡ŸgZjF°\Í[«‡óHÿÃØA[:` ÔÃRm.kù0I¯s£ýè–67_±½–Y9’a”1®: uö+£až-Bõe·ô­@ŒŒð㧭j lùóŽþÎ,x{‡ú+ë‰e2¬hŒªNsú
+Ï´ûI^Ĉ0Ä`ŠÚ~ÙîÕt]6Ôõ.Bzà(Çõ¬ß„4CSÓÍÔv’Énf<ΤlS½'3’ÃÙ£†ï¢ß›$ÚÛ"sJЅ@;œUo@û2Õu‹É’èIcdƒ+'6_=ïZ]•º½Õ².Åè*ébž
+99”È„# 75i—†/.uIgŠ,Dd-ÌÛ¦¢ÞØEo)ŽV\ù©(dâפ0É·(ä“Òª<E¦ÈÚ¼Ó[ˤ§›
+Zyíp=š«Óm\y|S©p[d樒'“z ûFp?H’öå‡ã
+ùùwÁϽLÖ¯àá™`´²³‚ghùå’tæf=«>§$%’¶Ýš´øäÕîª7}rßÇ°¿³HÌ*Av˜t9þµ†ê1®¯<– NÞTôï[j—Ð¥¥¬œ²]B6ïÓsÓ½b‘_YÛkФwy`~c)>Vlô£Þº:zŠÛ/"¡Ð Pá{ý25’îŠ8í ä
+J«ï_AßYÛñˆË"m"nU5‡ëZ-ދu$SFJƒ³±ÍrnN- ÓåÝ&¥Ã?ÿÓÆä<Ç ¢:6£6™wÑ6dVÇ®ý(bŒ·]©Ø[
+݁Í&KŠ5ÁÔ¬ú.)|H•Çïi|Ì*&›(ŸN¶˜ sĬ?*›ŸAù×+ɽÎ}ëÃ!¯½©ªÁ9œÿìÒK5sl¶þµ=??‘ù:“Š%¢Í˨ſ|PpëÍæÏ/|u©tá/¢=@qµ+'ƒ1j—)š‚œ¨¯ ¤ÄsùW§è”…|­%¼èÌF3Íêv¬Bî-Q涹Ҧãuý+q¹ðùÇ6K /­|éÄÐjö×Ww0Þ²•‘ƒÄ‡eÞ´iûv‚‰Pû<ÎfÒ.DÉ×Â}˜PËM#QµÔmµ‘ydüëÍ6÷ˆ®®A¶¹…;±8çVÛ® {[ÿhËݍÁ£x1fæš_±£qæ!MD+]ø*üÉ
+ʎøÞ ˜Ofaô®¶ÒÚúÔ]Ú]´Üþb#“8?*,Pä5ÄàûšækôøÞMóm/¥£~ ËnØЩóþ§Oja„À#ޙap2Eئ£¹“ÄÈ7'ŠÁ÷8Í7‚[ŸµSêíüj‰>#EÊÀèŸ:{K‡Äc$£Gær{šd#Þ^$no¯sQ¸ŸWK Q§Z·›vÍm͏dc¥^9—×ÿ 8ç¹ËPüð¾Ÿú ×5a©4™ÊFycAëS´{Õ»º³øæ]Ä$/Ï/KӀQqp2íºAýêÏ¢Ã;Ï ·Ô’ȁø¤~\ûR2gçӀQÁqy&hkH×0*0‰Éì´»Uu·@íÌØݽk)±hÄÑ,ÍÏ#™“~oqZà¢ðAòùr0qJû?¹#™à•Qî^E1øxÉ;æž'¨“ x’øc›®q«¨Cû@…/ìn.`2K4›ç|À_á(á‡LÅÍÝÅ´‚ByUûô¢ZýíÔ0Α0’Gºg@NØæ8•CÒuYµÉ5ƒ«¦Å‚œgçZ5!(+tÿÏcN> i7†+øž4ñeÏZ¾K­ÙÚ@¦Y63Ê75•é‚âêö;xZ(¶çsÒ¯¶gÞI%܇¯1Â~C­`Ó`†4îwôþâê+±¹x¦âúF‹Lµyª¯1Ð}MC¹¶Öî@ø ªJ̒sòãÂ6«|PÇoŽ(Ò4@Ôo¼&UÄ,NkVô¿
+)ËØÀn¸ZÔçð£Y´˜o(Œâ½Ô4»WÕ£ŽîyB Fçõîœu%¼ñîš!e‚(ܜíšnye–îKυŽéÎr² ŠÓ—á†é&ìr[“°Þ§h°25…±2ôæš@ÄÿÞ®z¦¶A’ºæ;stª•ýÔð!»±†Ñ71¢FùÕ¿‡í¬/m\\#6Å\ŒW2RÀòӋOêgInèºG«Å"‚’#|˜Sß´AZªKö,såÄgАÔËp󪒺œ˜ÇxÿïOۍÿWì2ž>–k
+„ÃŁYáR:{Ÿzé8KL“>’3þÉ®°Õeäf—¨Í)µû‘ÒI¹9N<ïʰëqêc•Éõâ‡ãx¶Ó"IÁÑàøW÷
+J˜•_Ãn`¥{£hv‰´ßF½i‚ιyyW!O >• NÔbÔ­VX[|y—;­H$ŽûW)¦3«wÉÿÔ´ÉíI'ޚgÅ ¿¡®)Ù¡â}é²Ûõ¤x‡¹¤–õ« ²sM[NRíwÁ )X¡WLVá¶Η5m5œE3k´”5ºõñqë_)j¼[¯ZjMŽ­y
+¾Õ-ɓáÊÉÍNb0=)‹Ûè¼ö”#•'Ž9²O3ùS*nc˜Å ¡$ð°üTb:-+Ϩ_À…v-±õ4ô\G¤Çx’[˜ñ•šmóJè5QŠ|?Ðrº!‹¹áŽ/ˆx唏0ä#Ûõ«=Ô°s@±*“Ó˜ŠĚݦ´±\éö+n
+#žfqéKÓµ•Ó4âV ûs.[Ö7<³m§k搫eÅ&¾UóDÄú¤ ÿ1J:„€aüeÜ´a‡èk=Ô8ŸP¹2Ü­¼øqlO×­C¶¼†UûÝRE~s½-MùH½è±ñƒ&¬–Ü—6ßr<­‚síTõ·QäŒÇ\l*t‚Ôg’DorkÛiìíùŒ’ÆíÖ¤¥ÿ²R¤†|6ååTGʒ-¹wæ9ë·jz]COÈòÊ})¶½•‡Üiä)ï+Ò>|¬¶òä9VN…Û:ñÊÀ¼òyW=OzñžúDÈHcöQ“HŽ(ÃܳË'ôù
+º}
+2®HVüDùW‘ðx–IbµÕ-Äq6”aˆ÷åV¾ӀT“,)øhÙO§kRÍmxW> èGZV—$³Iß ÀØcµÉJŽßÁ²¸xُ0ósµ•Ù1åêY­WĊXÏï)ªÜǒ`OÈÖÉ·(¤À‹ø„–É«—ÙÖ¿&•Ä jÛÛ]G\ã±Laæ¥Ç+Û̲ÆÅ]H*GjF-¥.‚ÉÌZ7ÍkJµÖmQnáY¹”‘ë-Ö틨xeµùðûV‹ÂšâkZLnä ”rȾ‡Ö‘Ä:%¾£$é”'·Q]©é±¼uô<þ<¹0æ©¿©žÙÞ]ØÈ%´¸`¾Æ­z1tŠò0A82/Q󪖩¢Ýpìᔴö/ø_‡ØÓ0Ý[J 8õ5Ô!‘rzÎxßÈ×d™ÆÁ•·w® t"¨z^¯q¤N±ÜÖ­×òûŠ¹Û^Ew– VD;äV ˜ž6nǒ3V‡ÊàmI!éJÎی|«ÒqJ±‡ÿÕ!y}…”·3d$jXÕf-ràÄ·7¯1RØÇLôg‰6ƒqۡϦõžÏ}<~Hî9¶Üâ¹úl{“fÍe¶¢G»„I3H¡üÇ$7\÷4âÚin‘;3l>tQ畆ZCN•ŽNsšÜ•”HÞÀ˜‰鎕i/}Ë
+œÊH5(ž;Ø_•¹yÆN(â­ÐK†h×6’êWp/<º£úúUw‹ôùì8†X¥ˆ£ÊrãÖ¥hÜKû;RÀYQ›(­ÐZo‰.ï5{ÿÚs™™°y»ì;b´jò)\b1ʚ,VÈ-ía‰q@ý)aYŸËó'ґ3¤~È*GLQ[{ 6ºœò»Žc¼‡ûWK¤Y˗ˆ/ß䎖£Q²±ãüOöù±a³‡Ç”mœ¢¬}M¸¸’âV’C–oҘøÙõ[“y!+â$öõ¯H$Š½f¡å•t—bi°¬q¿,ðç¦+Îõî=Èù×`ô5ˆÓg›àãjàØë^àçqŠK°U';Þ¢\—|y‰ÓÞXßuŒç¦Q!âŽ!¶ÚfýtU¸l֍þڎ>H74ŠGOZ¯x*0R2Íî6ÕÉcGžåI°¤wÅñŸ/ê
+V[ø‚¶eÜ7­¦©³®m¥K–Œ3xJ@óÉ©/cÉsxŒ¯ÊrõÍH¸Qw*D¥“ –^€ãzöVkYUç!9y‰éUNÈ¥ðÐV ë&ºð¹bÒô©33ió«#ã ÿ>•ÂßƉS÷Ÿv'Ó½5º¶ÜKmc
+Ú&ÿÖÅߑfë—û¿/ìg÷ºV¡§ŽK…3[®ÂTÀ÷֕qsnï-›·"œ`ô?JÑLa†0ïU­_‡åÍ8ÞH{7ʹxõ ü9´ð¸üP&i\B—.ÀŠcÐö4{”‘Ò³›k˜o/–+¸ž>S÷˜ØŠ½ZHi6T/ç¨¥çÄ¢î#pNR_cZô%´;°21k&‘·­oXºK}&᧐¡QŽ¤šÈ7;…8Í–ùQÚ:G
+ó4ؘçÊ R¥F)ŒW‘[ÈäS[Q—ƒÿÖʓĕ°752xš;R[Ò§YéÍ ‚ ¦5µ1ˆd±ì*%ÀnVéèÉ
+V=.u8ÞÜ/ݍÚF蔝#…å’ˆÔ³olNBŸÆß!Ú¯v66¶6ÜݧÃX)û›uÙæ=¿ú֌z}‹ÔËÂöòÁy}G³/ߧXC§iBi™–Ê=c晽µU8†MK\¿‰*Úçý5o ÷©ºÞ«&´&i~émÛÃ[uýŨ$­)’ <_„÷ Ò3ä¸ÊSUK„hªJw}¿p‚#@£e
+s>JÆÃ6¦¢’Á›4þ«…*úœÔâ²åƒÇ7ajQR÷+Jòä}º·¥OÒ·Ÿ¦07¨Hw¢šd`}ºâ‘’{bÍ!yU_=éa‡Ö˜õޔ»à•Ì£­diÑ ”¸Þê=)Èe’Ìó÷-ÔÕ'•]J¶àúÔ)€$¯îûÖÌ2YW§#ŸŸÅ/RÈçŠÃyJ«ùPkyÉÑÍ ôaØѤïŠÉ©ÓOöÉQ¯¢9¡º,bX̐΄ò–Ã
+ÅÞÄWä¡«§4g•ì%ùdš2ÐÞQ½k«£yÓ쓧û3Ÿª^ŽmñW»þŠ,Å|U vå³H÷
+¶*Š.·âÛEIî
+qwP3R‰cüì;Ÿ¦õï8u ãcš‹âûb”%®*œK²—­Ùü-Å¸ü1M̟ñj¥Nœ“0µ¢ñ8WK¡°Ì þµŸ\ïÊÝÈÁ®ü›–,R~QÉq©Í/q‘Ö§éW>؍ζϥÿ­q=éRŠ’ÚÀ’²É«Æò<}“C£ÂÁA8'§ Ôäx£ ydŒŽW¤ß]©yX4¬rÄ.HñÀ*.ˆËjf»þô¥[t©”Msm)X.ã¾õZÓfðžK†ÃH£=êãÁöMÄ²/<“8fcü¨µ,-ß,т-˂¿kzö‘LˆTøÉÊsÔP»ÉYˆWbázdæ¥øK“æ3,!”î;Ô·Ó^A¬AíR,­å»¸ŠÖæ’V
+£ÜÓ^'¥^¸F Ϫʽrú·ô¥dšŒln(9H¼iV1é:\QËà°îÝÏçR¹Æ:ãçLxŒÄWx¾£5Ì»vÍôN‚\šíB[h-æâUŽ$,ÛT%u'ބñ-”º¼0Àùød˜Õ»ôŸfëVH¬Y+¯™ç¾Ñû=©ú¸×²fŸ©Ã~î"GU†aŽj&véïUý+Lx4ôÎÎé±æ¢ {,'ÄÃÞ³jôP͖ONÕù‹á›ôùå‹YS¯~Éiö“;¼–±—pp7¡²@úlKµcåcÖ3ïEQ€ãqõ¯&¸¶š&Ê•a‚+Üõpu±šV§jHi±yg$lb„c¯n¢²ØÊ[Þ¼s‚#æ ãµ_,ükIth•¼‡>lP{­NžòIZíÇ1æ*1Ö¶`û;Q^Ú_36}^ .ýÓ΂Êí&˜òF €Üçsêiû9´ÚVäXp]|ŠrÓIÓ X改ð(¼[UŲZÛÿ¸ŽvÒ¶zpÇþä×åɕG$ßÁùð×4{Fxîl9`ˆîÍ äU™=jµ2éÖ×mðü}ßO®~Y¤MÄQ[yoâB¼¹mð=‡jªjœYpÊb³Q
+!¹»¨5¶hDF z¨:‹4q€rCg>ÛQc·U8ö¨wñ¬Ön¸ ã"‹ªi°r&àÒ)ò8VéØi£B0Sò$S“/)N¹#½$+œl+¶Ž#QHÀs:ýsH{8”;Ÿ¥HÎ)ò¨JD)F9W¡ëRnnD°[Aû´ýM3sû¦ž’×ð‚P7­ZÊâ«Ü(ÆÓ¡É#;RZ$mS, [¦ÈþFŸ¾µž(ºž\àÕ@¶‹™2“‘VYg ΀Ô(ð¾zö(U¦¶ÔT¢¬°ÝZGuÀzÕbúÜÙÛ¼@`g¯­„–A¡s!ýïJ•É§bžÍQ7.9ER%òՃEò쾒P%´6n— wõ©ú{F òØ«f…Ödþ¢5ã£Î)„Á«²‘¹Ph'CÒ¬ücÛ+Ì?é¯ò¡PiÂð}ێ`:Rõ«ýy0´Î± zœ/¥œ‰¸¡óÙMløt?:›¥ç2cÚ¹ù×ÀÍúgñ ¯AzõGÿJH"–µ€é¢ƒó®šÎ+ˆùd\žÇÒ¹sµ> qT›NÐ-&©Œ¤ŠŠK¨õÜÔè$Y]é¾]³ÜW¦<žt8nâ»ÚicÖiœ5˜ùöG#4g¦Î¥…q/À6ØÔÏÃê þœ*TL\`þ!Ú£ê1f"þ$9¬Ø´óÓfٓ˜O‹ñÉ¢y£Ÿè~(ó^Aë"Îâ[ ôñ­yÈónTT{îIPÝ鉡aŸ;•FÖâñ.Œ‹ÒE >}ê>Ÿ7‰Œ¤ÃÚ´ãÌ«ÒÌ®¿S\?üN¯ô$éêÑ^øn9[zÔk¥d½Ž™«Õ­5PŒöÁ/«(؊¨é÷
+âIÔ-"‡n¦_ äF mÊéNr¯®(v™p.,c`FÃg¥MæõȒiÑ֋M!ѹ5Æ2;þtŽsŠô¹ÇZ®KÊàõëI,ê:f¼,{RB½j"…ðˊï¦)ƒ04Ԓ*¡sÐzQ%n‘MÒ°fº{kãä¬`~[š¢1Y '¸­ÌL~|óg¾k>¿·6:Œð€­°öí]ŒÍEÇ
+bZŒÉR“ýY¥âƒðUµ„øN%Óä Ë
+-ñL:û
+‚e6äañéšm_”c$T‹õe¸`F'T21Ö»v‘Äš¦Åsýk̳vŽ`+¹±ÞŒ¹AlvÅ›m?œáEÈ/ç©ÞˆÌ¦HXÛéIÈùC±.<1P
+&µâÿO'0~?°Z2ÉñÉ/?Ü«j°ºO4lqò .ˆÇ¡ÞZ-ÜD•eõQ{XnùO‡(>e>µ×ϦŽF²c}þÿús!žI8Muû éˆ<½”W¶úÕÅ´Ì爟ÂjJZJ–†P¼Œ !}(PÑõ&m­eÏʳâYbîI¼mT‚Åm/³%´†Þnભ}o',²ÉÊzÙ“…«‚‡“Ýœ
+B¶¼·[XŠ5)."Âê~µÀÍ¢ÔîmÁ¼ZœRRC˜ÆvÜW¿:ô2‘šá¿JÃ(Ê<IQ©4Õ¡´ÄŒ½He?:‹0^²2ªüèñbɕÔ"ØÉ jæèeåÜw'ÐS3°7›Ó5ą̃>åIÿ{T rĒI&º0†=ǑÜü/o©–[µ? UCË÷ú’q²ŒmUn)„¸®ãp~bŠt9)RÇì^ëÌæ+$r=ûߑÓÇðíE8l+ÚzêÜÛÜÉ
+Ô×',÷ͳ¥Š`Ã~^´’ܽWùÔÛaJÜÃ8ÆÇoF‘²Ä*DÈ­ÐTC¶~´È¡|¹ÁŽi@0;¦~T®ý0i{†’êÒ¦CỖÛ&˜
+«ÏOPGҒ„¸.NÉfúÒ¼Ëڕ¯Ì§íép¿!ú\N–îß/ó$D±†¦¤$®q҇ÂÙ#Eq€‘õ¬›¸Ñë(=W'Ö«º­‰†ëâR2ÐÈydQëëV#Í·+ûÓOϏ2äCE+Ç-ÑxÖHíexP]ŽV#ƒâ(Þ­–k –¨%vS¤]ÔüÇjsn«©ÊUdWP1Ё‘KЮ9íd…Û7ÀÒº’ÕÊ´“^Sù˜¡§Mím§î‚—6RÆ^IbìñœŠ‚áK`ä
+˜AMÑÈ>ÔÛ;:‡÷£ð¿N_>¿Q»µ8{[׈ÿÑ¥j¶˜J‡_^õV˜Ø«Œw­DŒämòaŠ¬ê:,òNِÝ;b“KŸWuÊ6e͋'1|û>
+·>”¡gtÝ “ÿM'$““vbé*±Oî5n75j)¾Ûæ€izuɼS,r"œ‘V1ÁÞ¹Ú©§%LèibÔ]¡°Ó‘Ik(¤`Ü¥Õv©oŸÒ– lJʦӴÍ.)®A“Z\(,„;‡¡¦RþXÏ,ñtêH£ ¸;§Ö¼uŽA‰"Í9j/ñ«ðíüˆÐÜÅ8z‚qRTbÊ0Ô"óN+r¢ß*g”—w–#–D,¾§q]JxtïTçOŸcÿS2›ê>ÞᕝÉÅ+žE C¬ÂØ ¥O~ôçíKg5͔&»FèÎ/¦Mñ[fˆPmbÒÝçK¥`¤îëëRÛSFÄïL[AûFþ6|ü8l»cñO•t´yæ±¼3\>¯Ã9ú¼psY#Úü÷³$ä£ý‡¥'ö¥ßk†*)źkZ߉Q>îEÐÕ}csÑü…5Ï.&âÝ
+°á`~Uâ<œã®=)›ì_¦‰­¤éNrl¢Ï| TèRuå†Ý#øEG€ä¹51S#®õ¯²(¥àP’OlW‡9Éc^•eßWs¯ր ø9õ¦%Ÿ•uu!‚»"´d’Aß=é%ùk«©mò9€°{W°5ÕÔ,!Jƒ'r>Tús!É9ÕÔq’£ucŒMß« 9J·î}Åuut42qÔA¯tdÔÅ<ROØoH›â4õ,7O.}jj¡_2±ÕÕÔZø¨êf£Õ°tí¼QoÙ™ÃMÆVêØÂdþCþõelc#Öºº•›¨ýÇçê2ð‡98¨òCÊ|¬Fk«©9æ ®C`ïP¦`buÄ&}«««£ö_û÷ìŸðgÖÿ´—»_ÉÁa½$?(&ºº¹»6&C⧣y@ÅuuB™Ç•‡}é¦Ïb@ÕÕe\øšœ$ö?êú¥ºÅì| Œçõ®®­Óé¯ÿ”e‡iüØl¢‘Ó*AŒŽ¿½uuaF¡‰Tàó`Ôm†pY~Fºº´âÔeĿӓBç‹OƬK<€m&Þê)‡–lJ@ö®®­_ü–ª¿÷<ñGÿÒ¦Î|ä±÷9¤´ Åuuqç›$ÝÎMÈã„8Š¡¶GM¦š"»ç5ÕÕI²èO(î)BqJêꍑð ژüIy×*Ê|§Óßç]]OÁåˆÏÒD¡Ç$œœ’{ŸSNÇ´n=q]]Z~ËmêâßÏø®IiÚ_/äsÂÄÓ謣ÊÇÛzêêåÍòÍñé+8ÎN~têLqœ
+÷5ÕÔI°OÿÙ
\ No newline at end of file
/Designs/ROBOTS/3Orbis/PrjInfo.txt
0,0 → 1,19
//
// Toto je popisný soubor pro popis obsahu adresáře (příklad)
//
 
[InfoShortDescription.en]
Robot 3Orbis
 
[InfoShortDescription.cs]
Robot 3Orbis
[InfoLongDescription.en]
The robot 3Orbos is based on experience with construction of the
older robots. There was added actively steering front wheel.
 
[InfoLongDescription.cs]
Čárový robot 3Orbis v vznikl po zkušenostech s předchozími roboty.
Byl doplněn zejména aktivním natáčecím řídícím kolem.
 
[End]
/Designs/ROBOTS/3Orbis/DOC/HTML/3Orbis.cs.html
0,0 → 1,321
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 3Orbis </title>
<meta name="keywords" content="robot 3orbis čára">
<meta name="description" content="Projekt MLAB, Robot na čáru 3Orbis">
<!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE -->
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl">
<link rel="StyleSheet" href="../../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
<link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico">
<script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script>
<!-- AUTOINCLUDE END -->
<style type="text/css">
img.Pic1 {position:absolute;margin-left:230px;margin-top:10px; }
img.Pic2 {position:absolute;margin-left:322px;margin-top:160px; }
img.Pic3 {position:absolute;margin-left:6px;margin-top:160px; }
img.Pic4 {position:absolute;margin-left:200px;margin-top:200px; }
img.Pic7 {position:absolute;margin-left:415px;margin-top:185px; }
img.Pic8 {position:absolute;margin-left:70px;margin-top:160px; }
img.Pic11 {position:absolute;margin-left:10px;margin-top:125px; }
img.Pic12 {position:absolute;margin-left:128px;margin-top:5px; }
</style>
</head>
 
<body lang="cs">
 
<!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE -->
<!-- ============== HLAVICKA ============== -->
<div class="Header">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawHeader();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE -->
<!-- ============== MENU ============== -->
<div class="Menu">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawMenu();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- ============== TEXT ============== -->
<div class="Text">
<p class="Title">
Robot 3Orbis
</p>
<p class=Autor>
Jakub Kákona
</p>
<p class="Subtitle">
Čárový robot 3Orbis v vznikl po zkušenostech s předchozími roboty,
u kterých byl problém s dynamickými vlastnostmi podvozku. Předchozí
roboty (<i>Callis</i>, <i>Merkur</i>) měli dva stejnosměrné motory
na kterých se reguloval výkon a tím robot zatáčel. Nová konstrukce
se liší tím, že má aktivní zatáčecí kolo.
</p>
<p class="Subtitle">
<img class="Pic0" width="605" height="454" src="Pictures/image005.jpg"
alt="Obrázek robota">
</p>
<p>
<a href="../3Orbis.cs.pdf"><img class="NoBorder"
src="../../../../../Web/PIC/FileIco_PDF.ico"
alt="Acrobat">&nbsp;PDF verze</a>
</p>
 
<h1> Robot 3Orbis </h1>
 
<p>
3Orbis v vznikl po zkušenostech s předchozími roboty, u kterých byl
problém s dynamickými vlastnostmi podvozku. To bylo způsobeno tím, že
minulé verze našich robotů měli ve směs dva stejnosměrné motory
(Callis, Merkur) na kterých se reguloval výkon a tím robot zatáčel.
Hlavní nevýhody tohoto systému byly:
</p>
 
<ul>
<li>
<i>Setrvačnost pohonů</i><br>
V prudké zatáčce bylo potřeba jedno z kol výrazně zpomalit, případně
zastavit. To není zcela bez potíží, protože použité pohony neměly
žádnou zpětnou vazbu, ze které by se dal získat nějaký údaj o
rychlosti. Takže jediným způsobem jak kolo dostatečně rychle zpomalit
bylo reverzovat motor na nějakou určitou dobu. Problém je v tom, že
tato doba se mění podle rychlosti robota.
</li>
<li>
<i>Nestabilita podvozku</i><br>
Robot musel v důsledku toho, že měl pouze dvě kola připojená na
motory mít ještě nějaké třecí elementy, které zaručovaly definovanou
vzdálenost senzorů od tratě. Robot měl určitou vůli v náklonu proti
podložce, takže nebylo možné na snímání čáry použít čidla s přesnou
optikou.
</li>
<li>
<i>Špatné využití výkonu pohonů</i><br>
Robot na rovné čáře nejel tak rovně jak by bylo třeba, ale čáru
křižoval. Dělo se to tím, že pohony měly nenulovou setrvačnost, takže
na změnu polohy čáry se nedalo dostatečně rychle reagovat. Navíc toto
křižování čáry mělo za následek to, že motory zdaleka nebyly využity
na maximum, protože jeden z nich byl vždy zpomalen.
</li>
</ul>
 
<p>
Proto jsme se na letošní ročník soutěže ISTROBOT 2006 [3] rozhodli
postavit revolučního robota s úplně odlišnou konstrukcí. To se ale
později ukázalo, jako ne zrovna šťastný nápad, protože odladit nový
řídící systém zabralo mnohem víc času, než jsme čekali.
</p>
 
<p>
Rozhodli jsme se pro konstrukci tříkolého podvozku kde přední kolečko
je zatáčecí (zkoušeli jsme i opačnou variantu se zatáčecím zadním
kolečkem, ale ta měla horší výsledky, v zatáčkách měla příliš pomalou
odezvu).
</p>
 
<p>
Obrázek robota s popiskami<br>
<!-- Vektorová grafika -->
<img class="Pic1" width="331" height="123" src="Pictures/image001.gif"
alt="Čárový popisek 2: Procesor a IR modul">
<img class="Pic2" width="243" height="101" src="Pictures/image002.gif"
alt="Čárový popisek 2: Posuvný Registr +8LED">
<img class="Pic3" width="131" height="121" src="Pictures/image003.gif"
alt="Čárový popisek 2: H-Můstek">
<img class="Pic4" width="323" height="234" src="Pictures/image004.gif"
alt="Čárový popisek 2: Procesor a IR přijímač">
<!-- Podkladový obrázek -->
<img width="605" height="454" src="Pictures/image005.jpg"
alt="Obrázek robota">
</p>
 
<h1> Konstrukce </h1>
 
<p>
Robot 3Orbis má tedy tři kola, kde přední zatáčecí kolečko je ovládáno
modelářským servem HS-81 které je zrychleno externím převodem 2,5:1
zadní kola jsou poháněna dvěma stejnosměrnými motory GRAUPNER Speed 300
které jsou připojeny na kola o d=35mm přes převodovku 1:5. Všechny tyto
komponenty jsou přišroubovány na duralový plech T=2,5mm. Čidla na čáru
jsou navlečena na závitové tyči M3, která je na podvozek připevněna
konstrukcí z Al profilů. Na základní duralové desce jsou ještě tři
závitové tyčky, které slouží jako nosné sloupky pro kryt z hadr disku
Seagate ST125 :) na kterém je připevněna v podstatě veškerá
elektronika.
</p>
 
<p>
Tato mechanická konstrukce sice vyřešila většinu výše uvedených
problémů, ale na druhou stranu je mnohem obtížnější její řízení, je nutné
přesně vyladit softwarový diferenciál na zadních kolech (Při použití
vhodnějších motorů by se tento problém pravděpodobně dal vyřešit
zapojením do série.) Také není snadné správně nastavit úhly předního
kolečka, na tyto pokusy padlo několik těsnění 1/4“ 2x2mm.
</p>
 
<p>
Obrázek hlavní převodovky<br>
<img width="605" height="454" src="Pictures/image006.jpg"
alt="Hlavní převodovky">
</p>
 
<p>
Převody serva<br>
<!-- Vektorová grafika -->
<img class="Pic7" width="142" height="58" src="Pictures/image007.gif"
alt="Čárový popisek 2: IR LED">
<img class="Pic8" width="234" height="75" src="Pictures/image008.gif"
alt="Čárový popisek 2: Servo HS-81 ">
<!-- Podkladový obrázek -->
<img width="605" height="454" src="Pictures/image009.jpg"
alt="">
</p>
 
<p>
Elektronická řídící jednotka je téměř celá poskládána z modulů
stavebnice MLAB[2]:
</p>
 
<p>
Modul <i>PIC16F84DIL1801A</i> osazený procesorem <i>PIC16F88</i> (Slave)
je použit na zpracování dat z 470nm analogových čidel na snímání čáry +
IR čidla SFH-5110 na detekci překážky. Druhý modul <i>PIC16F84DIL1801A</i>
též osazený procesorem <i>PIC16F88</i> (Master) přebírá data z prvního
procesoru a na jejich základě řídí pohyb robota.
</p>
 
<p>
Motory jsou řízeny modulem <i>HBRIDGE01A</i> který je ovládán
softwarovou PWM z master procesoru. Master procesor je také přímo
připojen k servu HS-81.
</p>
 
<p>
Na sériové lince mezi oběma procesory je paralelně připojen modul
posuvného registru <i>LEDBAR01A</i> který slouží k zobrazení stavů čidel
a k ověření správné funkce sériové linky.
</p>
 
<p>
Napájení elektroniky je zajištěno modulem LEDROBOT01A. Modul
LEDROBOT01A také vizualizuje stav čidel na překážku.
</p>
 
<p>
Modulátor IR signálu pro přijímač SFH-5110 je postaven z obvodu HC4047.
IR vysílač a přijímač je třeba umístit tak, aby se jejich optické osy
protínaly ve vzdálenosti, na kterou má být detekována překážka.[1]
</p>
 
<h2> Zapojení IR modulátoru </h2>
 
<p>
<img width="506" height="292" src="Pictures/image010.gif"
alt="Zapojení IR modulátoru">
</p>
 
<p>
Zapojení elektroniky<br>
<!-- Vektorové popisky -->
<img class="Pic11 " width="110" height="284" src="Pictures/image011.gif"
alt="Čárový popisek 4: Trimry na nastavení regulátoru">
<img class="Pic12" width="127" height="142" src="Pictures/image012.gif"
alt="Čárový popisek 4: Stabilizátor napětí">
<!-- Podkladový obrázek -->
<img width="605" height="454" src="Pictures/image013.jpg"
alt="Zapojení elektroniky">
</p>
 
<h2> Propojení modulů stavebnice </h2>
 
<p>
<img width="769" height="604" src="Pictures/image014.gif"
alt="">
</p>
 
<h2> Princip řízení </h2>
 
<p>
Na řízení robota je použit softwarový proporcionální regulátor se sedmi
diskrétními stavy (tj. odchylce čáry od středního čidla odpovídá
výchylka předního kolečka). Zesílení regulátoru je pevně nastaveno
konstantami pro každý diskrétní stav. Stejně je vyřešen i softwarový
diferenciál na zadních kolech.
</p>
 
<p>
Experimentovali jsme i s použitím PD regulátoru, ale nepodařilo se
dosáhnou lepších výsledků než se samostatným P-regulátorem.
</p>
 
<h2> Problémy konstrukce </h2>
 
<p>
Stabilitu podvozku se podařilo zlepšit pouze částečně. Robot se teď při
velké rychlosti v zatáčkách překlápí, protože je v předu podpírán pouze
v jednom bodě.
</p>
 
<p>
Použitá čidla z inkoustových tiskáren měla nedostatečný osvětlovací
výkon a také příliš malou hloubku ostrosti. Řešením by mohla být výměna
470nm LED diod za diody s vyšší svítivostí a odbroušení fresnelovy
čočky před fototranzistorem.
</p>
 
<h2> Zdroje </h2>
 
<ul>
<li> [1] Novák, Petr : <i>Mobilní Roboty - pohony, senzory, řízení.</i> BEN r.v. 2005 </li>
<li> [2] <a href="http://www.mlab.cz/">www.mlab.cz</a> </li>
<li> [3] <a href="http://www.robotika.sk">www.robotika.sk</a> </li>
</ul>
 
<h2> Poděkování </h2>
 
<p>
Na závěr bych chtěl poděkovat panu Mgr. Milanu Novotnému ze SPŠ Strojní
a Elektrotechnické v Českých Budějovicích za to že, vyrobil podvozek
robota a vyfrézoval bezvadné převodovky. Dále Ing. Stanislavu Nedvědovi
za konzultaci a nastínění možného způsobu řízení. Pak Mgr. Šinknerové
za to, že mne uvolnila z několika desítek minut výuky angličtiny.
</p>
 
</div>
 
<!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE -->
<!-- ============== PATIČKA ============== -->
<div class="Footer">
<script type="text/javascript">
<!--
SetRelativePath("../../../../../");
DrawFooter();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
</body>
</html>
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image001.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image002.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image003.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image004.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image007.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image008.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image011.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image012.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image005.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image006.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image009.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image010.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image013.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/HTML/Pictures/image014.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/3Orbis.cs.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Designs/ROBOTS/3Orbis/DOC/SRC/3Orbis.doc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property