0,0 → 1,528 |
CCS PCM C Compiler, Version 3.245, 27853 27-I-07 23:47 |
|
Filename: C:\PIC\laserus\873\laserus.lst |
|
ROM used: 358 words (9%) |
Largest free fragment is 2048 |
RAM used: 23 (12%) at main() level |
29 (15%) worst case |
Stack: 2 worst case (1 in main + 1 for interrupts) |
|
* |
0000: MOVLW 00 |
0001: MOVWF 0A |
0002: GOTO 0E3 |
0003: NOP |
0004: MOVWF 7F |
0005: SWAPF 03,W |
0006: CLRF 03 |
0007: MOVWF 26 |
0008: MOVF 7F,W |
0009: MOVWF 25 |
000A: MOVF 0A,W |
000B: MOVWF 2D |
000C: CLRF 0A |
000D: SWAPF 25,F |
000E: MOVF 04,W |
000F: MOVWF 27 |
0010: MOVF 20,W |
0011: MOVWF 28 |
0012: MOVF 21,W |
0013: MOVWF 29 |
0014: MOVF 22,W |
0015: MOVWF 2A |
0016: MOVF 23,W |
0017: MOVWF 2B |
0018: MOVF 24,W |
0019: MOVWF 2C |
001A: BCF 03.7 |
001B: BCF 03.5 |
001C: BTFSS 0B.4 |
001D: GOTO 020 |
001E: BTFSC 0B.1 |
001F: GOTO 033 |
0020: MOVF 27,W |
0021: MOVWF 04 |
0022: MOVF 28,W |
0023: MOVWF 20 |
0024: MOVF 29,W |
0025: MOVWF 21 |
0026: MOVF 2A,W |
0027: MOVWF 22 |
0028: MOVF 2B,W |
0029: MOVWF 23 |
002A: MOVF 2C,W |
002B: MOVWF 24 |
002C: MOVF 2D,W |
002D: MOVWF 0A |
002E: SWAPF 26,W |
002F: MOVWF 03 |
0030: SWAPF 7F,F |
0031: SWAPF 7F,W |
0032: RETFIE |
0033: BCF 0A.3 |
0034: GOTO 035 |
.................... #include "laserus.h" |
.................... #include <16F873.h> |
.................... //////// Standard Header file for the PIC16F873 device //////////////// |
.................... #device PIC16F873 |
.................... #list |
.................... |
.................... #device adc=8 |
.................... |
.................... #FUSES NOWDT //No Watch Dog Timer |
.................... #FUSES XT //Crystal osc <= 4mhz |
.................... #FUSES NOPUT //No Power Up Timer |
.................... #FUSES NOPROTECT //Code not protected from reading |
.................... #FUSES NOBROWNOUT //No brownout reset |
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O |
.................... #FUSES NOCPD //No EE protection |
.................... #FUSES NOWRT //Program memory not write protected |
.................... #FUSES NODEBUG //No Debug mode for ICD |
.................... |
.................... #use delay(clock=4000000) |
* |
00CE: MOVLW 35 |
00CF: MOVWF 04 |
00D0: MOVF 00,W |
00D1: BTFSC 03.2 |
00D2: GOTO 0E2 |
00D3: MOVLW 01 |
00D4: MOVWF 21 |
00D5: CLRF 20 |
00D6: DECFSZ 20,F |
00D7: GOTO 0D6 |
00D8: DECFSZ 21,F |
00D9: GOTO 0D5 |
00DA: MOVLW 4A |
00DB: MOVWF 20 |
00DC: DECFSZ 20,F |
00DD: GOTO 0DC |
00DE: NOP |
00DF: NOP |
00E0: DECFSZ 00,F |
00E1: GOTO 0D3 |
00E2: RETLW 00 |
.................... |
.................... |
.................... |
.................... #define SERVO PIN_B5 // Vystup pro rizeni serva |
.................... #define LASER PIN_B4 // Vstup pro cteni laseru |
.................... |
.................... #define MOT_DIR_L PIN_C0 // Rizeni smeru otaceni motoru |
.................... #define MOT_DIR_R PIN_C3 |
.................... |
.................... // kroutitka |
.................... #define CERVENA 0 // AN0 |
.................... #define CERNA 1 // AN1 |
.................... //#define ZELENA 3 // AN3 |
.................... //#define MODRA 4 // AN4 |
.................... |
.................... #byte INTCON = 0x0B // Interrupt configuration register |
.................... #bit GIE = INTCON.7 |
.................... #bit PEIE = INTCON.6 |
.................... #bit TMR0IE = INTCON.5 |
.................... #bit INT0IE = INTCON.4 |
.................... #bit RBIE = INTCON.3 |
.................... #bit TMR0IF = INTCON.2 |
.................... #bit INT0IF = INTCON.1 |
.................... #bit RBIF = INTCON.0 |
.................... |
.................... boolean edge; |
.................... int8 uhel, olduhel; |
.................... int16 uhel16; |
.................... |
.................... #int_EXT |
.................... EXT_isr() |
.................... { |
.................... int n, t1, t2, t; |
.................... |
.................... set_timer0(0); // Vynulovani casovace pro 2ms |
* |
0035: CLRF 01 |
.................... output_high(SERVO); |
0036: BSF 03.5 |
0037: BCF 06.5 |
0038: BCF 03.5 |
0039: BSF 06.5 |
.................... while(get_timer0()<(1000/256)); // Ceka 1ms |
003A: MOVF 01,W |
003B: SUBLW 02 |
003C: BTFSC 03.0 |
003D: GOTO 03A |
.................... for(n=uhel; n>0; n--) delay_us(3); // Sirka impulzu podle uhlu |
003E: MOVF 2F,W |
003F: MOVWF 37 |
0040: MOVF 37,F |
0041: BTFSC 03.2 |
0042: GOTO 048 |
0043: NOP |
0044: NOP |
0045: NOP |
0046: DECF 37,F |
0047: GOTO 040 |
.................... output_low(SERVO); |
0048: BSF 03.5 |
0049: BCF 06.5 |
004A: BCF 03.5 |
004B: BCF 06.5 |
.................... while(get_timer0()<(3000/256)); // Ceka do 3ms, nez zacne scanovat |
004C: MOVF 01,W |
004D: SUBLW 0A |
004E: BTFSC 03.0 |
004F: GOTO 04C |
.................... |
.................... set_timer0(0); // Vynulovani casovace pro zjisteni polohy cary |
0050: CLRF 01 |
.................... if(edge) // Zrcatko prejizdelo tam nebo zpet? |
0051: BTFSS 2E.0 |
0052: GOTO 094 |
.................... { |
.................... edge=false; |
0053: BCF 2E.0 |
.................... ext_int_edge(H_TO_L); // Pristi inerrupt bude od opacne hrany |
0054: BSF 03.5 |
0055: BCF 01.6 |
.................... INT0IF=0; // Povoleni dalsiho preruseni |
0056: BCF 03.5 |
0057: BCF 0B.1 |
.................... enable_interrupts(INT_EXT); |
0058: BSF 0B.4 |
.................... enable_interrupts(GLOBAL); |
0059: MOVLW C0 |
005A: IORWF 0B,F |
.................... // do |
.................... { |
.................... while(0==input(LASER)); // Ceka na detekci cary |
005B: BSF 03.5 |
005C: BSF 06.4 |
005D: MOVLW 00 |
005E: BCF 03.5 |
005F: BTFSC 06.4 |
0060: MOVLW 01 |
0061: XORLW 00 |
0062: BTFSC 03.2 |
0063: GOTO 05B |
.................... // output_high(SERVO); |
.................... t1=get_timer0(); // Poznamena cas nabezne hrany |
0064: MOVF 01,W |
0065: MOVWF 38 |
.................... while(1==input(LASER)); // Ceka az zkonci cara |
0066: BSF 03.5 |
0067: BSF 06.4 |
0068: MOVLW 00 |
0069: BCF 03.5 |
006A: BTFSC 06.4 |
006B: MOVLW 01 |
006C: SUBLW 01 |
006D: BTFSC 03.2 |
006E: GOTO 066 |
.................... // output_low(SERVO); |
.................... t2=get_timer0(); // Poznamena cas sestupne hrany |
006F: MOVF 01,W |
0070: MOVWF 39 |
.................... t=t2-t1; |
0071: MOVF 38,W |
0072: SUBWF 39,W |
0073: MOVWF 3A |
.................... } while((t<3) || (t>20)); // Cara je detekovana, kdyz trva mezi xx ms |
0074: MOVF 3A,W |
0075: SUBLW 02 |
0076: BTFSC 03.0 |
0077: GOTO 074 |
0078: MOVF 3A,W |
0079: SUBLW 14 |
007A: BTFSS 03.0 |
007B: GOTO 074 |
.................... // if ((t>3) && (t<20)) uhel=(160-(read_adc()>>2))-t1; |
.................... // if (abs(olduhel-uhel)<40) |
.................... { |
.................... uhel=(160-(read_adc()>>2))-t1; |
007C: BSF 1F.2 |
007D: BTFSC 1F.2 |
007E: GOTO 07D |
007F: MOVF 1E,W |
0080: MOVWF 20 |
0081: RRF 20,F |
0082: RRF 20,F |
0083: MOVLW 3F |
0084: ANDWF 20,F |
0085: MOVF 20,W |
0086: SUBLW A0 |
0087: MOVWF 21 |
0088: MOVF 38,W |
0089: SUBWF 21,W |
008A: MOVWF 2F |
.................... olduhel=uhel; |
008B: MOVF 2F,W |
008C: MOVWF 30 |
.................... }; |
.................... // uhel16=uhel; |
.................... // set_pwm1_duty(250-(uhel16<<2)); // Elektronicky diferencial |
.................... // set_pwm2_duty((uhel16)); |
.................... set_adc_channel(CERNA); |
008D: MOVLW 08 |
008E: MOVWF 21 |
008F: MOVF 1F,W |
0090: ANDLW C7 |
0091: IORWF 21,W |
0092: MOVWF 1F |
.................... } |
.................... else |
0093: GOTO 0CA |
.................... { |
.................... edge=true; |
0094: BSF 2E.0 |
.................... ext_int_edge(L_TO_H); // Pristi inerrupt bude od opacne hrany |
0095: BSF 03.5 |
0096: BSF 01.6 |
.................... INT0IF=0; // Povoleni dalsiho preruseni |
0097: BCF 03.5 |
0098: BCF 0B.1 |
.................... enable_interrupts(INT_EXT); |
0099: BSF 0B.4 |
.................... enable_interrupts(GLOBAL); |
009A: MOVLW C0 |
009B: IORWF 0B,F |
.................... // do |
.................... { |
.................... while(0==input(LASER)); // Ceka na detekci cary |
009C: BSF 03.5 |
009D: BSF 06.4 |
009E: MOVLW 00 |
009F: BCF 03.5 |
00A0: BTFSC 06.4 |
00A1: MOVLW 01 |
00A2: XORLW 00 |
00A3: BTFSC 03.2 |
00A4: GOTO 09C |
.................... t1=get_timer0(); // Poznamena cas nabezne hrany |
00A5: MOVF 01,W |
00A6: MOVWF 38 |
.................... while(1==input(LASER)); // Ceka az zkonci cara |
00A7: BSF 03.5 |
00A8: BSF 06.4 |
00A9: MOVLW 00 |
00AA: BCF 03.5 |
00AB: BTFSC 06.4 |
00AC: MOVLW 01 |
00AD: SUBLW 01 |
00AE: BTFSC 03.2 |
00AF: GOTO 0A7 |
.................... t2=get_timer0(); // Poznamena cas sestupne hrany |
00B0: MOVF 01,W |
00B1: MOVWF 39 |
.................... t=t2-t1; |
00B2: MOVF 38,W |
00B3: SUBWF 39,W |
00B4: MOVWF 3A |
.................... } while((t<3) || (t>20)); // Cara je detekovana, kdyz trva mezi xx ms |
00B5: MOVF 3A,W |
00B6: SUBLW 02 |
00B7: BTFSC 03.0 |
00B8: GOTO 0B5 |
00B9: MOVF 3A,W |
00BA: SUBLW 14 |
00BB: BTFSS 03.0 |
00BC: GOTO 0B5 |
.................... if (abs(olduhel-uhel)<40) |
00BD: MOVF 2F,W |
00BE: SUBWF 30,W |
00BF: MOVWF 3B |
00C0: MOVF 3B,W |
00C1: SUBLW 27 |
00C2: BTFSS 03.0 |
00C3: GOTO 0C4 |
.................... { |
.................... // uhel=((read_adc()>>2)+32)+t1; |
.................... // olduhel=uhel; |
.................... }; |
.................... set_adc_channel(CERVENA); |
00C4: MOVLW 00 |
00C5: MOVWF 21 |
00C6: MOVF 1F,W |
00C7: ANDLW C7 |
00C8: IORWF 21,W |
00C9: MOVWF 1F |
.................... } |
.................... while(true); |
00CA: GOTO 0CA |
.................... } |
.................... |
.................... |
.................... |
00CB: BCF 0B.1 |
00CC: BCF 0A.3 |
00CD: GOTO 020 |
.................... void main() |
.................... { |
* |
00E3: CLRF 04 |
00E4: MOVLW 1F |
00E5: ANDWF 03,F |
00E6: BSF 03.5 |
00E7: BSF 1F.0 |
00E8: BSF 1F.1 |
00E9: BSF 1F.2 |
00EA: BCF 1F.3 |
.................... |
.................... setup_adc_ports(ALL_ANALOG); // Analogove vstupy pro cteni trimru |
* |
00EE: BSF 03.5 |
00EF: BCF 1F.0 |
00F0: BCF 1F.1 |
00F1: BCF 1F.2 |
00F2: BCF 1F.3 |
.................... setup_adc(ADC_CLOCK_INTERNAL); |
00F3: BCF 03.5 |
00F4: BSF 1F.6 |
00F5: BSF 1F.7 |
00F6: BSF 03.5 |
00F7: BCF 1F.7 |
00F8: BCF 03.5 |
00F9: BSF 1F.0 |
.................... setup_spi(FALSE); |
* |
00EB: MOVLW FF |
00EC: BCF 03.5 |
00ED: MOVWF 33 |
* |
00FA: BCF 14.5 |
00FB: BCF 33.5 |
00FC: MOVF 33,W |
00FD: BSF 03.5 |
00FE: MOVWF 07 |
00FF: BCF 03.5 |
0100: BSF 33.4 |
0101: MOVF 33,W |
0102: BSF 03.5 |
0103: MOVWF 07 |
0104: BCF 03.5 |
0105: BCF 33.3 |
0106: MOVF 33,W |
0107: BSF 03.5 |
0108: MOVWF 07 |
0109: MOVLW 00 |
010A: BCF 03.5 |
010B: MOVWF 14 |
010C: BSF 03.5 |
010D: MOVWF 14 |
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Casovac pro cteni laseru |
010E: MOVF 01,W |
010F: ANDLW C0 |
0110: IORLW 07 |
0111: MOVWF 01 |
.................... setup_timer_1(T1_DISABLED); |
0112: BCF 03.5 |
0113: CLRF 10 |
.................... setup_timer_2(T2_DIV_BY_4,255,1); // Casovac pro PWM cca 900Hz |
0114: MOVLW 00 |
0115: MOVWF 21 |
0116: IORLW 05 |
0117: MOVWF 12 |
0118: MOVLW FF |
0119: BSF 03.5 |
011A: MOVWF 12 |
.................... setup_ccp1(CCP_PWM); // Nastaveni PWM pro diferencial RC1, RC2 |
011B: BCF 03.5 |
011C: BCF 33.2 |
011D: MOVF 33,W |
011E: BSF 03.5 |
011F: MOVWF 07 |
0120: BCF 03.5 |
0121: BCF 07.2 |
0122: MOVLW 0C |
0123: MOVWF 17 |
.................... setup_ccp2(CCP_PWM); |
0124: BCF 33.1 |
0125: MOVF 33,W |
0126: BSF 03.5 |
0127: MOVWF 07 |
0128: BCF 03.5 |
0129: BCF 07.1 |
012A: MOVLW 0C |
012B: MOVWF 1D |
.................... |
.................... set_pwm1_duty(90); // Zastaveni PWM |
012C: MOVLW 5A |
012D: MOVWF 15 |
.................... set_pwm2_duty(90); |
012E: MOVWF 1B |
.................... |
.................... delay_ms(100); |
012F: MOVLW 64 |
0130: MOVWF 35 |
0131: CALL 0CE |
.................... set_adc_channel(CERVENA); |
0132: MOVLW 00 |
0133: MOVWF 21 |
0134: MOVF 1F,W |
0135: ANDLW C7 |
0136: IORWF 21,W |
0137: MOVWF 1F |
.................... Delay_ms(1); |
0138: MOVLW 01 |
0139: MOVWF 35 |
013A: CALL 0CE |
.................... |
.................... ext_int_edge(L_TO_H); |
013B: BSF 03.5 |
013C: BSF 01.6 |
.................... edge=true; |
013D: BCF 03.5 |
013E: BSF 2E.0 |
.................... uhel=((read_adc()>>2)+32)+30; |
013F: BSF 1F.2 |
0140: BTFSC 1F.2 |
0141: GOTO 140 |
0142: MOVF 1E,W |
0143: MOVWF 20 |
0144: RRF 20,F |
0145: RRF 20,F |
0146: MOVLW 3F |
0147: ANDWF 20,F |
0148: MOVF 20,W |
0149: ADDLW 20 |
014A: ADDLW 1E |
014B: MOVWF 2F |
.................... olduhel=uhel; |
014C: MOVF 2F,W |
014D: MOVWF 30 |
.................... |
.................... enable_interrupts(INT_EXT); |
014E: BSF 0B.4 |
.................... enable_interrupts(GLOBAL); |
014F: MOVLW C0 |
0150: IORWF 0B,F |
.................... |
.................... delay_ms(1000); |
0151: MOVLW 04 |
0152: MOVWF 34 |
0153: MOVLW FA |
0154: MOVWF 35 |
0155: CALL 0CE |
0156: DECFSZ 34,F |
0157: GOTO 153 |
.................... |
.................... output_high(MOT_DIR_L); // Oba motory vpred |
0158: BCF 33.0 |
0159: MOVF 33,W |
015A: BSF 03.5 |
015B: MOVWF 07 |
015C: BCF 03.5 |
015D: BSF 07.0 |
.................... output_high(MOT_DIR_R); |
015E: BCF 33.3 |
015F: MOVF 33,W |
0160: BSF 03.5 |
0161: MOVWF 07 |
0162: BCF 03.5 |
0163: BSF 07.3 |
.................... |
.................... while(true); |
0164: GOTO 164 |
.................... } |
0165: SLEEP |
|
Configuration Fuses: |
Word 1: 3F39 XT NOWDT NOPUT NOPROTECT NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG |