CCS PCM C Compiler, Version 3.221, 27853 18-IX-05 10:59Filename: D:\MLAB\_Z\DART01B\SW\1_02\DART.LSTROM used: 1098 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.02.................... // (c)miho 2005.................... //.................... // 1.00 Uvodni verze.................... // 1.01 Doplneno nasatvovani parametru rozjezdu P2 u standardniho algoritmu.................... // 1.02 Doplnena deaktivace vyvodu pro LED (LED tato verze programu nepouziva)........................................ #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 2AA (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.................... #define LED PIN_B4 // dioda LED v elektornice DART01B............................................................ 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 28C (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 2DF (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 1C,W026B: BCF 03.5026C: BCF 0D.6.................... unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu).................... unsigned int8 i;........................................ // Hodiny.................... OSCCON = 0x62; // 4 MHz interni RC oscilator026D: MOVLW 62026E: BSF 03.5026F: MOVWF 0F........................................ // Digitalni vystupy.................... output_low(PWM); // PWM vystup0270: BCF 06.30271: BCF 03.50272: BCF 06.3.................... output_low(MOTOR); // Proud do motoru0273: BSF 03.50274: BCF 06.20275: BCF 03.50276: BCF 06.2.................... output_low(REFPOWER); // Napajeni Vref0277: BSF 03.50278: BCF 06.10279: BCF 03.5027A: BCF 06.1.................... output_low(LED); // LED dioda nesviti027B: BSF 03.5027C: BCF 06.4027D: BCF 03.5027E: BCF 06.4.................... port_b_pullups(TRUE); // Zbyvajici vyvody portu B027F: BSF 03.50280: BCF 01.7........................................ // Watch Dog.................... PSA=0; // preddelic prirazen casovaci0281: BCF 01.3.................... WDTCON=0x0E; // Watch Dog cca 130ms0282: MOVLW 0E0283: BCF 03.50284: BSF 03.60285: MOVWF 05........................................ // Analogove vstupy.................... ANSEL = 0x1F; // AN0 az AN40286: MOVLW 1F0287: BSF 03.50288: BCF 03.60289: MOVWF 1B........................................ // nastaveni RS232.................... InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms)028A: BCF 03.5028B: GOTO 0F1........................................ // Pipnuti (a cekani).................... for (i=1;i<30;i++) // pocet 1/2 period028C: MOVLW 01028D: MOVWF 31028E: MOVF 31,W028F: SUBLW 1D0290: BTFSS 03.00291: GOTO 2AE.................... {.................... int1 beep; // stavova promenna pro pipak........................................ output_bit(BEEP0,beep);0292: BTFSC 32.00293: GOTO 2960294: BCF 05.60295: GOTO 2970296: BSF 05.60297: BSF 03.50298: BCF 05.6.................... beep=~beep;0299: MOVLW 01029A: BCF 03.5029B: XORWF 32,F.................... output_bit(BEEP1,beep);029C: BTFSC 32.0029D: GOTO 2A0029E: BCF 05.7029F: GOTO 2A102A0: BSF 05.702A1: BSF 03.502A2: BCF 05.7.................... delay_us(1000);02A3: CLRWDT02A4: MOVLW 0902A5: BCF 03.502A6: MOVWF 3E02A7: MOVLW 6C02A8: MOVWF 3F02A9: GOTO 0FD02AA: DECFSZ 3E,F02AB: GOTO 2A7.................... }02AC: INCF 31,F02AD: GOTO 28E........................................ // Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu).................... Debug=0;02AE: CLRF 30.................... if (~input(SW0)) Debug|=1; // precti bit 002AF: BSF 03.502B0: BSF 06.702B1: BCF 03.502B2: BTFSS 06.702B3: BSF 30.0.................... if (~input(SW1)) Debug|=2; // precti bit 102B4: BSF 03.502B5: BSF 06.602B6: BCF 03.502B7: BTFSS 06.602B8: BSF 30.1.................... output_low(SW0); // nastav L aby se snizila spotreba02B9: BSF 03.502BA: BCF 06.702BB: BCF 03.502BC: BCF 06.7.................... output_low(SW1); // na obou vstupech02BD: BSF 03.502BE: BCF 06.602BF: BCF 03.502C0: BCF 06.6........................................ // Zobrazeni rezimu (na ladici seriovy vystup).................... printf(Putc,"\fMode:%d",Debug);02C1: CLRF 3E02C2: MOVF 3E,W02C3: CALL 04902C4: INCF 3E,F02C5: MOVWF 7702C6: MOVWF 4202C7: CALL 11102C8: MOVLW 0602C9: SUBWF 3E,W02CA: BTFSS 03.202CB: GOTO 2C202CC: MOVF 30,W02CD: MOVWF 3F02CE: MOVLW 1802CF: MOVWF 4002D0: GOTO 12F........................................ // Inicializace PWM.................... PR2 = 0x1F; // perioda PWM casovace02D1: MOVLW 1F02D2: BSF 03.502D3: MOVWF 12.................... T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu02D4: MOVLW 0402D5: BCF 03.502D6: MOVWF 12.................... CCP1CON = 0x0C; // PWM mode, lsb bity nulove02D7: MOVLW 0C02D8: MOVWF 17.................... CCPR1L = 0; // na zacatku nulova data02D9: CLRF 15.................... output_low(PWM); // PWM vystup02DA: BSF 03.502DB: BCF 06.302DC: BCF 03.502DD: BCF 06.3........................................ // Inicializace casovace.................... InitT0(); // nastav casovac na cca 1ms02DE: 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)02DF: DECFSZ 30,W02E0: GOTO 31A.................... {.................... unsigned int8 Data1; // poteniometr P1 = PWM.................... unsigned int8 Data2; // poteniometr P2 = Rozjezd........................................ while (1).................... {.................... // watch dog.................... restart_wdt();02E1: CLRWDT........................................ // mereni vstupu.................... Data1=ReadAD(0); // nacti parametr pro PWM02E2: CLRF 3E02E3: CALL 19502E4: MOVF 78,W02E5: MOVWF 33.................... Data1>>=2; // redukuj rozsah na 0 az 6302E6: RRF 33,F02E7: RRF 33,F02E8: MOVLW 3F02E9: ANDWF 33,F.................... Data2=ReadAD(1); // nacti parametr pro rozjezd02EA: MOVLW 0102EB: MOVWF 3E02EC: CALL 19502ED: MOVF 78,W02EE: MOVWF 34.................... Data2>>=4; // redukuj rozsah na 0 az 1502EF: SWAPF 34,F02F0: MOVLW 0F02F1: ANDWF 34,F........................................ // zobrazeni.................... printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2);02F2: CLRF 3E02F3: MOVF 3E,W02F4: CALL 05602F5: INCF 3E,F02F6: MOVWF 7702F7: MOVWF 4202F8: CALL 11102F9: MOVLW 0502FA: SUBWF 3E,W02FB: BTFSS 03.202FC: GOTO 2F302FD: MOVF 33,W02FE: MOVWF 4002FF: CLRF 410300: CALL 1C00301: MOVLW 090302: MOVWF 3F0303: MOVF 3F,W0304: CALL 0560305: INCF 3F,F0306: MOVWF 770307: MOVWF 420308: CALL 1110309: MOVLW 0E030A: SUBWF 3F,W030B: BTFSS 03.2030C: GOTO 303030D: MOVF 34,W030E: MOVWF 40030F: CLRF 410310: CALL 1C0.................... delay_ms(20);0311: MOVLW 140312: MOVWF 3E0313: CALL 20D........................................ // nastaveni parametru PWM.................... CCPR1L = Data1;0314: MOVF 33,W0315: MOVWF 15........................................ // nastaveni parametru RUN.................... MotorSet(Data2);0316: MOVF 34,W0317: MOVWF 3E0318: CALL 224.................... }0319: GOTO 2E1.................... }........................................ // 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)031A: MOVF 30,W031B: SUBLW 02031C: BTFSS 03.2031D: GOTO 36B.................... {.................... int8 Data;.................... int8 Start;........................................ Start=0; // uvodni stav031E: CLRF 36.................... while(1).................... {.................... // Nacti a zobraz parametr.................... Data=ReadAD(1); // potenciometr P2 = rozjezd031F: MOVLW 010320: MOVWF 3E0321: CALL 1950322: MOVF 78,W0323: MOVWF 35.................... printf(Putc,"\nRUN:%3ums ",Data); // zobraz0324: CLRF 3E0325: MOVF 3E,W0326: CALL 06D0327: INCF 3E,F0328: MOVWF 770329: MOVWF 42032A: CALL 111032B: MOVLW 05032C: SUBWF 3E,W032D: BTFSS 03.2032E: GOTO 325032F: MOVF 35,W0330: MOVWF 400331: MOVLW 100332: MOVWF 410333: CALL 1C00334: MOVLW 6D0335: MOVWF 420336: CALL 1110337: MOVLW 730338: MOVWF 420339: CALL 111033A: MOVLW 20033B: MOVWF 42033C: CALL 111.................... delay_ms(10); // prodleva pro terminal033D: MOVLW 0A033E: MOVWF 3E033F: CALL 20D........................................ // Uvodni pauza.................... if (Start==0) // spousti se 1x na zacatku0340: MOVF 36,F0341: BTFSS 03.20342: GOTO 349.................... {.................... Start++; // dalsi stav je cekani0343: INCF 36,F.................... TimerSet(2000); // na dokonceni uvodni prodlevy0344: MOVLW 070345: MOVWF 3F0346: MOVLW D00347: MOVWF 3E0348: CALL 230.................... }........................................ // Rozjezd.................... if ((Start==1) && TimerIf())0349: DECFSZ 36,W034A: GOTO 35B034B: CALL 237034C: MOVF 78,F034D: BTFSC 03.2034E: GOTO 35B.................... {.................... Start++;034F: INCF 36,F.................... printf(Putc,"R");0350: MOVLW 520351: MOVWF 420352: CALL 111.................... MotorStart(Data); // rozjezd s nastavenim prodlevy0353: MOVF 35,W0354: MOVWF 3E0355: CALL 24D........................................ TimerSet(2000); // nastav celkovy cas jizdy0356: MOVLW 070357: MOVWF 3F0358: MOVLW D00359: MOVWF 3E035A: CALL 230.................... }........................................ // Zastaveni.................... if ((Start==2) && TimerIf())035B: MOVF 36,W035C: SUBLW 02035D: BTFSS 03.2035E: GOTO 369035F: CALL 2370360: MOVF 78,F0361: BTFSC 03.20362: GOTO 369.................... {.................... Start++;0363: INCF 36,F.................... printf(Putc,"S");0364: MOVLW 530365: MOVWF 420366: CALL 111.................... MotorSet(0); // pokud dobehl casovac zastav motor0367: CLRF 3E0368: CALL 224.................... }........................................ // watch dog.................... restart_wdt();0369: CLRWDT.................... }036A: GOTO 31F.................... }........................................ // 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)036B: MOVF 30,W036C: SUBLW 03036D: BTFSS 03.2036E: GOTO 3C2.................... {.................... 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;036F: CLRF 37........................................ // Hlavni smycka.................... while (1).................... {.................... // watch dog.................... restart_wdt();0370: CLRWDT........................................ // pozadovana hodnota (potenciometr P1).................... Req=ReadAD(0);0371: CLRF 3E0372: CALL 1950373: MOVF 78,W0374: MOVWF 38.................... Req=50+(ReadAD(0)>>1); // 50 az 1770375: CLRF 3E0376: CALL 1950377: BCF 03.00378: RRF 78,W0379: ADDLW 32037A: MOVWF 38........................................ // napeti na napajeni (vref).................... Vref=ReadAD(4);037B: MOVLW 04037C: MOVWF 3E037D: CALL 195037E: MOVF 78,W037F: MOVWF 39........................................ // ricici algoritmus.................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;0380: MOVF 38,W0381: SUBWF 39,W0382: BTFSC 03.00383: GOTO 3880384: MOVF 37,W0385: SUBLW 1D0386: BTFSC 03.00387: INCF 37,F.................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;0388: MOVF 38,W0389: SUBWF 39,W038A: BTFSS 03.0038B: GOTO 38F038C: MOVF 37,F038D: BTFSS 03.2038E: DECF 37,F.................... Vref+=10;038F: MOVLW 0A0390: ADDWF 39,F.................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu0391: MOVF 38,W0392: SUBWF 39,W0393: BTFSC 03.00394: GOTO 3990395: MOVF 37,W0396: SUBLW 1D0397: BTFSC 03.00398: INCF 37,F........................................ // nastaveni parametru PWM.................... if (PwmOut>24) PwmOut=24; // saturace0399: MOVF 37,W039A: SUBLW 18039B: BTFSC 03.0039C: GOTO 39F039D: MOVLW 18039E: MOVWF 37.................... CCPR1L = PwmOut; // pouziti vystupu039F: MOVF 37,W03A0: MOVWF 15........................................ // zobrazeni.................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);03A1: CLRF 3E03A2: MOVF 3E,W03A3: CALL 07D03A4: INCF 3E,F03A5: MOVWF 7703A6: MOVWF 4203A7: CALL 11103A8: MOVLW 0503A9: SUBWF 3E,W03AA: BTFSS 03.203AB: GOTO 3A203AC: MOVF 38,W03AD: MOVWF 4003AE: CLRF 4103AF: CALL 1C003B0: MOVLW 2003B1: MOVWF 4203B2: CALL 11103B3: MOVF 39,W03B4: MOVWF 4003B5: CLRF 4103B6: CALL 1C003B7: MOVLW 2003B8: MOVWF 4203B9: CALL 11103BA: MOVF 37,W03BB: MOVWF 4003BC: CLRF 4103BD: CALL 1C0.................... delay_ms(10);03BE: MOVLW 0A03BF: MOVWF 3E03C0: CALL 20D.................... }03C1: GOTO 370.................... }........................................ // 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)03C2: MOVF 30,F03C3: BTFSS 03.203C4: GOTO 449.................... {.................... 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 = rozjezd03C5: MOVLW 0103C6: MOVWF 3E03C7: CALL 19503C8: MOVF 78,W03C9: MOVWF 3D.................... printf(Putc," RUN:%3ums ",Delay); // zobraz03CA: CLRF 3E03CB: MOVF 3E,W03CC: CALL 09503CD: INCF 3E,F03CE: MOVWF 7703CF: MOVWF 4203D0: CALL 11103D1: MOVLW 0503D2: SUBWF 3E,W03D3: BTFSS 03.203D4: GOTO 3CB03D5: MOVF 3D,W03D6: MOVWF 4003D7: MOVLW 1003D8: MOVWF 4103D9: CALL 1C003DA: MOVLW 6D03DB: MOVWF 4203DC: CALL 11103DD: MOVLW 7303DE: MOVWF 4203DF: CALL 11103E0: MOVLW 2003E1: MOVWF 4203E2: CALL 111.................... delay_ms(10); // prodleva pro terminal03E3: MOVLW 0A03E4: MOVWF 3E03E5: CALL 20D........................................ // Inicializace stavove promenne.................... PwmOut=0;03E6: CLRF 3A.................... TimerSet(14000); // casovani startu03E7: MOVLW 3603E8: MOVWF 3F03E9: MOVLW B003EA: MOVWF 3E03EB: CALL 230.................... Run=1;03EC: BSF 32.1........................................ // Hlavni smycka.................... while (1).................... {.................... // watch dog.................... restart_wdt();03ED: CLRWDT........................................ // pozadovana hodnota (potenciometr P1).................... Req=ReadAD(0);03EE: CLRF 3E03EF: CALL 19503F0: MOVF 78,W03F1: MOVWF 3B.................... Req=50+(ReadAD(0)>>1); // 50 az 17703F2: CLRF 3E03F3: CALL 19503F4: BCF 03.003F5: RRF 78,W03F6: ADDLW 3203F7: MOVWF 3B........................................ // napeti na napajeni (vref).................... Vref=ReadAD(4);03F8: MOVLW 0403F9: MOVWF 3E03FA: CALL 19503FB: MOVF 78,W03FC: MOVWF 3C........................................ // ricici algoritmus.................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;03FD: MOVF 3B,W03FE: SUBWF 3C,W03FF: BTFSC 03.00400: GOTO 4050401: MOVF 3A,W0402: SUBLW 1D0403: BTFSC 03.00404: INCF 3A,F.................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;0405: MOVF 3B,W0406: SUBWF 3C,W0407: BTFSS 03.00408: GOTO 40C0409: MOVF 3A,F040A: BTFSS 03.2040B: DECF 3A,F.................... Vref+=10;040C: MOVLW 0A040D: ADDWF 3C,F.................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu040E: MOVF 3B,W040F: SUBWF 3C,W0410: BTFSC 03.00411: GOTO 4160412: MOVF 3A,W0413: SUBLW 1D0414: BTFSC 03.00415: INCF 3A,F........................................ // nastaveni parametru PWM.................... if (PwmOut>24) PwmOut=24; // saturace0416: MOVF 3A,W0417: SUBLW 180418: BTFSC 03.00419: GOTO 41C041A: MOVLW 18041B: MOVWF 3A.................... CCPR1L = PwmOut; // pouziti vystupu041C: MOVF 3A,W041D: MOVWF 15........................................ // zobrazeni.................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);041E: CLRF 3E041F: MOVF 3E,W0420: CALL 07D0421: INCF 3E,F0422: MOVWF 770423: MOVWF 420424: CALL 1110425: MOVLW 050426: SUBWF 3E,W0427: BTFSS 03.20428: GOTO 41F0429: MOVF 3B,W042A: MOVWF 40042B: CLRF 41042C: CALL 1C0042D: MOVLW 20042E: MOVWF 42042F: CALL 1110430: MOVF 3C,W0431: MOVWF 400432: CLRF 410433: CALL 1C00434: MOVLW 200435: MOVWF 420436: CALL 1110437: MOVF 3A,W0438: MOVWF 400439: CLRF 41043A: CALL 1C0.................... delay_ms(10);043B: MOVLW 0A043C: MOVWF 3E043D: CALL 20D........................................ // rozjezd.................... if (TimerIf()&&Run)043E: CALL 237043F: MOVF 78,F0440: BTFSC 03.20441: GOTO 4480442: BTFSS 32.10443: GOTO 448.................... {.................... Run=0;0444: BCF 32.1.................... MotorStart(Delay); // prodleva razeni z P20445: MOVF 3D,W0446: MOVWF 3E0447: CALL 24D.................... }.................... }0448: GOTO 3ED.................... }.................... }....................0449: SLEEPConfiguration Fuses:Word 1: 2F3C WDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB3 NOPROTECT INTRC_IOWord 2: 3FFF FCMEN IESO