Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 1 → Rev 2

/roboti/tank/main.LST
0,0 → 1,1381
CCS PCW C Compiler, Version 3.110, 15448
 
Filename: d:\kaklik\programy\pic_c\robot\tank\main.LST
 
ROM used: 893 (22%)
Largest free fragment is 2048
RAM used: 82 (43%) at main() level
101 (53%) worst case
Stack: 3 locations
 
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 2CB
0003: 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 73
00A9: MOVWF 04
00AA: MOVF 00,W
00AB: BTFSC 03.2
00AC: GOTO 0BC
00AD: MOVLW 01
00AE: MOVWF 21
00AF: CLRF 20
00B0: DECFSZ 20,F
00B1: GOTO 0B0
00B2: DECFSZ 21,F
00B3: GOTO 0AF
00B4: MOVLW 4A
00B5: MOVWF 20
00B6: DECFSZ 20,F
00B7: GOTO 0B6
00B8: NOP
00B9: NOP
00BA: DECFSZ 00,F
00BB: GOTO 0AD
00BC: 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 01
0101: MOVWF 23
0102: MOVLW 0A
0103: MOVWF 7E
0104: MOVF 23,W
0105: MOVWF 0A
.................... #asm
.................... movf Time,w // Zpracuj nejnizsi 3 bity
0106: MOVF 7B,W
.................... xorlw 7 // Pro hodnotu 0 skakej pres vsechny nopy
0107: XORLW 07
.................... andlw 7 // Ber jen spodni 3 bity
0108: ANDLW 07
.................... addwf 2,f // Preskoc zadny az vsech 8 nopu (2 je PCL)
0109: ADDWF 02,F
.................... Next:
.................... nop // Spozdeni s granularitou 1 takt
010A: NOP
.................... nop
010B: NOP
.................... nop
010C: NOP
.................... nop
010D: NOP
.................... nop
010E: NOP
.................... nop
010F: NOP
.................... nop
0110: NOP
.................... nop
.................... #endasm
0111: NOP
.................... Time = Time >> 3; // Zahod spodni 3 bity
0112: RRF 7C,F
0113: RRF 7B,F
0114: RRF 7C,F
0115: RRF 7B,F
0116: RRF 7C,F
0117: RRF 7B,F
0118: MOVLW 1F
0119: ANDWF 7C,F
.................... TimeHi=Time>>8; // Oddel horni cast citace
011A: MOVF 7C,W
011B: MOVWF 7D
.................... Time++; // Korekce na casovani typu dcfsz
011C: INCF 7B,F
011D: BTFSC 03.2
011E: INCF 7C,F
.................... TimeHi++;
011F: INCF 7D,F
.................... #asm
.................... Loop:
.................... nop // Smycka musi trvat 8 taktu
0120: NOP
.................... nop // a ma 16 bitu dlouhy citac
0121: NOP
.................... nop
0122: NOP
.................... decfsz Time
0123: DECFSZ 7B,F
.................... goto Next1
0124: GOTO 126
.................... decfsz TimeHi
0125: DECFSZ 7D,F
.................... Next1:
.................... goto Loop
.................... #endasm
0126: GOTO 120
0127: 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,W
01A0: MOVWF 78
01A1: MOVF 25,W
01A2: MOVWF 77
01A3: MOVF 77,F
01A4: BTFSS 03.2
01A5: GOTO 1A9
01A6: MOVF 78,F
01A7: BTFSC 03.2
01A8: GOTO 1C9
.................... {
.................... output_bit(SOUND_HI,Data); // Nastav vystup
01A9: BTFSC 76.0
01AA: GOTO 1AD
01AB: BCF 06.2
01AC: GOTO 1AE
01AD: BSF 06.2
01AE: BSF 03.5
01AF: BCF 06.2
.................... output_bit(SOUND_LO,~Data);
01B0: BCF 03.5
01B1: BTFSS 76.0
01B2: GOTO 1B5
01B3: BCF 06.3
01B4: GOTO 1B6
01B5: BSF 06.3
01B6: BSF 03.5
01B7: BCF 06.3
.................... Data=~Data; // Otoc stav vystupu
01B8: MOVLW 01
01B9: BCF 03.5
01BA: XORWF 76,F
.................... DelaySpecial(SoundPeriod); // Pockej po dobu plperiody
01BB: MOVF 2A,W
01BC: MOVWF 7A
01BD: MOVF 29,W
01BE: MOVWF 79
01BF: MOVF 2A,W
01C0: MOVWF 7C
01C1: MOVF 29,W
01C2: MOVWF 7B
01C3: CALL 100
.................... }
01C4: MOVF 77,W
01C5: BTFSC 03.2
01C6: DECF 78,F
01C7: DECF 77,F
01C8: 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,F
012A: BTFSS 03.2
012B: GOTO 140
012C: MOVF 73,F
012D: BTFSS 03.2
012E: GOTO 140
.................... {
.................... for(;Duration>0;Duration--)
012F: MOVF 74,F
0130: BTFSS 03.2
0131: GOTO 135
0132: MOVF 75,F
0133: BTFSC 03.2
0134: GOTO 13F
.................... {
.................... DelaySpecial(1000); // Zhruba 1ms
0135: MOVLW 03
0136: MOVWF 7C
0137: MOVLW E8
0138: MOVWF 7B
0139: CALL 100
.................... }
013A: MOVF 74,W
013B: BTFSC 03.2
013C: DECF 75,F
013D: DECF 74,F
013E: GOTO 12F
.................... return;
013F: GOTO 1C9
.................... }
....................
.................... SoundPeriod=(SOUND_CLOCK/4/2)/Frequency-SOUND_REZIE;
0140: CLRF 79
0141: MOVLW 07
0142: MOVWF 78
0143: MOVLW A1
0144: MOVWF 77
0145: MOVLW 20
0146: MOVWF 76
0147: CLRF 7D
0148: CLRF 7C
0149: MOVF 73,W
014A: MOVWF 7B
014B: MOVF 72,W
014C: MOVWF 7A
014D: CALL 004
014E: MOVF 23,W
014F: MOVWF 79
0150: MOVF 22,W
0151: MOVWF 78
0152: MOVF 21,W
0153: MOVWF 77
0154: MOVF 20,W
0155: MOVWF 76
0156: MOVLW 48
0157: SUBWF 76,W
0158: MOVWF 29
0159: MOVF 77,W
015A: MOVWF 2A
015B: MOVLW 00
015C: BTFSS 03.0
015D: MOVLW 01
015E: SUBWF 2A,F
015F: MOVF 78,W
0160: MOVWF 2B
0161: MOVLW 00
0162: BTFSS 03.0
0163: MOVLW 01
0164: SUBWF 2B,F
0165: MOVF 79,W
0166: MOVWF 2C
0167: MOVLW 00
0168: BTFSS 03.0
0169: MOVLW 01
016A: SUBWF 2C,F
....................
.................... SoundCount=Duration; // Vypocet poctu pulperiod signalu Duration*Frequency*2/1000
016B: CLRF 28
016C: CLRF 27
016D: MOVF 75,W
016E: MOVWF 26
016F: MOVF 74,W
0170: MOVWF 25
.................... SoundCount*=Frequency;
0171: MOVF 28,W
0172: MOVWF 79
0173: MOVF 27,W
0174: MOVWF 78
0175: MOVF 26,W
0176: MOVWF 77
0177: MOVF 25,W
0178: MOVWF 76
0179: CLRF 7D
017A: CLRF 7C
017B: MOVF 73,W
017C: MOVWF 7B
017D: MOVF 72,W
017E: MOVWF 7A
017F: GOTO 066
0180: MOVF 23,W
0181: MOVWF 28
0182: MOVF 22,W
0183: MOVWF 27
0184: MOVF 21,W
0185: MOVWF 26
0186: MOVF 20,W
0187: MOVWF 25
.................... SoundCount/=500;
0188: MOVF 28,W
0189: MOVWF 79
018A: MOVF 27,W
018B: MOVWF 78
018C: MOVF 26,W
018D: MOVWF 77
018E: MOVF 25,W
018F: MOVWF 76
0190: CLRF 7D
0191: CLRF 7C
0192: MOVLW 01
0193: MOVWF 7B
0194: MOVLW F4
0195: MOVWF 7A
0196: CALL 004
0197: MOVF 23,W
0198: MOVWF 28
0199: MOVF 22,W
019A: MOVWF 27
019B: MOVF 21,W
019C: MOVWF 26
019D: MOVF 20,W
019E: 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.4
01CB: MOVF 44,W
01CC: BSF 03.5
01CD: MOVWF 07
01CE: BCF 03.5
01CF: BTFSS 07.4
01D0: GOTO 2C9
.................... {
....................
.................... for (n=500; n<5000; n+=100)
01D1: MOVLW F4
01D2: MOVWF 71
.................... {
.................... SoundBeep(n,50); //beep
01D3: CLRF 73
01D4: MOVF 71,W
01D5: MOVWF 72
01D6: CLRF 75
01D7: MOVLW 32
01D8: MOVWF 74
01D9: CALL 129
.................... };
01DA: MOVLW 64
01DB: ADDWF 71,F
01DC: GOTO 1D3
.................... Delay_ms(1000);
01DD: MOVLW 04
01DE: MOVWF 72
01DF: MOVLW FA
01E0: MOVWF 73
01E1: CALL 0A8
01E2: DECFSZ 72,F
01E3: GOTO 1DF
....................
.................... STOPL; //zastav vse
01E4: BSF 03.5
01E5: BCF 06.6
01E6: BCF 03.5
01E7: BCF 06.6
01E8: BSF 03.5
01E9: BCF 06.7
01EA: BCF 03.5
01EB: BCF 06.7
.................... STOPR;
01EC: BSF 03.5
01ED: BCF 06.4
01EE: BCF 03.5
01EF: BCF 06.4
01F0: BSF 03.5
01F1: BCF 06.5
01F2: BCF 03.5
01F3: BCF 06.5
....................
.................... FR; //pravy pas
01F4: BSF 03.5
01F5: BCF 06.4
01F6: BCF 03.5
01F7: BSF 06.4
01F8: BSF 03.5
01F9: BCF 06.5
01FA: BCF 03.5
01FB: BCF 06.5
.................... Delay_ms(1000);
01FC: MOVLW 04
01FD: MOVWF 72
01FE: MOVLW FA
01FF: MOVWF 73
0200: CALL 0A8
0201: DECFSZ 72,F
0202: GOTO 1FE
.................... STOPR;
0203: BSF 03.5
0204: BCF 06.4
0205: BCF 03.5
0206: BCF 06.4
0207: BSF 03.5
0208: BCF 06.5
0209: BCF 03.5
020A: BCF 06.5
.................... Delay_ms(1000);
020B: MOVLW 04
020C: MOVWF 72
020D: MOVLW FA
020E: MOVWF 73
020F: CALL 0A8
0210: DECFSZ 72,F
0211: GOTO 20D
.................... BR;
0212: BSF 03.5
0213: BCF 06.5
0214: BCF 03.5
0215: BSF 06.5
0216: BSF 03.5
0217: BCF 06.4
0218: BCF 03.5
0219: BCF 06.4
.................... Delay_ms(1000);
021A: MOVLW 04
021B: MOVWF 72
021C: MOVLW FA
021D: MOVWF 73
021E: CALL 0A8
021F: DECFSZ 72,F
0220: GOTO 21C
.................... STOPR;
0221: BSF 03.5
0222: BCF 06.4
0223: BCF 03.5
0224: BCF 06.4
0225: BSF 03.5
0226: BCF 06.5
0227: BCF 03.5
0228: BCF 06.5
.................... Delay_ms(1000);
0229: MOVLW 04
022A: MOVWF 72
022B: MOVLW FA
022C: MOVWF 73
022D: CALL 0A8
022E: DECFSZ 72,F
022F: GOTO 22B
....................
.................... FL; //levy pas
0230: BSF 03.5
0231: BCF 06.6
0232: BCF 03.5
0233: BSF 06.6
0234: BSF 03.5
0235: BCF 06.7
0236: BCF 03.5
0237: BCF 06.7
.................... Delay_ms(1000);
0238: MOVLW 04
0239: MOVWF 72
023A: MOVLW FA
023B: MOVWF 73
023C: CALL 0A8
023D: DECFSZ 72,F
023E: GOTO 23A
.................... STOPL;
023F: BSF 03.5
0240: BCF 06.6
0241: BCF 03.5
0242: BCF 06.6
0243: BSF 03.5
0244: BCF 06.7
0245: BCF 03.5
0246: BCF 06.7
.................... Delay_ms(1000);
0247: MOVLW 04
0248: MOVWF 72
0249: MOVLW FA
024A: MOVWF 73
024B: CALL 0A8
024C: DECFSZ 72,F
024D: GOTO 249
.................... BL;
024E: BSF 03.5
024F: BCF 06.7
0250: BCF 03.5
0251: BSF 06.7
0252: BSF 03.5
0253: BCF 06.6
0254: BCF 03.5
0255: BCF 06.6
.................... Delay_ms(1000);
0256: MOVLW 04
0257: MOVWF 72
0258: MOVLW FA
0259: MOVWF 73
025A: CALL 0A8
025B: DECFSZ 72,F
025C: GOTO 258
.................... STOPL;
025D: BSF 03.5
025E: BCF 06.6
025F: BCF 03.5
0260: BCF 06.6
0261: BSF 03.5
0262: BCF 06.7
0263: BCF 03.5
0264: BCF 06.7
.................... Delay_ms(1000);
0265: MOVLW 04
0266: MOVWF 72
0267: MOVLW FA
0268: MOVWF 73
0269: CALL 0A8
026A: DECFSZ 72,F
026B: GOTO 267
....................
.................... FL; //oba pasy
026C: BSF 03.5
026D: BCF 06.6
026E: BCF 03.5
026F: BSF 06.6
0270: BSF 03.5
0271: BCF 06.7
0272: BCF 03.5
0273: BCF 06.7
.................... FR;
0274: BSF 03.5
0275: BCF 06.4
0276: BCF 03.5
0277: BSF 06.4
0278: BSF 03.5
0279: BCF 06.5
027A: BCF 03.5
027B: BCF 06.5
.................... Delay_ms(1000);
027C: MOVLW 04
027D: MOVWF 72
027E: MOVLW FA
027F: MOVWF 73
0280: CALL 0A8
0281: DECFSZ 72,F
0282: GOTO 27E
.................... STOPL;
0283: BSF 03.5
0284: BCF 06.6
0285: BCF 03.5
0286: BCF 06.6
0287: BSF 03.5
0288: BCF 06.7
0289: BCF 03.5
028A: BCF 06.7
.................... STOPR;
028B: BSF 03.5
028C: BCF 06.4
028D: BCF 03.5
028E: BCF 06.4
028F: BSF 03.5
0290: BCF 06.5
0291: BCF 03.5
0292: BCF 06.5
.................... Delay_ms(1000);
0293: MOVLW 04
0294: MOVWF 72
0295: MOVLW FA
0296: MOVWF 73
0297: CALL 0A8
0298: DECFSZ 72,F
0299: GOTO 295
.................... BL;
029A: BSF 03.5
029B: BCF 06.7
029C: BCF 03.5
029D: BSF 06.7
029E: BSF 03.5
029F: BCF 06.6
02A0: BCF 03.5
02A1: BCF 06.6
.................... BR;
02A2: BSF 03.5
02A3: BCF 06.5
02A4: BCF 03.5
02A5: BSF 06.5
02A6: BSF 03.5
02A7: BCF 06.4
02A8: BCF 03.5
02A9: BCF 06.4
.................... Delay_ms(1000);
02AA: MOVLW 04
02AB: MOVWF 72
02AC: MOVLW FA
02AD: MOVWF 73
02AE: CALL 0A8
02AF: DECFSZ 72,F
02B0: GOTO 2AC
.................... STOPL;
02B1: BSF 03.5
02B2: BCF 06.6
02B3: BCF 03.5
02B4: BCF 06.6
02B5: BSF 03.5
02B6: BCF 06.7
02B7: BCF 03.5
02B8: BCF 06.7
.................... STOPR;
02B9: BSF 03.5
02BA: BCF 06.4
02BB: BCF 03.5
02BC: BCF 06.4
02BD: BSF 03.5
02BE: BCF 06.5
02BF: BCF 03.5
02C0: BCF 06.5
.................... Delay_ms(1000);
02C1: MOVLW 04
02C2: MOVWF 72
02C3: MOVLW FA
02C4: MOVWF 73
02C5: CALL 0A8
02C6: DECFSZ 72,F
02C7: GOTO 2C3
.................... }
02C8: GOTO 1CA
02C9: BCF 0A.3
02CA: GOTO 2F0 (RETURN)
.................... }
....................
.................... void main()
.................... {
02CB: CLRF 04
02CC: MOVLW 1F
02CD: ANDWF 03,F
02CE: MOVLW 07
02CF: BSF 03.5
02D0: MOVWF 1F
02D1: MOVLW 82
02D2: BCF 03.5
02D3: MOVWF 2D
02D4: MOVLW 98
02D5: MOVWF 2E
02D6: MOVWF 2F
02D7: MOVLW 40
02D8: MOVWF 30
02D9: MOVWF 31
02DA: MOVWF 32
02DB: MOVLW 60
02DC: MOVWF 33
02DD: MOVLW 86
02DE: MOVWF 34
02DF: MOVLW B4
02E0: MOVWF 35
02E1: MOVLW 60
02E2: MOVWF 36
02E3: MOVLW A4
02E4: MOVWF 37
02E5: MOVWF 38
02E6: MOVWF 39
02E7: MOVLW 61
02E8: MOVWF 3A
02E9: MOVLW 03
02EA: MOVWF 3B
02EB: MOVLW F0
02EC: MOVWF 3C
02ED: MOVLW FF
02EE: MOVWF 44
.................... diagnostika();
02EF: GOTO 1CA
....................
.................... SoundBeep(640,200); //beep
02F0: MOVLW 02
02F1: MOVWF 73
02F2: MOVLW 80
02F3: MOVWF 72
02F4: CLRF 75
02F5: MOVLW C8
02F6: MOVWF 74
02F7: CALL 129
.................... Delay_ms(50);
02F8: MOVLW 32
02F9: MOVWF 73
02FA: CALL 0A8
.................... SoundBeep(640,200);
02FB: MOVLW 02
02FC: MOVWF 73
02FD: MOVLW 80
02FE: MOVWF 72
02FF: CLRF 75
0300: MOVLW C8
0301: MOVWF 74
0302: CALL 129
....................
.................... setup_adc_ports(RA0_RA1_RA3_ANALOG);
0303: MOVLW 04
0304: BSF 03.5
0305: MOVWF 1F
.................... setup_adc(ADC_CLOCK_DIV_2);
0306: BCF 03.5
0307: MOVF 1F,W
0308: ANDLW 38
0309: IORLW 01
030A: MOVWF 1F
.................... Delay_ms(1000); // 1s
030B: MOVLW 04
030C: MOVWF 71
030D: MOVLW FA
030E: MOVWF 73
030F: CALL 0A8
0310: DECFSZ 71,F
0311: GOTO 30D
....................
.................... movement=R;
0312: MOVLW 01
0313: MOVWF 6D
.................... line=S;
0314: MOVLW 02
0315: MOVWF 6E
.................... dira=0;
0316: CLRF 6F
....................
.................... //cik_cak(); // toc se, abys nasel caru
.................... FL; FR; // vpred
0317: BSF 03.5
0318: BCF 06.6
0319: BCF 03.5
031A: BSF 06.6
031B: BSF 03.5
031C: BCF 06.7
031D: BCF 03.5
031E: BCF 06.7
031F: BSF 03.5
0320: BCF 06.4
0321: BCF 03.5
0322: BSF 06.4
0323: BSF 03.5
0324: BCF 06.5
0325: BCF 03.5
0326: BCF 06.5
....................
.................... // Sledovani cary
.................... while(true)
.................... {
.................... snimani:
.................... set_adc_channel(RSENSOR);
0327: MOVLW 08
0328: MOVWF 21
0329: MOVF 1F,W
032A: ANDLW C7
032B: IORWF 21,W
032C: MOVWF 1F
.................... Delay_us(2);
032D: NOP
032E: NOP
.................... if (TRESHOLD > read_adc()) // Cara pod pravym senzorem
032F: BSF 1F.2
0330: BTFSC 1F.2
0331: GOTO 330
0332: MOVF 1E,W
0333: SUBLW 31
0334: BTFSS 03.0
0335: GOTO 34A
.................... {
.................... dira=0; // nuluj pocitadlo diry, protoze jsme videli caru
0336: CLRF 6F
.................... line=R; // zaznamenej, kdes videl caru
0337: MOVLW 01
0338: MOVWF 6E
.................... FL;FR;
0339: BSF 03.5
033A: BCF 06.6
033B: BCF 03.5
033C: BSF 06.6
033D: BSF 03.5
033E: BCF 06.7
033F: BCF 03.5
0340: BCF 06.7
0341: BSF 03.5
0342: BCF 06.4
0343: BCF 03.5
0344: BSF 06.4
0345: BSF 03.5
0346: BCF 06.5
0347: BCF 03.5
0348: BCF 06.5
.................... goto snimani;
0349: GOTO 327
.................... }
....................
.................... set_adc_channel(LSENSOR);
034A: MOVLW 00
034B: MOVWF 21
034C: MOVF 1F,W
034D: ANDLW C7
034E: IORWF 21,W
034F: MOVWF 1F
.................... Delay_us(2);
0350: NOP
0351: NOP
.................... if (TRESHOLD > read_adc()) // Cara pod levym senzorem
0352: BSF 1F.2
0353: BTFSC 1F.2
0354: GOTO 353
0355: MOVF 1E,W
0356: SUBLW 31
0357: BTFSS 03.0
0358: GOTO 36C
.................... {
.................... dira=0; // nuluj pocitadlo diry, protoze jsme videli caru
0359: CLRF 6F
.................... line=L; // zaznamenej, kdes videl caru
035A: CLRF 6E
.................... FL;FR;
035B: BSF 03.5
035C: BCF 06.6
035D: BCF 03.5
035E: BSF 06.6
035F: BSF 03.5
0360: BCF 06.7
0361: BCF 03.5
0362: BCF 06.7
0363: BSF 03.5
0364: BCF 06.4
0365: BCF 03.5
0366: BSF 06.4
0367: BSF 03.5
0368: BCF 06.5
0369: BCF 03.5
036A: BCF 06.5
.................... goto snimani;
036B: GOTO 327
.................... }
....................
.................... // oba senzory mimo caru
.................... if (0==dira) // v prvnim cyklu po ztrate cary zacneme zahybat
036C: MOVF 6F,F
036D: BTFSS 03.2
036E: GOTO 3BF
.................... // v ostatnich cyklech nedelame nic (pro urychleni snimani)
.................... {
.................... STOPL;
036F: BSF 03.5
0370: BCF 06.6
0371: BCF 03.5
0372: BCF 06.6
0373: BSF 03.5
0374: BCF 06.7
0375: BCF 03.5
0376: BCF 06.7
.................... STOPR;
0377: BSF 03.5
0378: BCF 06.4
0379: BCF 03.5
037A: BCF 06.4
037B: BSF 03.5
037C: BCF 06.5
037D: BCF 03.5
037E: BCF 06.5
.................... BL;
037F: BSF 03.5
0380: BCF 06.7
0381: BCF 03.5
0382: BSF 06.7
0383: BSF 03.5
0384: BCF 06.6
0385: BCF 03.5
0386: BCF 06.6
.................... BR;
0387: BSF 03.5
0388: BCF 06.5
0389: BCF 03.5
038A: BSF 06.5
038B: BSF 03.5
038C: BCF 06.4
038D: BCF 03.5
038E: BCF 06.4
.................... Delay_ms(20);
038F: MOVLW 14
0390: MOVWF 73
0391: CALL 0A8
.................... STOPL;
0392: BSF 03.5
0393: BCF 06.6
0394: BCF 03.5
0395: BCF 06.6
0396: BSF 03.5
0397: BCF 06.7
0398: BCF 03.5
0399: BCF 06.7
.................... STOPR;
039A: BSF 03.5
039B: BCF 06.4
039C: BCF 03.5
039D: BCF 06.4
039E: BSF 03.5
039F: BCF 06.5
03A0: BCF 03.5
03A1: BCF 06.5
.................... Delay_ms(200);
03A2: MOVLW C8
03A3: MOVWF 73
03A4: CALL 0A8
.................... // kdyz nevidis caru, tak jed tam, kdes ji videl naposled
.................... if(line==L)
03A5: MOVF 6E,F
03A6: BTFSS 03.2
03A7: GOTO 3B1
.................... {
.................... // doleva
.................... // STOPL;
.................... FR;
03A8: BSF 03.5
03A9: BCF 06.4
03AA: BCF 03.5
03AB: BSF 06.4
03AC: BSF 03.5
03AD: BCF 06.5
03AE: BCF 03.5
03AF: BCF 06.5
.................... movement=L; // poznamenej kam jedes
03B0: CLRF 6D
.................... }
.................... if(line==R)
03B1: DECFSZ 6E,W
03B2: GOTO 3BD
.................... {
.................... // doprava
.................... // STOPR;
.................... FL;
03B3: BSF 03.5
03B4: BCF 06.6
03B5: BCF 03.5
03B6: BSF 06.6
03B7: BSF 03.5
03B8: BCF 06.7
03B9: BCF 03.5
03BA: BCF 06.7
.................... movement=R; // poznamenej kam jedes
03BB: MOVLW 01
03BC: MOVWF 6D
.................... }
.................... dira++; // zvets pocitadlo diry, aby to pristi cyklus tudy neslo
03BD: INCF 6F,F
.................... goto snimani; // co nejrychleji se vrat na snimani cary
03BE: 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
.................... }*/
....................