CCS PCM C Compiler, Version 3.221, 27853 03-IX-05 19:25Filename: D:\MLAB\_Z\DART01A\SW\1_01\DART.LSTROM used: 1096 words (27%)Largest free fragment is 2048RAM used: 25 (14%) at main() level43 (25%) worst caseStack: 6 worst case (3 in main + 3 for interrupts)*0000: MOVLW 000001: MOVWF 0A0002: GOTO 25F0003: NOP0004: MOVWF 7F0005: SWAPF 03,W0006: CLRF 030007: MOVWF 210008: MOVF 7F,W0009: MOVWF 20000A: MOVF 0A,W000B: MOVWF 28000C: CLRF 0A000D: SWAPF 20,F000E: MOVF 04,W000F: MOVWF 220010: MOVF 77,W0011: MOVWF 230012: MOVF 78,W0013: MOVWF 240014: MOVF 79,W0015: MOVWF 250016: MOVF 7A,W0017: MOVWF 260018: MOVF 7B,W0019: MOVWF 27001A: BCF 03.7001B: BCF 03.5001C: MOVLW 8C001D: MOVWF 04001E: BTFSS 00.3001F: GOTO 0220020: BTFSC 0C.30021: GOTO 0390022: BTFSS 0B.50023: GOTO 0260024: BTFSC 0B.20025: GOTO 03B0026: MOVF 22,W0027: MOVWF 040028: MOVF 23,W0029: MOVWF 77002A: MOVF 24,W002B: MOVWF 78002C: MOVF 25,W002D: MOVWF 79002E: MOVF 26,W002F: MOVWF 7A0030: MOVF 27,W0031: MOVWF 7B0032: MOVF 28,W0033: MOVWF 0A0034: SWAPF 21,W0035: MOVWF 030036: SWAPF 7F,F0037: SWAPF 7F,W0038: RETFIE0039: BCF 0A.3003A: GOTO 0A5003B: BCF 0A.3003C: GOTO 0D3.................... // DART01A verze programu 1.01.................... // (c)miho 2005.................... //.................... // 1.00 Uvodni verze.................... // 1.01 Doplneno nasatvovani parametru rozjezdu P2 u standardniho algoritmu........................................ #include "DART.h".................... // DART01A verze programu 1.00.................... // (c)miho 2005........................................ #include <16F88.h> // standardni definice konstant.................... //////// Header file for the PIC16F88.................... #device PIC16F88.................... #list.................... #include <16F88_Reg.h> // standardni definice vsech FSR.................... #list............................................................ #device adc=8 // AD prevodnik jen na 8 bitu.................... #define xclock 4168000 // muj konkretni PIC je trochu rychlejsi.................... #use delay(clock=xclock,restart_wdt)*00FD: MOVLW 1100FE: SUBWF 3F,F00FF: BTFSS 03.00100: GOTO 10F0101: MOVLW 3F0102: MOVWF 040103: MOVLW FC0104: ANDWF 00,F0105: BCF 03.00106: RRF 00,F0107: RRF 00,F0108: MOVF 00,W0109: BTFSC 03.2010A: GOTO 10F010B: GOTO 10D010C: CLRWDT010D: DECFSZ 00,F010E: GOTO 10C010F: BCF 0A.30110: GOTO 2A8 (RETURN)*020D: MOVLW 3E020E: MOVWF 04020F: MOVF 00,W0210: BTFSC 03.20211: GOTO 2230212: MOVLW 010213: MOVWF 780214: MOVLW BF0215: MOVWF 770216: CLRWDT0217: DECFSZ 77,F0218: GOTO 2160219: DECFSZ 78,F021A: GOTO 214021B: MOVLW 58021C: MOVWF 77021D: DECFSZ 77,F021E: GOTO 21D021F: NOP0220: CLRWDT0221: DECFSZ 00,F0222: GOTO 2120223: RETLW 00.................... #fuses INTRC_IO, WDT, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD, NODEBUG, CCPB3................................................................................ #define BEEP0 PIN_A6 // pipak, prvni vystup.................... #define BEEP1 PIN_A7 // pipak, druhy vystup.................... #define PWM PIN_B3 // PWM vystup pro menic.................... #define REFPOWER PIN_B1 // napajeni zdroje Vref.................... #define MOTOR PIN_B2 // zapinani motoru.................... #define SW0 PIN_B7 // konfiguracni prepinac 0.................... #define SW1 PIN_B6 // konfiguracni prepinac 1............................................................ void InitRS232().................... // Inicializace HW RS232 (pro ladici vystupy).................... {.................... SPBRG=xclock/9600/16-1; // ryclost 9600Bd*00F1: MOVLW 1A00F2: BSF 03.500F3: MOVWF 19.................... RCSTA=0b10000000; // enable USART00F4: MOVLW 8000F5: BCF 03.500F6: MOVWF 18.................... TXSTA=0b00100100; // BRGH=1, TX enable00F7: MOVLW 2400F8: BSF 03.500F9: MOVWF 18.................... }00FA: BCF 03.500FB: BCF 0A.300FC: GOTO 28A (RETURN)............................................................ void Putc(char c).................... // Posilani znaku pres HW RS232.................... {.................... while(TRMT==0); // cekej na prazdny TX buffer*0111: BSF 03.50112: BTFSC 18.10113: GOTO 1160114: BCF 03.50115: GOTO 111.................... TXREG=c; // predej data0116: BCF 03.50117: MOVF 42,W0118: MOVWF 19.................... }0119: RETLW 00............................................................ // Globalni promenna pro data posilana na SSP.................... // Nastavuje se funkci MotorPatternSet().................... // Vyuziva se v prerusovaci rutine IntSSP().................... unsigned int8 MotorPattern; // aktualni data pro SSP jednotku............................................................ void MotorPatternSet(unsigned int Gear).................... // Na zaklade rychlostniho stupne nastavi MotorPattern pro SSP.................... // Rychlost 0 znamena stop, rychlost 8 je maximum.................... {.................... // Tabulka rychlost -> pattern pro SSP.................... unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};........................................ // Vyber patternu.................... if (Gear==0) // stav 0 znamena stop*00AA: MOVF 45,F00AB: BTFSS 03.200AC: GOTO 0B9.................... {.................... output_low(MOTOR); // klidovy stav00AD: BSF 03.500AE: BCF 06.200AF: BCF 03.500B0: BCF 06.2.................... SSPSTAT = 0;00B1: BSF 03.500B2: CLRF 14.................... SSPCON1 = 0; // SPI stop00B3: BCF 03.500B4: CLRF 14.................... disable_interrupts(INT_SSP); // neni preruseni od SSP00B5: BSF 03.500B6: BCF 0C.3.................... }.................... else // rizeny vykon00B7: GOTO 0D100B8: BCF 03.5.................... {.................... if (Gear>7) // stav 8 a vice znamena plny vykon00B9: MOVF 45,W00BA: SUBLW 0700BB: BTFSC 03.000BC: GOTO 0BF.................... {.................... Gear=8; // plny plyn00BD: MOVLW 0800BE: MOVWF 45.................... }........................................ MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP00BF: DECF 45,F00C0: MOVF 45,W00C1: CALL 03D00C2: MOVWF 7800C3: MOVWF 2A.................... output_low(MOTOR); // klidovy stav00C4: BSF 03.500C5: BCF 06.200C6: BCF 03.500C7: BCF 06.2.................... SSPSTAT = 0;00C8: BSF 03.500C9: CLRF 14.................... SSPCON1 = 0x22; // SPI OSC/6400CA: MOVLW 2200CB: BCF 03.500CC: MOVWF 14........................................ SSPBUF=MotorPattern; // prvni data pro vyslani00CD: MOVF 2A,W00CE: MOVWF 13.................... enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP00CF: BSF 03.500D0: BSF 0C.3.................... }.................... }00D1: BCF 03.500D2: RETLW 00............................................................ // Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP..................... #INT_SSP.................... void IntSSP().................... {.................... SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP*00A5: MOVF 2A,W00A6: MOVWF 13.................... }........................................00A7: BCF 0C.300A8: BCF 0A.300A9: GOTO 026.................... void MotorSet(unsigned int Gear)*0224: CLRF 290225: BTFSC 0B.70226: BSF 29.70227: BCF 0B.7.................... // Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim.................... // od SSP jednotky.................... // 0 stop.................... // 1-7 pocet 1/8 vykonu.................... // >7 plny vykon.................... {.................... // Nastav PWM pattern.................... MotorPatternSet(Gear); // nastav PWM pattern pro SSP0228: MOVF 3E,W0229: MOVWF 45022A: CALL 0AA022B: BTFSC 29.7022C: BSF 0B.7........................................ // Povol preruseni.................... enable_interrupts(GLOBAL); // povol preruseni022D: MOVLW C0022E: IORWF 0B,F.................... }022F: RETLW 00............................................................ void InitT0().................... // Inicializace casovace T0 (cca 1000x za sekundu).................... {.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4*018A: BSF 03.5018B: MOVF 01,W018C: ANDLW C0018D: IORLW 01018E: MOVWF 01.................... enable_interrupts(INT_RTCC); // generuj preruseni od T0018F: BCF 03.50190: BSF 0B.5.................... enable_interrupts(GLOBAL); // povol preruseni0191: MOVLW C00192: IORWF 0B,F.................... }0193: BCF 0A.30194: GOTO 2DD (RETURN)............................................................ // Globalni promenna pro mereni casu.................... // Nastavuje se procedurou TimeSet().................... // Testuje se funkci TimeIf().................... // Modifikuje se pri preruseni od casovace IntTo().................... unsigned int16 TimeTime;............................................................ void TimerSet(unsigned int16 Time).................... // Nastavi casovac na zadany pocet ms.................... // Test uplynuti casu se dela pomoci TimerIf().................... {.................... // Nastav hodnotu.................... disable_interrupts(INT_RTCC); // nesmi prijit preruseni*0230: BCF 0B.5.................... TimeTime=Time; // pri nastavovani hodnoty0231: MOVF 3F,W0232: MOVWF 2C0233: MOVF 3E,W0234: MOVWF 2B.................... enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu)0235: BSF 0B.5.................... }0236: RETLW 00............................................................ int1 TimerIf().................... // Vraci TRUE pokud casovac jiz dobehl.................... {.................... int1 Flag; // pomocna promenna........................................ // Otestuj casovac.................... disable_interrupts(INT_RTCC); // nesmi prijit preruseni0237: BCF 0B.5.................... Flag=(TimeTime==0); // behem testu promenne0238: MOVF 2B,F0239: BTFSS 03.2023A: GOTO 23E023B: MOVF 2C,F023C: BTFSC 03.2023D: GOTO 240023E: MOVLW 00023F: GOTO 2410240: MOVLW 010241: MOVWF 780242: BTFSC 78.00243: GOTO 2460244: BCF 3E.00245: GOTO 2470246: BSF 3E.0.................... enable_interrupts(INT_RTCC); // ted uz muze0247: BSF 0B.5........................................ // Navratova hodnota.................... return Flag; // TRUE znamena dobehl casovac0248: MOVLW 000249: BTFSC 3E.0024A: MOVLW 01024B: MOVWF 78.................... }024C: RETLW 00............................................................ // Globalni promenne pro akceleraci.................... // Nastavuje se metodou MotorStart().................... // Pouziva se v obsluze preruseni IntT0().................... unsigned int8 MotorTime; // aktualni casovac pro rozjezd.................... unsigned int8 MotorDelay; // spozdeni mezi razenim rychlosti.................... unsigned int8 MotorGear; // rychlostni stupen............................................................ void MotorStart(unsigned int8 Delay).................... // Provede rizeny rozjezd motoru.................... // Parametrem je prodleva mezi razenim rychlosti v ms.................... {.................... disable_interrupts(INT_RTCC);024D: BCF 0B.5.................... MotorGear=1;024E: MOVLW 01024F: MOVWF 2F.................... MotorDelay=Delay;0250: MOVF 3E,W0251: MOVWF 2E.................... MotorTime=MotorDelay;0252: MOVF 2E,W0253: MOVWF 2D.................... enable_interrupts(INT_RTCC);0254: BSF 0B.50255: CLRF 290256: BTFSC 0B.70257: BSF 29.70258: BCF 0B.7........................................ MotorPatternSet(1);0259: MOVLW 01025A: MOVWF 45025B: CALL 0AA025C: BTFSC 29.7025D: BSF 0B.7.................... }025E: RETLW 00............................................................ #INT_TIMER0.................... void IntT0().................... // Preruseni od casovace cca 1000x za sekundu.................... {.................... // Odpocitavani casovace.................... if (TimeTime) TimeTime--;*00D3: MOVF 2B,W00D4: IORWF 2C,W00D5: BTFSC 03.200D6: GOTO 0DB00D7: MOVF 2B,W00D8: BTFSC 03.200D9: DECF 2C,F00DA: DECF 2B,F........................................ // Obsluha akcelerace.................... if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu00DB: MOVF 2D,F00DC: BTFSS 03.200DD: DECF 2D,F.................... if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen00DE: MOVF 2F,F00DF: BTFSC 03.200E0: GOTO 0EE00E1: MOVF 2F,W00E2: SUBLW 0700E3: BTFSS 03.000E4: GOTO 0EE00E5: MOVF 2D,F00E6: BTFSS 03.200E7: GOTO 0EE.................... {.................... MotorTime=MotorDelay; // znovu nastav casovac00E8: MOVF 2E,W00E9: MOVWF 2D.................... MotorGear++; // dalsi rychlost00EA: INCF 2F,F.................... MotorPatternSet(MotorGear); // nastav rychlost00EB: MOVF 2F,W00EC: MOVWF 4500ED: CALL 0AA.................... }.................... }............................................................ // Cteni dat z AD prevodniku, zadava se cislo kanalu00EE: BCF 0B.200EF: BCF 0A.300F0: GOTO 026.................... int8 ReadAD(int8 Ch).................... {.................... // Pokud merim Vref zapnu si jeho napajeni.................... if (Ch==4) output_high(REFPOWER);*0195: MOVF 3E,W0196: SUBLW 040197: BTFSS 03.20198: GOTO 19D0199: BSF 03.5019A: BCF 06.1019B: BCF 03.5019C: BSF 06.1........................................ // Inicializace a cislo kanalu.................... ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify019D: MOVLW 30019E: BSF 03.5019F: MOVWF 1F.................... ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu01A0: BCF 03.501A1: RLF 3E,W01A2: MOVWF 7701A3: RLF 77,F01A4: RLF 77,F01A5: MOVLW F801A6: ANDWF 77,F01A7: MOVF 77,W01A8: ADDLW 4101A9: MOVWF 1F........................................ // Mereni.................... delay_us(50); // doba na prepnuti kanalu01AA: CLRWDT01AB: MOVLW 1001AC: MOVWF 7701AD: DECFSZ 77,F01AE: GOTO 1AD01AF: NOP01B0: NOP.................... ADCON0 |= 4; // start prevodu01B1: BSF 1F.2.................... delay_us(50); // doba na prevod01B2: CLRWDT01B3: MOVLW 1001B4: MOVWF 7701B5: DECFSZ 77,F01B6: GOTO 1B501B7: NOP01B8: NOP........................................ // Vypnu napajeni Vref (vzdycky).................... output_low(REFPOWER);01B9: BSF 03.501BA: BCF 06.101BB: BCF 03.501BC: BCF 06.1........................................ // Navrat hodnoty.................... return ADRESH;01BD: MOVF 1E,W01BE: MOVWF 78.................... }01BF: RETLW 00............................................................ void main().................... {*025F: CLRF 040260: MOVLW 1F0261: ANDWF 03,F0262: BSF 03.50263: BCF 1F.40264: BCF 1F.50265: MOVF 1B,W0266: ANDLW 800267: MOVWF 1B0268: MOVLW 070269: MOVWF 1C026A: MOVF 05,W026B: CLRWDT026C: MOVF 1C,W026D: BCF 03.5026E: BCF 0D.6.................... unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu).................... unsigned int8 i;........................................ // Hodiny.................... OSCCON = 0x62; // 4 MHz interni RC oscilator026F: MOVLW 620270: BSF 03.50271: MOVWF 0F........................................ // Digitalni vystupy.................... output_low(PWM); // PWM vystup0272: BCF 06.30273: BCF 03.50274: BCF 06.3.................... output_low(MOTOR); // Proud do motoru0275: BSF 03.50276: BCF 06.20277: BCF 03.50278: BCF 06.2.................... output_low(REFPOWER); // Napajeni Vref0279: BSF 03.5027A: BCF 06.1027B: BCF 03.5027C: BCF 06.1.................... port_b_pullups(TRUE); // Zbyvajici vyvody portu B027D: BSF 03.5027E: BCF 01.7........................................ // Watch Dog.................... PSA=0; // preddelic prirazen casovaci027F: BCF 01.3.................... WDTCON=0x0E; // Watch Dog cca 130ms0280: MOVLW 0E0281: BCF 03.50282: BSF 03.60283: MOVWF 05........................................ // Analogove vstupy.................... ANSEL = 0x1F; // AN0 az AN40284: MOVLW 1F0285: BSF 03.50286: BCF 03.60287: MOVWF 1B........................................ // nastaveni RS232.................... InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms)0288: BCF 03.50289: GOTO 0F1........................................ // Pipnuti (a cekani).................... for (i=1;i<30;i++) // pocet 1/2 period028A: MOVLW 01028B: MOVWF 31028C: MOVF 31,W028D: SUBLW 1D028E: BTFSS 03.0028F: GOTO 2AC.................... {.................... int1 beep; // stavova promenna pro pipak........................................ output_bit(BEEP0,beep);0290: BTFSC 32.00291: GOTO 2940292: BCF 05.60293: GOTO 2950294: BSF 05.60295: BSF 03.50296: BCF 05.6.................... beep=~beep;0297: MOVLW 010298: BCF 03.50299: XORWF 32,F.................... output_bit(BEEP1,beep);029A: BTFSC 32.0029B: GOTO 29E029C: BCF 05.7029D: GOTO 29F029E: BSF 05.7029F: BSF 03.502A0: BCF 05.7.................... delay_us(1000);02A1: CLRWDT02A2: MOVLW 0902A3: BCF 03.502A4: MOVWF 3E02A5: MOVLW 6C02A6: MOVWF 3F02A7: GOTO 0FD02A8: DECFSZ 3E,F02A9: GOTO 2A5.................... }02AA: INCF 31,F02AB: GOTO 28C........................................ // Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu).................... Debug=0;02AC: CLRF 30.................... if (~input(SW0)) Debug|=1; // precti bit 002AD: BSF 03.502AE: BSF 06.702AF: BCF 03.502B0: BTFSS 06.702B1: BSF 30.0.................... if (~input(SW1)) Debug|=2; // precti bit 102B2: BSF 03.502B3: BSF 06.602B4: BCF 03.502B5: BTFSS 06.602B6: BSF 30.1.................... output_low(SW0); // nastav L aby se snizila spotreba02B7: BSF 03.502B8: BCF 06.702B9: BCF 03.502BA: BCF 06.7.................... output_low(SW1); // na obou vstupech02BB: BSF 03.502BC: BCF 06.602BD: BCF 03.502BE: BCF 06.6........................................ // Zobrazeni rezimu (na ladici seriovy vystup).................... printf(Putc,"\fMode:%d",Debug);02BF: CLRF 3E02C0: MOVF 3E,W02C1: CALL 04902C2: INCF 3E,F02C3: MOVWF 7702C4: MOVWF 4202C5: CALL 11102C6: MOVLW 0602C7: SUBWF 3E,W02C8: BTFSS 03.202C9: GOTO 2C002CA: MOVF 30,W02CB: MOVWF 3F02CC: MOVLW 1802CD: MOVWF 4002CE: GOTO 12F........................................ // Inicializace PWM.................... PR2 = 0x1F; // perioda PWM casovace02CF: MOVLW 1F02D0: BSF 03.502D1: MOVWF 12.................... T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu02D2: MOVLW 0402D3: BCF 03.502D4: MOVWF 12.................... CCP1CON = 0x0C; // PWM mode, lsb bity nulove02D5: MOVLW 0C02D6: MOVWF 17.................... CCPR1L = 0; // na zacatku nulova data02D7: CLRF 15.................... output_low(PWM); // PWM vystup02D8: BSF 03.502D9: BCF 06.302DA: BCF 03.502DB: BCF 06.3........................................ // Inicializace casovace.................... InitT0(); // nastav casovac na cca 1ms02DC: GOTO 18A........................................ // ALG=1 Test menice PWM a rozjezdoveho PWM.................... // ========================================.................... // P1 nastavuje primo stridu hlavniho PWM menice.................... // P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8).................... // Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu.................... if (Debug==1)02DD: DECFSZ 30,W02DE: GOTO 318.................... {.................... unsigned int8 Data1; // poteniometr P1 = PWM.................... unsigned int8 Data2; // poteniometr P2 = Rozjezd........................................ while (1).................... {.................... // watch dog.................... restart_wdt();02DF: CLRWDT........................................ // mereni vstupu.................... Data1=ReadAD(0); // nacti parametr pro PWM02E0: CLRF 3E02E1: CALL 19502E2: MOVF 78,W02E3: MOVWF 33.................... Data1>>=2; // redukuj rozsah na 0 az 6302E4: RRF 33,F02E5: RRF 33,F02E6: MOVLW 3F02E7: ANDWF 33,F.................... Data2=ReadAD(1); // nacti parametr pro rozjezd02E8: MOVLW 0102E9: MOVWF 3E02EA: CALL 19502EB: MOVF 78,W02EC: MOVWF 34.................... Data2>>=4; // redukuj rozsah na 0 az 1502ED: SWAPF 34,F02EE: MOVLW 0F02EF: ANDWF 34,F........................................ // zobrazeni.................... printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2);02F0: CLRF 3E02F1: MOVF 3E,W02F2: CALL 05602F3: INCF 3E,F02F4: MOVWF 7702F5: MOVWF 4202F6: CALL 11102F7: MOVLW 0502F8: SUBWF 3E,W02F9: BTFSS 03.202FA: GOTO 2F102FB: MOVF 33,W02FC: MOVWF 4002FD: CLRF 4102FE: CALL 1C002FF: MOVLW 090300: MOVWF 3F0301: MOVF 3F,W0302: CALL 0560303: INCF 3F,F0304: MOVWF 770305: MOVWF 420306: CALL 1110307: MOVLW 0E0308: SUBWF 3F,W0309: BTFSS 03.2030A: GOTO 301030B: MOVF 34,W030C: MOVWF 40030D: CLRF 41030E: CALL 1C0.................... delay_ms(20);030F: MOVLW 140310: MOVWF 3E0311: CALL 20D........................................ // nastaveni parametru PWM.................... CCPR1L = Data1;0312: MOVF 33,W0313: MOVWF 15........................................ // nastaveni parametru RUN.................... MotorSet(Data2);0314: MOVF 34,W0315: MOVWF 3E0316: CALL 224.................... }0317: GOTO 2DF.................... }........................................ // ALG=2 Testovani rozjezdu.................... // ========================.................... // P2 nastavuje cas mezi stupni razeni pro rozjezd v ms.................... // Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor.................... if (Debug==2)0318: MOVF 30,W0319: SUBLW 02031A: BTFSS 03.2031B: GOTO 369.................... {.................... int8 Data;.................... int8 Start;........................................ Start=0; // uvodni stav031C: CLRF 36.................... while(1).................... {.................... // Nacti a zobraz parametr.................... Data=ReadAD(1); // potenciometr P2 = rozjezd031D: MOVLW 01031E: MOVWF 3E031F: CALL 1950320: MOVF 78,W0321: MOVWF 35.................... printf(Putc,"\nRUN:%3ums ",Data); // zobraz0322: CLRF 3E0323: MOVF 3E,W0324: CALL 06D0325: INCF 3E,F0326: MOVWF 770327: MOVWF 420328: CALL 1110329: MOVLW 05032A: SUBWF 3E,W032B: BTFSS 03.2032C: GOTO 323032D: MOVF 35,W032E: MOVWF 40032F: MOVLW 100330: MOVWF 410331: CALL 1C00332: MOVLW 6D0333: MOVWF 420334: CALL 1110335: MOVLW 730336: MOVWF 420337: CALL 1110338: MOVLW 200339: MOVWF 42033A: CALL 111.................... delay_ms(10); // prodleva pro terminal033B: MOVLW 0A033C: MOVWF 3E033D: CALL 20D........................................ // Uvodni pauza.................... if (Start==0) // spousti se 1x na zacatku033E: MOVF 36,F033F: BTFSS 03.20340: GOTO 347.................... {.................... Start++; // dalsi stav je cekani0341: INCF 36,F.................... TimerSet(2000); // na dokonceni uvodni prodlevy0342: MOVLW 070343: MOVWF 3F0344: MOVLW D00345: MOVWF 3E0346: CALL 230.................... }........................................ // Rozjezd.................... if ((Start==1) && TimerIf())0347: DECFSZ 36,W0348: GOTO 3590349: CALL 237034A: MOVF 78,F034B: BTFSC 03.2034C: GOTO 359.................... {.................... Start++;034D: INCF 36,F.................... printf(Putc,"R");034E: MOVLW 52034F: MOVWF 420350: CALL 111.................... MotorStart(Data); // rozjezd s nastavenim prodlevy0351: MOVF 35,W0352: MOVWF 3E0353: CALL 24D........................................ TimerSet(2000); // nastav celkovy cas jizdy0354: MOVLW 070355: MOVWF 3F0356: MOVLW D00357: MOVWF 3E0358: CALL 230.................... }........................................ // Zastaveni.................... if ((Start==2) && TimerIf())0359: MOVF 36,W035A: SUBLW 02035B: BTFSS 03.2035C: GOTO 367035D: CALL 237035E: MOVF 78,F035F: BTFSC 03.20360: GOTO 367.................... {.................... Start++;0361: INCF 36,F.................... printf(Putc,"S");0362: MOVLW 530363: MOVWF 420364: CALL 111.................... MotorSet(0); // pokud dobehl casovac zastav motor0365: CLRF 3E0366: CALL 224.................... }........................................ // watch dog.................... restart_wdt();0367: CLRWDT.................... }0368: GOTO 31D.................... }........................................ // ALG=3 Test nabijeciho algoritmu.................... // ===============================.................... // P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni).................... // Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny.................... // algoritmus jako pro standardni jizdu.................... if (Debug==3)0369: MOVF 30,W036A: SUBLW 03036B: BTFSS 03.2036C: GOTO 3C0.................... {.................... unsigned int8 PwmOut; // akcni hodnota pro PWM.................... unsigned int8 Req; // pozadovana hodnota z P1.................... unsigned int8 Vref; // merena hodnota vref........................................ // Inicializace stavove promenne.................... PwmOut=0;036D: CLRF 37........................................ // Hlavni smycka.................... while (1).................... {.................... // watch dog.................... restart_wdt();036E: CLRWDT........................................ // pozadovana hodnota (potenciometr P1).................... Req=ReadAD(0);036F: CLRF 3E0370: CALL 1950371: MOVF 78,W0372: MOVWF 38.................... Req=50+(ReadAD(0)>>1); // 50 az 1770373: CLRF 3E0374: CALL 1950375: BCF 03.00376: RRF 78,W0377: ADDLW 320378: MOVWF 38........................................ // napeti na napajeni (vref).................... Vref=ReadAD(4);0379: MOVLW 04037A: MOVWF 3E037B: CALL 195037C: MOVF 78,W037D: MOVWF 39........................................ // ricici algoritmus.................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;037E: MOVF 38,W037F: SUBWF 39,W0380: BTFSC 03.00381: GOTO 3860382: MOVF 37,W0383: SUBLW 1D0384: BTFSC 03.00385: INCF 37,F.................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;0386: MOVF 38,W0387: SUBWF 39,W0388: BTFSS 03.00389: GOTO 38D038A: MOVF 37,F038B: BTFSS 03.2038C: DECF 37,F.................... Vref+=10;038D: MOVLW 0A038E: ADDWF 39,F.................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu038F: MOVF 38,W0390: SUBWF 39,W0391: BTFSC 03.00392: GOTO 3970393: MOVF 37,W0394: SUBLW 1D0395: BTFSC 03.00396: INCF 37,F........................................ // nastaveni parametru PWM.................... if (PwmOut>24) PwmOut=24; // saturace0397: MOVF 37,W0398: SUBLW 180399: BTFSC 03.0039A: GOTO 39D039B: MOVLW 18039C: MOVWF 37.................... CCPR1L = PwmOut; // pouziti vystupu039D: MOVF 37,W039E: MOVWF 15........................................ // zobrazeni.................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);039F: CLRF 3E03A0: MOVF 3E,W03A1: CALL 07D03A2: INCF 3E,F03A3: MOVWF 7703A4: MOVWF 4203A5: CALL 11103A6: MOVLW 0503A7: SUBWF 3E,W03A8: BTFSS 03.203A9: GOTO 3A003AA: MOVF 38,W03AB: MOVWF 4003AC: CLRF 4103AD: CALL 1C003AE: MOVLW 2003AF: MOVWF 4203B0: CALL 11103B1: MOVF 39,W03B2: MOVWF 4003B3: CLRF 4103B4: CALL 1C003B5: MOVLW 2003B6: MOVWF 4203B7: CALL 11103B8: MOVF 37,W03B9: MOVWF 4003BA: CLRF 4103BB: CALL 1C0.................... delay_ms(10);03BC: MOVLW 0A03BD: MOVWF 3E03BE: CALL 20D.................... }03BF: GOTO 36E.................... }........................................ // ALG=0 Standardni jizda.................... // ======================.................... // P1 nastavuje pozadovane napeti na clancich.................... // P2 nastavuje prodlevu razeni pri rozjezdu, nacita se jen 1x na zacatku.................... // Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede.................... // rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku..................... // Parametry P1 a P2 jsou chapany stejne jako v algoritmech 2 a 3..................... if (Debug==0)03C0: MOVF 30,F03C1: BTFSS 03.203C2: GOTO 447.................... {.................... unsigned int8 PwmOut; // akcni hodnota pro PWM.................... unsigned int8 Req; // pozadovana hodnota z P1.................... unsigned int8 Vref; // merena hodnota vref.................... int8 Delay; // pozadovana honota prodlevy razeni z P2.................... int1 Run;........................................ // Nacti parametr rozjezdu.................... Delay=ReadAD(1); // potenciometr P2 = rozjezd03C3: MOVLW 0103C4: MOVWF 3E03C5: CALL 19503C6: MOVF 78,W03C7: MOVWF 3D.................... printf(Putc," RUN:%3ums ",Delay); // zobraz03C8: CLRF 3E03C9: MOVF 3E,W03CA: CALL 09503CB: INCF 3E,F03CC: MOVWF 7703CD: MOVWF 4203CE: CALL 11103CF: MOVLW 0503D0: SUBWF 3E,W03D1: BTFSS 03.203D2: GOTO 3C903D3: MOVF 3D,W03D4: MOVWF 4003D5: MOVLW 1003D6: MOVWF 4103D7: CALL 1C003D8: MOVLW 6D03D9: MOVWF 4203DA: CALL 11103DB: MOVLW 7303DC: MOVWF 4203DD: CALL 11103DE: MOVLW 2003DF: MOVWF 4203E0: CALL 111.................... delay_ms(10); // prodleva pro terminal03E1: MOVLW 0A03E2: MOVWF 3E03E3: CALL 20D........................................ // Inicializace stavove promenne.................... PwmOut=0;03E4: CLRF 3A.................... TimerSet(14000); // casovani startu03E5: MOVLW 3603E6: MOVWF 3F03E7: MOVLW B003E8: MOVWF 3E03E9: CALL 230.................... Run=1;03EA: BSF 32.1........................................ // Hlavni smycka.................... while (1).................... {.................... // watch dog.................... restart_wdt();03EB: CLRWDT........................................ // pozadovana hodnota (potenciometr P1).................... Req=ReadAD(0);03EC: CLRF 3E03ED: CALL 19503EE: MOVF 78,W03EF: MOVWF 3B.................... Req=50+(ReadAD(0)>>1); // 50 az 17703F0: CLRF 3E03F1: CALL 19503F2: BCF 03.003F3: RRF 78,W03F4: ADDLW 3203F5: MOVWF 3B........................................ // napeti na napajeni (vref).................... Vref=ReadAD(4);03F6: MOVLW 0403F7: MOVWF 3E03F8: CALL 19503F9: MOVF 78,W03FA: MOVWF 3C........................................ // ricici algoritmus.................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;03FB: MOVF 3B,W03FC: SUBWF 3C,W03FD: BTFSC 03.003FE: GOTO 40303FF: MOVF 3A,W0400: SUBLW 1D0401: BTFSC 03.00402: INCF 3A,F.................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;0403: MOVF 3B,W0404: SUBWF 3C,W0405: BTFSS 03.00406: GOTO 40A0407: MOVF 3A,F0408: BTFSS 03.20409: DECF 3A,F.................... Vref+=10;040A: MOVLW 0A040B: ADDWF 3C,F.................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu040C: MOVF 3B,W040D: SUBWF 3C,W040E: BTFSC 03.0040F: GOTO 4140410: MOVF 3A,W0411: SUBLW 1D0412: BTFSC 03.00413: INCF 3A,F........................................ // nastaveni parametru PWM.................... if (PwmOut>24) PwmOut=24; // saturace0414: MOVF 3A,W0415: SUBLW 180416: BTFSC 03.00417: GOTO 41A0418: MOVLW 180419: MOVWF 3A.................... CCPR1L = PwmOut; // pouziti vystupu041A: MOVF 3A,W041B: MOVWF 15........................................ // zobrazeni.................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);041C: CLRF 3E041D: MOVF 3E,W041E: CALL 07D041F: INCF 3E,F0420: MOVWF 770421: MOVWF 420422: CALL 1110423: MOVLW 050424: SUBWF 3E,W0425: BTFSS 03.20426: GOTO 41D0427: MOVF 3B,W0428: MOVWF 400429: CLRF 41042A: CALL 1C0042B: MOVLW 20042C: MOVWF 42042D: CALL 111042E: MOVF 3C,W042F: MOVWF 400430: CLRF 410431: CALL 1C00432: MOVLW 200433: MOVWF 420434: CALL 1110435: MOVF 3A,W0436: MOVWF 400437: CLRF 410438: CALL 1C0.................... delay_ms(10);0439: MOVLW 0A043A: MOVWF 3E043B: CALL 20D........................................ // rozjezd.................... if (TimerIf()&&Run)043C: CALL 237043D: MOVF 78,F043E: BTFSC 03.2043F: GOTO 4460440: BTFSS 32.10441: GOTO 446.................... {.................... Run=0;0442: BCF 32.1.................... MotorStart(Delay); // prodleva razeni z P20443: MOVF 3D,W0444: MOVWF 3E0445: CALL 24D.................... }.................... }0446: GOTO 3EB.................... }.................... }....................0447: SLEEPConfiguration Fuses:Word 1: 2F3C WDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB3 NOPROTECT INTRC_IOWord 2: 3FFF FCMEN IESO