Rev 2 | Blame | Last modification | View Log | Download
CCS PCW C Compiler, Version 3.110, 15448Filename: d:\kaklik\programy\pic_c\robot\tank\main.LSTROM used: 893 (22%)Largest free fragment is 2048RAM used: 82 (43%) at main() level101 (53%) worst caseStack: 3 locations*0000: MOVLW 000001: MOVWF 0A0002: GOTO 2CB0003: NOP.................... #include "D:\@KAKLIK\programy\PIC_C\robot\tank\main.h".................... #include <16F873.h>.................... //////// Standard Header file for the PIC16F873 device ////////////////.................... #device PIC16F873.................... #list........................................ #use delay(clock=4000000)00A8: MOVLW 7300A9: MOVWF 0400AA: MOVF 00,W00AB: BTFSC 03.200AC: GOTO 0BC00AD: MOVLW 0100AE: MOVWF 2100AF: CLRF 2000B0: DECFSZ 20,F00B1: GOTO 0B000B2: DECFSZ 21,F00B3: GOTO 0AF00B4: MOVLW 4A00B5: MOVWF 2000B6: DECFSZ 20,F00B7: GOTO 0B600B8: NOP00B9: NOP00BA: DECFSZ 00,F00BB: GOTO 0AD00BC: RETLW 00.................... #fuses XT,NOWDT,NOLVP................................................................................ //motory.................... #define FR output_high(PIN_B4);output_low(PIN_B5) // Vpred.................... #define FL output_high(PIN_B6);output_low(PIN_B7).................... #define BR output_high(PIN_B5);output_low(PIN_B4) // Vzad.................... #define BL output_high(PIN_B7);output_low(PIN_B6).................... #define STOPR output_low(PIN_B4);output_low(PIN_B5).................... #define STOPL output_low(PIN_B6);output_low(PIN_B7)........................................ //cidla.................... #define RSENSOR 1 // Senzory na caru.................... #define LSENSOR 0.................... //#define BUMPER SENSOR_2 // Senzor na cihlu........................................ //human interface.................... #DEFINE LED PIN_A2........................................ #DEFINE SOUND_HI PIN_B2.................... #DEFINE SOUND_LO PIN_B3.................... #include "sound.c".................... // Knihovna pro generovani hudebnich zvuku dane frekvence a delky nebo.................... // dane noty temperovaneho ladeni a delky..................... //.................... // Pro gnerovani nepouziva zadnou podporu HW, vse se generuje ciste SW..................... //.................... // (c)miho 2003.................... //.................... // Historie.................... // 1.00 Uvodni verze.................... //............................................................ // Konfiguracni parametry.................... //#define SOUND_HI PIN_xx // Pozitivni vystup.................... //#define SOUND_LO PIN_xx // Komplementarni vystup.................... #ifndef SOUND_REZIE.................... #define SOUND_REZIE 72 // Piskvorcova konstanta zahrnuje celkovou rezii ve smycce.................... #endif.................... #ifndef SOUND_CLOCK.................... #define SOUND_CLOCK 4000000 // Frelvence krystalu v Hz.................... #endif............................................................ // Definice hudebnich tonu (not) pro proceduru SoundNote().................... #define SOUND_C 0.................... #define SOUND_Cis 1.................... #define SOUND_D 2.................... #define SOUND_Dis 3.................... #define SOUND_E 4.................... #define SOUND_F 5.................... #define SOUND_Fis 6.................... #define SOUND_G 7.................... #define SOUND_Gis 8.................... #define SOUND_A 9.................... #define SOUND_Ais 10.................... #define SOUND_H 11.................... #define SOUND_Space 12 // Pomlka............................................................ // Prototypy verejnych procedur........................................ void SoundBeep(unsigned int16 Frequency, unsigned int16 Duration);.................... // Predava se frekvence v Hz a doba trvani v ms (0 znamena ticho)........................................ void SoundNote(unsigned int8 Note, Octave, unsigned int16 Duration);.................... // Predava se cislo noty (0 je C), posunuti v oktavach (0 nejnizsi ton,.................... // SOUND_Space je ticho), doba trvani v ms........................................ // Alternativni makra pro generovani konstatnich tonu.................... // SoundBeepMacro(Frequency, Duration) - frekvence nesmi byt 0.................... // SoundNoteMacro(Note, Octave, Duration) - nepodporuje SOUND_Space.................... // SoundSpaceMacro(Duration) - hraje ticho........................................ // Privatni cast............................................................ #ORG 0x100, 0x128 // Aby skok nebyl pres hranici 0x100.................... void DelaySpecial(unsigned int16 Time).................... // Pomocna procedura pro mereni spozdeni s granularitou 1 instrukcni takt.................... // Cas v instrukcnich cyklech, skutecny cas je vetsi o _konstantni_ rezii.................... // Maximalni cas je 65536 us.................... {.................... unsigned int8 TimeHi; // Pro pristup k horni casti Time........................................ *0x0A = LABEL_ADDRESS(Next)>>8; // Nastav PCLATH*0100: MOVLW 010101: MOVWF 230102: MOVLW 0A0103: MOVWF 7E0104: MOVF 23,W0105: MOVWF 0A.................... #asm.................... movf Time,w // Zpracuj nejnizsi 3 bity0106: MOVF 7B,W.................... xorlw 7 // Pro hodnotu 0 skakej pres vsechny nopy0107: XORLW 07.................... andlw 7 // Ber jen spodni 3 bity0108: ANDLW 07.................... addwf 2,f // Preskoc zadny az vsech 8 nopu (2 je PCL)0109: ADDWF 02,F.................... Next:.................... nop // Spozdeni s granularitou 1 takt010A: NOP.................... nop010B: NOP.................... nop010C: NOP.................... nop010D: NOP.................... nop010E: NOP.................... nop010F: NOP.................... nop0110: NOP.................... nop.................... #endasm0111: NOP.................... Time = Time >> 3; // Zahod spodni 3 bity0112: RRF 7C,F0113: RRF 7B,F0114: RRF 7C,F0115: RRF 7B,F0116: RRF 7C,F0117: RRF 7B,F0118: MOVLW 1F0119: ANDWF 7C,F.................... TimeHi=Time>>8; // Oddel horni cast citace011A: MOVF 7C,W011B: MOVWF 7D.................... Time++; // Korekce na casovani typu dcfsz011C: INCF 7B,F011D: BTFSC 03.2011E: INCF 7C,F.................... TimeHi++;011F: INCF 7D,F.................... #asm.................... Loop:.................... nop // Smycka musi trvat 8 taktu0120: NOP.................... nop // a ma 16 bitu dlouhy citac0121: NOP.................... nop0122: NOP.................... decfsz Time0123: DECFSZ 7B,F.................... goto Next10124: GOTO 126.................... decfsz TimeHi0125: DECFSZ 7D,F.................... Next1:.................... goto Loop.................... #endasm0126: GOTO 1200127: RETLW 00........................................ }............................................................ unsigned int32 SoundCount; // Pocet pulperid geneovaneho signalu.................... unsigned int32 SoundPeriod; // Delka pulperiody v us (zmensene o SOUND_REZIE)............................................................ void SoundLoop().................... // Pomocna funkce - hlavni zvukova smycka.................... {.................... int1 Data;.................... unsigned int16 i;........................................ for(i=SoundCount;i>0;i--) // Pocet pulperiod*019F: MOVF 26,W01A0: MOVWF 7801A1: MOVF 25,W01A2: MOVWF 7701A3: MOVF 77,F01A4: BTFSS 03.201A5: GOTO 1A901A6: MOVF 78,F01A7: BTFSC 03.201A8: GOTO 1C9.................... {.................... output_bit(SOUND_HI,Data); // Nastav vystup01A9: BTFSC 76.001AA: GOTO 1AD01AB: BCF 06.201AC: GOTO 1AE01AD: BSF 06.201AE: BSF 03.501AF: BCF 06.2.................... output_bit(SOUND_LO,~Data);01B0: BCF 03.501B1: BTFSS 76.001B2: GOTO 1B501B3: BCF 06.301B4: GOTO 1B601B5: BSF 06.301B6: BSF 03.501B7: BCF 06.3.................... Data=~Data; // Otoc stav vystupu01B8: MOVLW 0101B9: BCF 03.501BA: XORWF 76,F.................... DelaySpecial(SoundPeriod); // Pockej po dobu plperiody01BB: MOVF 2A,W01BC: MOVWF 7A01BD: MOVF 29,W01BE: MOVWF 7901BF: MOVF 2A,W01C0: MOVWF 7C01C1: MOVF 29,W01C2: MOVWF 7B01C3: CALL 100.................... }01C4: MOVF 77,W01C5: BTFSC 03.201C6: DECF 78,F01C7: DECF 77,F01C8: GOTO 1A3.................... }............................................................ void SoundBeep(unsigned int16 Frequency, unsigned int16 Duration).................... // Predava se frekvence v Hz a doba trvani v ms (0 znamena ticho).................... // Rozumne frekvence jsou v rozsahu cca 10Hz az 5000Hz pro krystal 4MHz,.................... // cas do cca 5s (2*Cas/1000*Freq musi byt < nez 65536).................... {.................... if (Frequency==0)*0129: MOVF 72,F012A: BTFSS 03.2012B: GOTO 140012C: MOVF 73,F012D: BTFSS 03.2012E: GOTO 140.................... {.................... for(;Duration>0;Duration--)012F: MOVF 74,F0130: BTFSS 03.20131: GOTO 1350132: MOVF 75,F0133: BTFSC 03.20134: GOTO 13F.................... {.................... DelaySpecial(1000); // Zhruba 1ms0135: MOVLW 030136: MOVWF 7C0137: MOVLW E80138: MOVWF 7B0139: CALL 100.................... }013A: MOVF 74,W013B: BTFSC 03.2013C: DECF 75,F013D: DECF 74,F013E: GOTO 12F.................... return;013F: GOTO 1C9.................... }........................................ SoundPeriod=(SOUND_CLOCK/4/2)/Frequency-SOUND_REZIE;0140: CLRF 790141: MOVLW 070142: MOVWF 780143: MOVLW A10144: MOVWF 770145: MOVLW 200146: MOVWF 760147: CLRF 7D0148: CLRF 7C0149: MOVF 73,W014A: MOVWF 7B014B: MOVF 72,W014C: MOVWF 7A014D: CALL 004014E: MOVF 23,W014F: MOVWF 790150: MOVF 22,W0151: MOVWF 780152: MOVF 21,W0153: MOVWF 770154: MOVF 20,W0155: MOVWF 760156: MOVLW 480157: SUBWF 76,W0158: MOVWF 290159: MOVF 77,W015A: MOVWF 2A015B: MOVLW 00015C: BTFSS 03.0015D: MOVLW 01015E: SUBWF 2A,F015F: MOVF 78,W0160: MOVWF 2B0161: MOVLW 000162: BTFSS 03.00163: MOVLW 010164: SUBWF 2B,F0165: MOVF 79,W0166: MOVWF 2C0167: MOVLW 000168: BTFSS 03.00169: MOVLW 01016A: SUBWF 2C,F........................................ SoundCount=Duration; // Vypocet poctu pulperiod signalu Duration*Frequency*2/1000016B: CLRF 28016C: CLRF 27016D: MOVF 75,W016E: MOVWF 26016F: MOVF 74,W0170: MOVWF 25.................... SoundCount*=Frequency;0171: MOVF 28,W0172: MOVWF 790173: MOVF 27,W0174: MOVWF 780175: MOVF 26,W0176: MOVWF 770177: MOVF 25,W0178: MOVWF 760179: CLRF 7D017A: CLRF 7C017B: MOVF 73,W017C: MOVWF 7B017D: MOVF 72,W017E: MOVWF 7A017F: GOTO 0660180: MOVF 23,W0181: MOVWF 280182: MOVF 22,W0183: MOVWF 270184: MOVF 21,W0185: MOVWF 260186: MOVF 20,W0187: MOVWF 25.................... SoundCount/=500;0188: MOVF 28,W0189: MOVWF 79018A: MOVF 27,W018B: MOVWF 78018C: MOVF 26,W018D: MOVWF 77018E: MOVF 25,W018F: MOVWF 760190: CLRF 7D0191: CLRF 7C0192: MOVLW 010193: MOVWF 7B0194: MOVLW F40195: MOVWF 7A0196: CALL 0040197: MOVF 23,W0198: MOVWF 280199: MOVF 22,W019A: MOVWF 27019B: MOVF 21,W019C: MOVWF 26019D: MOVF 20,W019E: MOVWF 25........................................ SoundLoop(); // Pozor pouzivaji se globalni parametry*01C9: RETLW 00.................... }........................................ // Definice casu pulperody pro nejnizsi oktavu, v mikrosekundach.................... // Periody tonu v dalsich oktavach se ziskavaji rotaci vpravo.................... #define SOUND_Peri_C (30578*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 30578us.................... #define SOUND_Peri_Cis (28862*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 28862us.................... #define SOUND_Peri_D (27242*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 27242us.................... #define SOUND_Peri_Dis (25713*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 25713us.................... #define SOUND_Peri_E (24270*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 24270us.................... #define SOUND_Peri_F (22908*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 22908us.................... #define SOUND_Peri_Fis (21622*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 21622us.................... #define SOUND_Peri_G (20408*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 20408us.................... #define SOUND_Peri_Gis (19263*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 19263us.................... #define SOUND_Peri_A (18182*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 18182us.................... #define SOUND_Peri_Ais (17161*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 17161us.................... #define SOUND_Peri_H (16198*(SOUND_CLOCK/1000)/1000/4/2) // Perioda 16198us........................................ #if SOUND_Peri_C > 65535.................... #error "Sound Clock too high (Note C requires delay > 65535 cycles)".................... #endif........................................ const int16 Table[12] = SOUND_Peri_C, SOUND_Peri_Cis, SOUND_Peri_D, SOUND_Peri_Dis,.................... SOUND_Peri_E, SOUND_Peri_F, SOUND_Peri_Fis, SOUND_Peri_G,.................... SOUND_Peri_Gis, SOUND_Peri_A, SOUND_Peri_Ais, SOUND_Peri_H;........................................ void SoundNote(unsigned int8 Note, Octave, unsigned int16 Duration).................... // Predava se cislo noty (0 je C), posunuti v oktavach (0 nejnizsi ton).................... // doba trvani v ms (0 znamena ticho).................... // Zahraje zadanou notu v zadane oktave dane delky.................... {........................................ if (Note==SOUND_Space).................... {.................... for(;Duration>0;Duration--).................... DelaySpecial(1000); // Zhruba 1ms.................... return;.................... }........................................ SoundPeriod=(Table[Note]>>Octave)-0; // Zde je chyba prekladace, nula musi zusat........................................ SoundCount=Duration;.................... SoundCount*=1000;.................... SoundCount/=SoundPeriod;........................................ SoundPeriod=SoundPeriod-SOUND_REZIE;........................................ SoundLoop(); // Pozor pouzivaji se globalni parametry.................... }............................................................ // Sada maker, ktera neobsahuji slozity vypocet a jsou.................... // tedy vhodna pro jednoduche pipnuti. Parametry jsou stejne.................... // jako o funkci..................... #define SoundBeepMacro(F,D) \.................... SoundPeriod=SOUND_CLOCK/4/2/F-SOUND_REZIE; \.................... SoundCount=D*F/500; \.................... SoundLoop();........................................ #define SoundNoteMacro(N,O,D) \.................... SoundPeriod=(Table[N]>>O)-SOUND_REZIE; \.................... SoundCount=D*1000/(Table[N]>>O); \.................... SoundLoop();........................................ #define SoundPauseMacro(D) \.................... { \.................... #if D>255 \.................... unsigned int16 i=D; \.................... #else \.................... unsigned int8 i=D; \.................... #endif \.................... for(;i>0;i--) \.................... { \.................... DelaySpecial(1000); \.................... } \.................... }............................................................ #DEFINE TXo PIN_C0 // Vysilac.................... #include "C:\library\kaklik\CCS\AX25.c" // Podprogram pro prenos telemetrie.................... //#define PTT PIN_A2 // PTT control.................... //#define TXo PIN_C0 // To the transmitter modulator.................... #define PERIODAH delay_us(222) // Halfperiod H 222;78/1200 500;430/500.................... #define TAILH delay_us(78).................... #define PERIODAL delay_us(412) // Halfperiod L 412;345/1200 1000;880/500.................... #define TAILL delay_us(345).................... #byte STATUS = 3 // CPUs status register........................................ byte SendData[16] = {'A'<<1, 'L'<<1, 'L'<<1, ' '<<1, ' '<<1, ' '<<1, 0x60,.................... 'C'<<1, 'Z'<<1, '0'<<1, 'R'<<1, 'R'<<1, 'R'<<1, 0x61,.................... 0x03, 0xF0};........................................ boolean bit;.................... int fcslo, fcshi; // variabloes for calculating FCS (CRC).................... int stuff; // stuff counter for extra 0.................... int flag_flag; // if it is sending flag (7E).................... int fcs_flag; // if it is sending Frame Check Sequence.................... int i; // for for........................................ void flipout() //flips the state of output pin a_1.................... {.................... stuff = 0; //since this is a 0, reset the stuff counter.................... if (bit).................... {.................... bit=FALSE; //if the state of the pin was low, make it high..................... }.................... else.................... {.................... bit=TRUE; //if the state of the pin was high make it low.................... }.................... }........................................ void fcsbit(byte tbyte).................... {.................... #asm.................... BCF STATUS,0.................... RRF fcshi,F // rotates the entire 16 bits.................... RRF fcslo,F // to the right.................... #endasm.................... if (((STATUS & 0x01)^(tbyte)) ==0x01).................... {.................... fcshi = fcshi^0x84;.................... fcslo = fcslo^0x08;.................... }.................... }........................................ void SendBit ().................... {.................... if (bit).................... {.................... output_high(TXo);.................... PERIODAH;.................... output_low(TXo);.................... PERIODAH;.................... output_high(TXo);.................... PERIODAH;.................... output_low(TXo);.................... TAILH;.................... }.................... else.................... {.................... output_high(TXo);.................... PERIODAL;.................... output_low(TXo);.................... TAILL;.................... };.................... }........................................ void SendByte (byte inbyte).................... {.................... int k, bt;........................................ for (k=0;k<8;k++) //do the following for each of the 8 bits in the byte.................... {.................... bt = inbyte & 0x01; //strip off the rightmost bit of the byte to be sent (inbyte).................... if ((fcs_flag == FALSE) & (flag_flag == FALSE)) fcsbit(bt); //do FCS calc, but only if this.................... //is not a flag or fcs byte.................... if (bt == 0).................... {.................... flipout();.................... } // if this bit is a zero, flip the output state.................... else.................... { //otherwise if it is a 1, do the following:.................... if (flag_flag == FALSE) stuff++; //increment the count of consequtive 1's.................... if ((flag_flag == FALSE) & (stuff == 5)).................... { //stuff an extra 0, if 5 1's in a row.................... SendBit();.................... flipout(); //flip the output state to stuff a 0.................... }//end of if.................... }//end of else.................... // delay_us(850); //introduces a delay that creates 1200 baud.................... SendBit();.................... inbyte = inbyte>>1; //go to the next bit in the byte.................... }//end of for.................... }//end of SendByte........................................ void SendPacket(char *data).................... {.................... bit=FALSE;........................................ fcslo=fcshi=0xFF; //The 2 FCS Bytes are initialized to FF.................... stuff = 0; //The variable stuff counts the number of 1's in a row. When it gets to 5.................... // it is time to stuff a 0......................................... // output_low(PTT); // Blinking LED.................... // delay_ms(1000);.................... // output_high(PTT);........................................ flag_flag = TRUE; //The variable flag is true if you are transmitted flags (7E's) false otherwise..................... fcs_flag = FALSE; //The variable fcsflag is true if you are transmitting FCS bytes, false otherwise......................................... for(i=0; i<10; i++) SendByte(0x7E); //Sends flag bytes. Adjust length for txdelay.................... //each flag takes approx 6.7 ms.................... flag_flag = FALSE; //done sending flags........................................ for(i=0; i<16; i++) SendByte(SendData[i]); //send the packet bytes........................................ for(i=0; 0 != *data; i++).................... {.................... SendByte(*data); //send the packet bytes.................... data++;.................... };........................................ fcs_flag = TRUE; //about to send the FCS bytes.................... fcslo =fcslo^0xff; //must XOR them with FF before sending.................... fcshi = fcshi^0xff;.................... SendByte(fcslo); //send the low byte of fcs.................... SendByte(fcshi); //send the high byte of fcs.................... fcs_flag = FALSE; //done sending FCS.................... flag_flag = TRUE; //about to send flags.................... SendByte(0x7e); // Send a flag to end packet.................... }........................................................................................................................ //program.................... #define MEZERA 38 // jak se muze jet dlouho bez cary.................... #define COUVEJ 700 // kolik se ma couvat po detekci diry.................... #define CIKCAK 40 // kolik se ma jet cik/cak.................... #define PRES_DIRU 350 // jak predpokladame velkou diru.................... #define TRESHOLD 50........................................ #define L 0 // left.................... #define R 1 // right.................... #define S 2 // straight........................................ char AXstring[40]; // Buffer pro prenos telemetrie........................................ int movement; // smer minuleho pohybu.................... int line; // na ktere strane byla detekovana cara.................... int dira; // pocitadlo pro nalezeni preruseni cary.................... int n; // pomocna promena pro cyklus FOR........................................ void cik_cak() // Hledani cary.................... {.................... n=CIKCAK/2; // poprve hned zatoc opacne, nez se jelo pred detekci diry.................... switch(movement) // zmenime smer zataceni.................... {.................... case L:.................... FL;STOPR; // doprava.................... movement=R; // poznamenej kam jedem.................... line=L; // kdyz prejedem, tak bude cara vlevo.................... break;.................... case R:.................... FR;STOPL; // doleva.................... movement=L; // poznamenej kam jedem.................... line=R; // kdyz prejedem, tak bude cara vpravo.................... break;.................... }........................................ while(true) // jed cik-cak, dokud nenajdes caru.................... {.................... set_adc_channel(RSENSOR);.................... if (TRESHOLD > read_adc()) // je cara ??.................... {.................... STOPL;.................... STOPR;.................... break;.................... };.................... if (CIKCAK < n++) // Jedeme uz dost dlouho cik??Pak jed cak..................... {.................... n=0;.................... STOPL;.................... STOPR;.................... switch(movement) // zmenime smer zataceni.................... {.................... case L:.................... FL; // doprava.................... movement=R; // poznamenej kam jedem.................... line=L; // kdyz prejedem, tak bude cara vlevo.................... break;.................... case R:.................... FR; // doleva.................... movement=L; // poznamenej kam jedem.................... line=R; // kdyz prejedem, tak bude cara vpravo.................... break;.................... }.................... }.................... }.................... }............................................................ void diagnostika().................... {.................... int n;........................................ while (input(PIN_C4))01CA: BSF 44.401CB: MOVF 44,W01CC: BSF 03.501CD: MOVWF 0701CE: BCF 03.501CF: BTFSS 07.401D0: GOTO 2C9.................... {........................................ for (n=500; n<5000; n+=100)01D1: MOVLW F401D2: MOVWF 71.................... {.................... SoundBeep(n,50); //beep01D3: CLRF 7301D4: MOVF 71,W01D5: MOVWF 7201D6: CLRF 7501D7: MOVLW 3201D8: MOVWF 7401D9: CALL 129.................... };01DA: MOVLW 6401DB: ADDWF 71,F01DC: GOTO 1D3.................... Delay_ms(1000);01DD: MOVLW 0401DE: MOVWF 7201DF: MOVLW FA01E0: MOVWF 7301E1: CALL 0A801E2: DECFSZ 72,F01E3: GOTO 1DF........................................ STOPL; //zastav vse01E4: BSF 03.501E5: BCF 06.601E6: BCF 03.501E7: BCF 06.601E8: BSF 03.501E9: BCF 06.701EA: BCF 03.501EB: BCF 06.7.................... STOPR;01EC: BSF 03.501ED: BCF 06.401EE: BCF 03.501EF: BCF 06.401F0: BSF 03.501F1: BCF 06.501F2: BCF 03.501F3: BCF 06.5........................................ FR; //pravy pas01F4: BSF 03.501F5: BCF 06.401F6: BCF 03.501F7: BSF 06.401F8: BSF 03.501F9: BCF 06.501FA: BCF 03.501FB: BCF 06.5.................... Delay_ms(1000);01FC: MOVLW 0401FD: MOVWF 7201FE: MOVLW FA01FF: MOVWF 730200: CALL 0A80201: DECFSZ 72,F0202: GOTO 1FE.................... STOPR;0203: BSF 03.50204: BCF 06.40205: BCF 03.50206: BCF 06.40207: BSF 03.50208: BCF 06.50209: BCF 03.5020A: BCF 06.5.................... Delay_ms(1000);020B: MOVLW 04020C: MOVWF 72020D: MOVLW FA020E: MOVWF 73020F: CALL 0A80210: DECFSZ 72,F0211: GOTO 20D.................... BR;0212: BSF 03.50213: BCF 06.50214: BCF 03.50215: BSF 06.50216: BSF 03.50217: BCF 06.40218: BCF 03.50219: BCF 06.4.................... Delay_ms(1000);021A: MOVLW 04021B: MOVWF 72021C: MOVLW FA021D: MOVWF 73021E: CALL 0A8021F: DECFSZ 72,F0220: GOTO 21C.................... STOPR;0221: BSF 03.50222: BCF 06.40223: BCF 03.50224: BCF 06.40225: BSF 03.50226: BCF 06.50227: BCF 03.50228: BCF 06.5.................... Delay_ms(1000);0229: MOVLW 04022A: MOVWF 72022B: MOVLW FA022C: MOVWF 73022D: CALL 0A8022E: DECFSZ 72,F022F: GOTO 22B........................................ FL; //levy pas0230: BSF 03.50231: BCF 06.60232: BCF 03.50233: BSF 06.60234: BSF 03.50235: BCF 06.70236: BCF 03.50237: BCF 06.7.................... Delay_ms(1000);0238: MOVLW 040239: MOVWF 72023A: MOVLW FA023B: MOVWF 73023C: CALL 0A8023D: DECFSZ 72,F023E: GOTO 23A.................... STOPL;023F: BSF 03.50240: BCF 06.60241: BCF 03.50242: BCF 06.60243: BSF 03.50244: BCF 06.70245: BCF 03.50246: BCF 06.7.................... Delay_ms(1000);0247: MOVLW 040248: MOVWF 720249: MOVLW FA024A: MOVWF 73024B: CALL 0A8024C: DECFSZ 72,F024D: GOTO 249.................... BL;024E: BSF 03.5024F: BCF 06.70250: BCF 03.50251: BSF 06.70252: BSF 03.50253: BCF 06.60254: BCF 03.50255: BCF 06.6.................... Delay_ms(1000);0256: MOVLW 040257: MOVWF 720258: MOVLW FA0259: MOVWF 73025A: CALL 0A8025B: DECFSZ 72,F025C: GOTO 258.................... STOPL;025D: BSF 03.5025E: BCF 06.6025F: BCF 03.50260: BCF 06.60261: BSF 03.50262: BCF 06.70263: BCF 03.50264: BCF 06.7.................... Delay_ms(1000);0265: MOVLW 040266: MOVWF 720267: MOVLW FA0268: MOVWF 730269: CALL 0A8026A: DECFSZ 72,F026B: GOTO 267........................................ FL; //oba pasy026C: BSF 03.5026D: BCF 06.6026E: BCF 03.5026F: BSF 06.60270: BSF 03.50271: BCF 06.70272: BCF 03.50273: BCF 06.7.................... FR;0274: BSF 03.50275: BCF 06.40276: BCF 03.50277: BSF 06.40278: BSF 03.50279: BCF 06.5027A: BCF 03.5027B: BCF 06.5.................... Delay_ms(1000);027C: MOVLW 04027D: MOVWF 72027E: MOVLW FA027F: MOVWF 730280: CALL 0A80281: DECFSZ 72,F0282: GOTO 27E.................... STOPL;0283: BSF 03.50284: BCF 06.60285: BCF 03.50286: BCF 06.60287: BSF 03.50288: BCF 06.70289: BCF 03.5028A: BCF 06.7.................... STOPR;028B: BSF 03.5028C: BCF 06.4028D: BCF 03.5028E: BCF 06.4028F: BSF 03.50290: BCF 06.50291: BCF 03.50292: BCF 06.5.................... Delay_ms(1000);0293: MOVLW 040294: MOVWF 720295: MOVLW FA0296: MOVWF 730297: CALL 0A80298: DECFSZ 72,F0299: GOTO 295.................... BL;029A: BSF 03.5029B: BCF 06.7029C: BCF 03.5029D: BSF 06.7029E: BSF 03.5029F: BCF 06.602A0: BCF 03.502A1: BCF 06.6.................... BR;02A2: BSF 03.502A3: BCF 06.502A4: BCF 03.502A5: BSF 06.502A6: BSF 03.502A7: BCF 06.402A8: BCF 03.502A9: BCF 06.4.................... Delay_ms(1000);02AA: MOVLW 0402AB: MOVWF 7202AC: MOVLW FA02AD: MOVWF 7302AE: CALL 0A802AF: DECFSZ 72,F02B0: GOTO 2AC.................... STOPL;02B1: BSF 03.502B2: BCF 06.602B3: BCF 03.502B4: BCF 06.602B5: BSF 03.502B6: BCF 06.702B7: BCF 03.502B8: BCF 06.7.................... STOPR;02B9: BSF 03.502BA: BCF 06.402BB: BCF 03.502BC: BCF 06.402BD: BSF 03.502BE: BCF 06.502BF: BCF 03.502C0: BCF 06.5.................... Delay_ms(1000);02C1: MOVLW 0402C2: MOVWF 7202C3: MOVLW FA02C4: MOVWF 7302C5: CALL 0A802C6: DECFSZ 72,F02C7: GOTO 2C3.................... }02C8: GOTO 1CA02C9: BCF 0A.302CA: GOTO 2F0 (RETURN).................... }........................................ void main().................... {02CB: CLRF 0402CC: MOVLW 1F02CD: ANDWF 03,F02CE: MOVLW 0702CF: BSF 03.502D0: MOVWF 1F02D1: MOVLW 8202D2: BCF 03.502D3: MOVWF 2D02D4: MOVLW 9802D5: MOVWF 2E02D6: MOVWF 2F02D7: MOVLW 4002D8: MOVWF 3002D9: MOVWF 3102DA: MOVWF 3202DB: MOVLW 6002DC: MOVWF 3302DD: MOVLW 8602DE: MOVWF 3402DF: MOVLW B402E0: MOVWF 3502E1: MOVLW 6002E2: MOVWF 3602E3: MOVLW A402E4: MOVWF 3702E5: MOVWF 3802E6: MOVWF 3902E7: MOVLW 6102E8: MOVWF 3A02E9: MOVLW 0302EA: MOVWF 3B02EB: MOVLW F002EC: MOVWF 3C02ED: MOVLW FF02EE: MOVWF 44.................... diagnostika();02EF: GOTO 1CA........................................ SoundBeep(640,200); //beep02F0: MOVLW 0202F1: MOVWF 7302F2: MOVLW 8002F3: MOVWF 7202F4: CLRF 7502F5: MOVLW C802F6: MOVWF 7402F7: CALL 129.................... Delay_ms(50);02F8: MOVLW 3202F9: MOVWF 7302FA: CALL 0A8.................... SoundBeep(640,200);02FB: MOVLW 0202FC: MOVWF 7302FD: MOVLW 8002FE: MOVWF 7202FF: CLRF 750300: MOVLW C80301: MOVWF 740302: CALL 129........................................ setup_adc_ports(RA0_RA1_RA3_ANALOG);0303: MOVLW 040304: BSF 03.50305: MOVWF 1F.................... setup_adc(ADC_CLOCK_DIV_2);0306: BCF 03.50307: MOVF 1F,W0308: ANDLW 380309: IORLW 01030A: MOVWF 1F.................... Delay_ms(1000); // 1s030B: MOVLW 04030C: MOVWF 71030D: MOVLW FA030E: MOVWF 73030F: CALL 0A80310: DECFSZ 71,F0311: GOTO 30D........................................ movement=R;0312: MOVLW 010313: MOVWF 6D.................... line=S;0314: MOVLW 020315: MOVWF 6E.................... dira=0;0316: CLRF 6F........................................ //cik_cak(); // toc se, abys nasel caru.................... FL; FR; // vpred0317: BSF 03.50318: BCF 06.60319: BCF 03.5031A: BSF 06.6031B: BSF 03.5031C: BCF 06.7031D: BCF 03.5031E: BCF 06.7031F: BSF 03.50320: BCF 06.40321: BCF 03.50322: BSF 06.40323: BSF 03.50324: BCF 06.50325: BCF 03.50326: BCF 06.5........................................ // Sledovani cary.................... while(true).................... {.................... snimani:.................... set_adc_channel(RSENSOR);0327: MOVLW 080328: MOVWF 210329: MOVF 1F,W032A: ANDLW C7032B: IORWF 21,W032C: MOVWF 1F.................... Delay_us(2);032D: NOP032E: NOP.................... if (TRESHOLD > read_adc()) // Cara pod pravym senzorem032F: BSF 1F.20330: BTFSC 1F.20331: GOTO 3300332: MOVF 1E,W0333: SUBLW 310334: BTFSS 03.00335: GOTO 34A.................... {.................... dira=0; // nuluj pocitadlo diry, protoze jsme videli caru0336: CLRF 6F.................... line=R; // zaznamenej, kdes videl caru0337: MOVLW 010338: MOVWF 6E.................... FL;FR;0339: BSF 03.5033A: BCF 06.6033B: BCF 03.5033C: BSF 06.6033D: BSF 03.5033E: BCF 06.7033F: BCF 03.50340: BCF 06.70341: BSF 03.50342: BCF 06.40343: BCF 03.50344: BSF 06.40345: BSF 03.50346: BCF 06.50347: BCF 03.50348: BCF 06.5.................... goto snimani;0349: GOTO 327.................... }........................................ set_adc_channel(LSENSOR);034A: MOVLW 00034B: MOVWF 21034C: MOVF 1F,W034D: ANDLW C7034E: IORWF 21,W034F: MOVWF 1F.................... Delay_us(2);0350: NOP0351: NOP.................... if (TRESHOLD > read_adc()) // Cara pod levym senzorem0352: BSF 1F.20353: BTFSC 1F.20354: GOTO 3530355: MOVF 1E,W0356: SUBLW 310357: BTFSS 03.00358: GOTO 36C.................... {.................... dira=0; // nuluj pocitadlo diry, protoze jsme videli caru0359: CLRF 6F.................... line=L; // zaznamenej, kdes videl caru035A: CLRF 6E.................... FL;FR;035B: BSF 03.5035C: BCF 06.6035D: BCF 03.5035E: BSF 06.6035F: BSF 03.50360: BCF 06.70361: BCF 03.50362: BCF 06.70363: BSF 03.50364: BCF 06.40365: BCF 03.50366: BSF 06.40367: BSF 03.50368: BCF 06.50369: BCF 03.5036A: BCF 06.5.................... goto snimani;036B: GOTO 327.................... }........................................ // oba senzory mimo caru.................... if (0==dira) // v prvnim cyklu po ztrate cary zacneme zahybat036C: MOVF 6F,F036D: BTFSS 03.2036E: GOTO 3BF.................... // v ostatnich cyklech nedelame nic (pro urychleni snimani).................... {.................... STOPL;036F: BSF 03.50370: BCF 06.60371: BCF 03.50372: BCF 06.60373: BSF 03.50374: BCF 06.70375: BCF 03.50376: BCF 06.7.................... STOPR;0377: BSF 03.50378: BCF 06.40379: BCF 03.5037A: BCF 06.4037B: BSF 03.5037C: BCF 06.5037D: BCF 03.5037E: BCF 06.5.................... BL;037F: BSF 03.50380: BCF 06.70381: BCF 03.50382: BSF 06.70383: BSF 03.50384: BCF 06.60385: BCF 03.50386: BCF 06.6.................... BR;0387: BSF 03.50388: BCF 06.50389: BCF 03.5038A: BSF 06.5038B: BSF 03.5038C: BCF 06.4038D: BCF 03.5038E: BCF 06.4.................... Delay_ms(20);038F: MOVLW 140390: MOVWF 730391: CALL 0A8.................... STOPL;0392: BSF 03.50393: BCF 06.60394: BCF 03.50395: BCF 06.60396: BSF 03.50397: BCF 06.70398: BCF 03.50399: BCF 06.7.................... STOPR;039A: BSF 03.5039B: BCF 06.4039C: BCF 03.5039D: BCF 06.4039E: BSF 03.5039F: BCF 06.503A0: BCF 03.503A1: BCF 06.5.................... Delay_ms(200);03A2: MOVLW C803A3: MOVWF 7303A4: CALL 0A8.................... // kdyz nevidis caru, tak jed tam, kdes ji videl naposled.................... if(line==L)03A5: MOVF 6E,F03A6: BTFSS 03.203A7: GOTO 3B1.................... {.................... // doleva.................... // STOPL;.................... FR;03A8: BSF 03.503A9: BCF 06.403AA: BCF 03.503AB: BSF 06.403AC: BSF 03.503AD: BCF 06.503AE: BCF 03.503AF: BCF 06.5.................... movement=L; // poznamenej kam jedes03B0: CLRF 6D.................... }.................... if(line==R)03B1: DECFSZ 6E,W03B2: GOTO 3BD.................... {.................... // doprava.................... // STOPR;.................... FL;03B3: BSF 03.503B4: BCF 06.603B5: BCF 03.503B6: BSF 06.603B7: BSF 03.503B8: BCF 06.703B9: BCF 03.503BA: BCF 06.7.................... movement=R; // poznamenej kam jedes03BB: MOVLW 0103BC: MOVWF 6D.................... }.................... dira++; // zvets pocitadlo diry, aby to pristi cyklus tudy neslo03BD: INCF 6F,F.................... goto snimani; // co nejrychleji se vrat na snimani cary03BE: GOTO 327.................... }........................................ /*if (MEZERA < dira++) // nejedeme uz moc dlouho bez cary??.................... {.................... dira=0;.................... switch(movement) // kam se jelo ??.................... {.................... case L:.................... BR; // couvej doprava.................... Delay_ms(COUVEJ);.................... movement=R;.................... break;.................... case R:.................... BL; // couvej doleva.................... Delay_ms(COUVEJ);.................... movement=L;.................... break;.................... }.................... STOP(); // konec couvani.................... FL; FR; // rovne pres diru.................... Delay_ms(PRES_DIRU);.................... STOP();.................... cik_cak(); // najdi caru.................... FR; FL; // vpred.................... } // dira*/........................................ } // while(true)03BF: GOTO 327........................................ }....................03C0: SLEEP.................... /*void objizdka().................... {.................... BL; BR; // zacouvej.................... Delay_ms(150);.................... STOP();........................................ cik_cak(); // vyrovnej se na caru.................... cik_cak(); // radeji 3x, aby se vyrovnaly setrvacne sily.................... cik_cak();........................................ BL; FR; Delay_ms(220); // vlevo.................... STOP();.................... FL; FR; Delay_ms(650); // rovne.................... STOP();.................... FL; BR; Delay_ms(220); // vpravo.................... STOP();.................... FL; FR; Delay_ms(770); // rovne.................... STOP();.................... FL; BR; Delay_ms(210); // vpravo.................... STOP();.................... FL; FR;.................... Delay_ms(200); // kousek rovne.................... // rovne, dokud nenarazis na caru.................... while(input(RSENSOR)); // pravej senzor, protoze cihla je vpravo.................... STOP();.................... BL; FR; // toc se doleva, dokud nenarazis na caru.................... while(input(LSENSOR)); // levej senzor, protoze cara je urcite vlevo.................... STOP();.................... line=R; // caru predpokladame vpravo, kdybysme ji prejeli.................... dira=0;.................... FL; FR; // vpred.................... }*/....................