Rev Author Line No. Line
193 miho 1 CCS PCM C Compiler, Version 3.221, 27853 18-IX-05 10:59
2  
3 Filename: D:\MLAB\_Z\DART01B\SW\1_02\DART.LST
4  
5 ROM used: 1098 words (27%)
6 Largest free fragment is 2048
7 RAM used: 25 (14%) at main() level
8 43 (25%) worst case
9 Stack: 6 worst case (3 in main + 3 for interrupts)
10  
11 *
12 0000: MOVLW 00
13 0001: MOVWF 0A
14 0002: GOTO 25F
15 0003: NOP
16 0004: MOVWF 7F
17 0005: SWAPF 03,W
18 0006: CLRF 03
19 0007: MOVWF 21
20 0008: MOVF 7F,W
21 0009: MOVWF 20
22 000A: MOVF 0A,W
23 000B: MOVWF 28
24 000C: CLRF 0A
25 000D: SWAPF 20,F
26 000E: MOVF 04,W
27 000F: MOVWF 22
28 0010: MOVF 77,W
29 0011: MOVWF 23
30 0012: MOVF 78,W
31 0013: MOVWF 24
32 0014: MOVF 79,W
33 0015: MOVWF 25
34 0016: MOVF 7A,W
35 0017: MOVWF 26
36 0018: MOVF 7B,W
37 0019: MOVWF 27
38 001A: BCF 03.7
39 001B: BCF 03.5
40 001C: MOVLW 8C
41 001D: MOVWF 04
42 001E: BTFSS 00.3
43 001F: GOTO 022
44 0020: BTFSC 0C.3
45 0021: GOTO 039
46 0022: BTFSS 0B.5
47 0023: GOTO 026
48 0024: BTFSC 0B.2
49 0025: GOTO 03B
50 0026: MOVF 22,W
51 0027: MOVWF 04
52 0028: MOVF 23,W
53 0029: MOVWF 77
54 002A: MOVF 24,W
55 002B: MOVWF 78
56 002C: MOVF 25,W
57 002D: MOVWF 79
58 002E: MOVF 26,W
59 002F: MOVWF 7A
60 0030: MOVF 27,W
61 0031: MOVWF 7B
62 0032: MOVF 28,W
63 0033: MOVWF 0A
64 0034: SWAPF 21,W
65 0035: MOVWF 03
66 0036: SWAPF 7F,F
67 0037: SWAPF 7F,W
68 0038: RETFIE
69 0039: BCF 0A.3
70 003A: GOTO 0A5
71 003B: BCF 0A.3
72 003C: GOTO 0D3
73 .................... // DART01A verze programu 1.02
74 .................... // (c)miho 2005
75 .................... //
76 .................... // 1.00 Uvodni verze
77 .................... // 1.01 Doplneno nasatvovani parametru rozjezdu P2 u standardniho algoritmu
78 .................... // 1.02 Doplnena deaktivace vyvodu pro LED (LED tato verze programu nepouziva)
79 ....................
80 .................... #include "DART.h"
81 .................... // DART01A verze programu 1.00
82 .................... // (c)miho 2005
83 ....................
84 .................... #include <16F88.h> // standardni definice konstant
85 .................... //////// Header file for the PIC16F88
86 .................... #device PIC16F88
87 .................... #list
88 .................... #include <16F88_Reg.h> // standardni definice vsech FSR
89 .................... #list
90 ....................
91 ....................
92 .................... #device adc=8 // AD prevodnik jen na 8 bitu
93 .................... #define xclock 4168000 // muj konkretni PIC je trochu rychlejsi
94 .................... #use delay(clock=xclock,restart_wdt)
95 *
96 00FD: MOVLW 11
97 00FE: SUBWF 3F,F
98 00FF: BTFSS 03.0
99 0100: GOTO 10F
100 0101: MOVLW 3F
101 0102: MOVWF 04
102 0103: MOVLW FC
103 0104: ANDWF 00,F
104 0105: BCF 03.0
105 0106: RRF 00,F
106 0107: RRF 00,F
107 0108: MOVF 00,W
108 0109: BTFSC 03.2
109 010A: GOTO 10F
110 010B: GOTO 10D
111 010C: CLRWDT
112 010D: DECFSZ 00,F
113 010E: GOTO 10C
114 010F: BCF 0A.3
115 0110: GOTO 2AA (RETURN)
116 *
117 020D: MOVLW 3E
118 020E: MOVWF 04
119 020F: MOVF 00,W
120 0210: BTFSC 03.2
121 0211: GOTO 223
122 0212: MOVLW 01
123 0213: MOVWF 78
124 0214: MOVLW BF
125 0215: MOVWF 77
126 0216: CLRWDT
127 0217: DECFSZ 77,F
128 0218: GOTO 216
129 0219: DECFSZ 78,F
130 021A: GOTO 214
131 021B: MOVLW 58
132 021C: MOVWF 77
133 021D: DECFSZ 77,F
134 021E: GOTO 21D
135 021F: NOP
136 0220: CLRWDT
137 0221: DECFSZ 00,F
138 0222: GOTO 212
139 0223: RETLW 00
140 .................... #fuses INTRC_IO, WDT, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD, NODEBUG, CCPB3
141 ....................
142 ....................
143 ....................
144 .................... #define BEEP0 PIN_A6 // pipak, prvni vystup
145 .................... #define BEEP1 PIN_A7 // pipak, druhy vystup
146 .................... #define PWM PIN_B3 // PWM vystup pro menic
147 .................... #define REFPOWER PIN_B1 // napajeni zdroje Vref
148 .................... #define MOTOR PIN_B2 // zapinani motoru
149 .................... #define SW0 PIN_B7 // konfiguracni prepinac 0
150 .................... #define SW1 PIN_B6 // konfiguracni prepinac 1
151 .................... #define LED PIN_B4 // dioda LED v elektornice DART01B
152 ....................
153 ....................
154 .................... void InitRS232()
155 .................... // Inicializace HW RS232 (pro ladici vystupy)
156 .................... {
157 .................... SPBRG=xclock/9600/16-1; // ryclost 9600Bd
158 *
159 00F1: MOVLW 1A
160 00F2: BSF 03.5
161 00F3: MOVWF 19
162 .................... RCSTA=0b10000000; // enable USART
163 00F4: MOVLW 80
164 00F5: BCF 03.5
165 00F6: MOVWF 18
166 .................... TXSTA=0b00100100; // BRGH=1, TX enable
167 00F7: MOVLW 24
168 00F8: BSF 03.5
169 00F9: MOVWF 18
170 .................... }
171 00FA: BCF 03.5
172 00FB: BCF 0A.3
173 00FC: GOTO 28C (RETURN)
174 ....................
175 ....................
176 .................... void Putc(char c)
177 .................... // Posilani znaku pres HW RS232
178 .................... {
179 .................... while(TRMT==0); // cekej na prazdny TX buffer
180 *
181 0111: BSF 03.5
182 0112: BTFSC 18.1
183 0113: GOTO 116
184 0114: BCF 03.5
185 0115: GOTO 111
186 .................... TXREG=c; // predej data
187 0116: BCF 03.5
188 0117: MOVF 42,W
189 0118: MOVWF 19
190 .................... }
191 0119: RETLW 00
192 ....................
193 ....................
194 .................... // Globalni promenna pro data posilana na SSP
195 .................... // Nastavuje se funkci MotorPatternSet()
196 .................... // Vyuziva se v prerusovaci rutine IntSSP()
197 .................... unsigned int8 MotorPattern; // aktualni data pro SSP jednotku
198 ....................
199 ....................
200 .................... void MotorPatternSet(unsigned int Gear)
201 .................... // Na zaklade rychlostniho stupne nastavi MotorPattern pro SSP
202 .................... // Rychlost 0 znamena stop, rychlost 8 je maximum
203 .................... {
204 .................... // Tabulka rychlost -> pattern pro SSP
205 .................... unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};
206 ....................
207 .................... // Vyber patternu
208 .................... if (Gear==0) // stav 0 znamena stop
209 *
210 00AA: MOVF 45,F
211 00AB: BTFSS 03.2
212 00AC: GOTO 0B9
213 .................... {
214 .................... output_low(MOTOR); // klidovy stav
215 00AD: BSF 03.5
216 00AE: BCF 06.2
217 00AF: BCF 03.5
218 00B0: BCF 06.2
219 .................... SSPSTAT = 0;
220 00B1: BSF 03.5
221 00B2: CLRF 14
222 .................... SSPCON1 = 0; // SPI stop
223 00B3: BCF 03.5
224 00B4: CLRF 14
225 .................... disable_interrupts(INT_SSP); // neni preruseni od SSP
226 00B5: BSF 03.5
227 00B6: BCF 0C.3
228 .................... }
229 .................... else // rizeny vykon
230 00B7: GOTO 0D1
231 00B8: BCF 03.5
232 .................... {
233 .................... if (Gear>7) // stav 8 a vice znamena plny vykon
234 00B9: MOVF 45,W
235 00BA: SUBLW 07
236 00BB: BTFSC 03.0
237 00BC: GOTO 0BF
238 .................... {
239 .................... Gear=8; // plny plyn
240 00BD: MOVLW 08
241 00BE: MOVWF 45
242 .................... }
243 ....................
244 .................... MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP
245 00BF: DECF 45,F
246 00C0: MOVF 45,W
247 00C1: CALL 03D
248 00C2: MOVWF 78
249 00C3: MOVWF 2A
250 .................... output_low(MOTOR); // klidovy stav
251 00C4: BSF 03.5
252 00C5: BCF 06.2
253 00C6: BCF 03.5
254 00C7: BCF 06.2
255 .................... SSPSTAT = 0;
256 00C8: BSF 03.5
257 00C9: CLRF 14
258 .................... SSPCON1 = 0x22; // SPI OSC/64
259 00CA: MOVLW 22
260 00CB: BCF 03.5
261 00CC: MOVWF 14
262 ....................
263 .................... SSPBUF=MotorPattern; // prvni data pro vyslani
264 00CD: MOVF 2A,W
265 00CE: MOVWF 13
266 .................... enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP
267 00CF: BSF 03.5
268 00D0: BSF 0C.3
269 .................... }
270 .................... }
271 00D1: BCF 03.5
272 00D2: RETLW 00
273 ....................
274 ....................
275 .................... // Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP.
276 .................... #INT_SSP
277 .................... void IntSSP()
278 .................... {
279 .................... SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP
280 *
281 00A5: MOVF 2A,W
282 00A6: MOVWF 13
283 .................... }
284 ....................
285 ....................
286 00A7: BCF 0C.3
287 00A8: BCF 0A.3
288 00A9: GOTO 026
289 .................... void MotorSet(unsigned int Gear)
290 *
291 0224: CLRF 29
292 0225: BTFSC 0B.7
293 0226: BSF 29.7
294 0227: BCF 0B.7
295 .................... // Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim
296 .................... // od SSP jednotky
297 .................... // 0 stop
298 .................... // 1-7 pocet 1/8 vykonu
299 .................... // >7 plny vykon
300 .................... {
301 .................... // Nastav PWM pattern
302 .................... MotorPatternSet(Gear); // nastav PWM pattern pro SSP
303 0228: MOVF 3E,W
304 0229: MOVWF 45
305 022A: CALL 0AA
306 022B: BTFSC 29.7
307 022C: BSF 0B.7
308 ....................
309 .................... // Povol preruseni
310 .................... enable_interrupts(GLOBAL); // povol preruseni
311 022D: MOVLW C0
312 022E: IORWF 0B,F
313 .................... }
314 022F: RETLW 00
315 ....................
316 ....................
317 .................... void InitT0()
318 .................... // Inicializace casovace T0 (cca 1000x za sekundu)
319 .................... {
320 .................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4
321 *
322 018A: BSF 03.5
323 018B: MOVF 01,W
324 018C: ANDLW C0
325 018D: IORLW 01
326 018E: MOVWF 01
327 .................... enable_interrupts(INT_RTCC); // generuj preruseni od T0
328 018F: BCF 03.5
329 0190: BSF 0B.5
330 .................... enable_interrupts(GLOBAL); // povol preruseni
331 0191: MOVLW C0
332 0192: IORWF 0B,F
333 .................... }
334 0193: BCF 0A.3
335 0194: GOTO 2DF (RETURN)
336 ....................
337 ....................
338 .................... // Globalni promenna pro mereni casu
339 .................... // Nastavuje se procedurou TimeSet()
340 .................... // Testuje se funkci TimeIf()
341 .................... // Modifikuje se pri preruseni od casovace IntTo()
342 .................... unsigned int16 TimeTime;
343 ....................
344 ....................
345 .................... void TimerSet(unsigned int16 Time)
346 .................... // Nastavi casovac na zadany pocet ms
347 .................... // Test uplynuti casu se dela pomoci TimerIf()
348 .................... {
349 .................... // Nastav hodnotu
350 .................... disable_interrupts(INT_RTCC); // nesmi prijit preruseni
351 *
352 0230: BCF 0B.5
353 .................... TimeTime=Time; // pri nastavovani hodnoty
354 0231: MOVF 3F,W
355 0232: MOVWF 2C
356 0233: MOVF 3E,W
357 0234: MOVWF 2B
358 .................... enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu)
359 0235: BSF 0B.5
360 .................... }
361 0236: RETLW 00
362 ....................
363 ....................
364 .................... int1 TimerIf()
365 .................... // Vraci TRUE pokud casovac jiz dobehl
366 .................... {
367 .................... int1 Flag; // pomocna promenna
368 ....................
369 .................... // Otestuj casovac
370 .................... disable_interrupts(INT_RTCC); // nesmi prijit preruseni
371 0237: BCF 0B.5
372 .................... Flag=(TimeTime==0); // behem testu promenne
373 0238: MOVF 2B,F
374 0239: BTFSS 03.2
375 023A: GOTO 23E
376 023B: MOVF 2C,F
377 023C: BTFSC 03.2
378 023D: GOTO 240
379 023E: MOVLW 00
380 023F: GOTO 241
381 0240: MOVLW 01
382 0241: MOVWF 78
383 0242: BTFSC 78.0
384 0243: GOTO 246
385 0244: BCF 3E.0
386 0245: GOTO 247
387 0246: BSF 3E.0
388 .................... enable_interrupts(INT_RTCC); // ted uz muze
389 0247: BSF 0B.5
390 ....................
391 .................... // Navratova hodnota
392 .................... return Flag; // TRUE znamena dobehl casovac
393 0248: MOVLW 00
394 0249: BTFSC 3E.0
395 024A: MOVLW 01
396 024B: MOVWF 78
397 .................... }
398 024C: RETLW 00
399 ....................
400 ....................
401 .................... // Globalni promenne pro akceleraci
402 .................... // Nastavuje se metodou MotorStart()
403 .................... // Pouziva se v obsluze preruseni IntT0()
404 .................... unsigned int8 MotorTime; // aktualni casovac pro rozjezd
405 .................... unsigned int8 MotorDelay; // spozdeni mezi razenim rychlosti
406 .................... unsigned int8 MotorGear; // rychlostni stupen
407 ....................
408 ....................
409 .................... void MotorStart(unsigned int8 Delay)
410 .................... // Provede rizeny rozjezd motoru
411 .................... // Parametrem je prodleva mezi razenim rychlosti v ms
412 .................... {
413 .................... disable_interrupts(INT_RTCC);
414 024D: BCF 0B.5
415 .................... MotorGear=1;
416 024E: MOVLW 01
417 024F: MOVWF 2F
418 .................... MotorDelay=Delay;
419 0250: MOVF 3E,W
420 0251: MOVWF 2E
421 .................... MotorTime=MotorDelay;
422 0252: MOVF 2E,W
423 0253: MOVWF 2D
424 .................... enable_interrupts(INT_RTCC);
425 0254: BSF 0B.5
426 0255: CLRF 29
427 0256: BTFSC 0B.7
428 0257: BSF 29.7
429 0258: BCF 0B.7
430 ....................
431 .................... MotorPatternSet(1);
432 0259: MOVLW 01
433 025A: MOVWF 45
434 025B: CALL 0AA
435 025C: BTFSC 29.7
436 025D: BSF 0B.7
437 .................... }
438 025E: RETLW 00
439 ....................
440 ....................
441 .................... #INT_TIMER0
442 .................... void IntT0()
443 .................... // Preruseni od casovace cca 1000x za sekundu
444 .................... {
445 .................... // Odpocitavani casovace
446 .................... if (TimeTime) TimeTime--;
447 *
448 00D3: MOVF 2B,W
449 00D4: IORWF 2C,W
450 00D5: BTFSC 03.2
451 00D6: GOTO 0DB
452 00D7: MOVF 2B,W
453 00D8: BTFSC 03.2
454 00D9: DECF 2C,F
455 00DA: DECF 2B,F
456 ....................
457 .................... // Obsluha akcelerace
458 .................... if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu
459 00DB: MOVF 2D,F
460 00DC: BTFSS 03.2
461 00DD: DECF 2D,F
462 .................... if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen
463 00DE: MOVF 2F,F
464 00DF: BTFSC 03.2
465 00E0: GOTO 0EE
466 00E1: MOVF 2F,W
467 00E2: SUBLW 07
468 00E3: BTFSS 03.0
469 00E4: GOTO 0EE
470 00E5: MOVF 2D,F
471 00E6: BTFSS 03.2
472 00E7: GOTO 0EE
473 .................... {
474 .................... MotorTime=MotorDelay; // znovu nastav casovac
475 00E8: MOVF 2E,W
476 00E9: MOVWF 2D
477 .................... MotorGear++; // dalsi rychlost
478 00EA: INCF 2F,F
479 .................... MotorPatternSet(MotorGear); // nastav rychlost
480 00EB: MOVF 2F,W
481 00EC: MOVWF 45
482 00ED: CALL 0AA
483 .................... }
484 .................... }
485 ....................
486 ....................
487 .................... // Cteni dat z AD prevodniku, zadava se cislo kanalu
488 00EE: BCF 0B.2
489 00EF: BCF 0A.3
490 00F0: GOTO 026
491 .................... int8 ReadAD(int8 Ch)
492 .................... {
493 .................... // Pokud merim Vref zapnu si jeho napajeni
494 .................... if (Ch==4) output_high(REFPOWER);
495 *
496 0195: MOVF 3E,W
497 0196: SUBLW 04
498 0197: BTFSS 03.2
499 0198: GOTO 19D
500 0199: BSF 03.5
501 019A: BCF 06.1
502 019B: BCF 03.5
503 019C: BSF 06.1
504 ....................
505 .................... // Inicializace a cislo kanalu
506 .................... ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify
507 019D: MOVLW 30
508 019E: BSF 03.5
509 019F: MOVWF 1F
510 .................... ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu
511 01A0: BCF 03.5
512 01A1: RLF 3E,W
513 01A2: MOVWF 77
514 01A3: RLF 77,F
515 01A4: RLF 77,F
516 01A5: MOVLW F8
517 01A6: ANDWF 77,F
518 01A7: MOVF 77,W
519 01A8: ADDLW 41
520 01A9: MOVWF 1F
521 ....................
522 .................... // Mereni
523 .................... delay_us(50); // doba na prepnuti kanalu
524 01AA: CLRWDT
525 01AB: MOVLW 10
526 01AC: MOVWF 77
527 01AD: DECFSZ 77,F
528 01AE: GOTO 1AD
529 01AF: NOP
530 01B0: NOP
531 .................... ADCON0 |= 4; // start prevodu
532 01B1: BSF 1F.2
533 .................... delay_us(50); // doba na prevod
534 01B2: CLRWDT
535 01B3: MOVLW 10
536 01B4: MOVWF 77
537 01B5: DECFSZ 77,F
538 01B6: GOTO 1B5
539 01B7: NOP
540 01B8: NOP
541 ....................
542 .................... // Vypnu napajeni Vref (vzdycky)
543 .................... output_low(REFPOWER);
544 01B9: BSF 03.5
545 01BA: BCF 06.1
546 01BB: BCF 03.5
547 01BC: BCF 06.1
548 ....................
549 .................... // Navrat hodnoty
550 .................... return ADRESH;
551 01BD: MOVF 1E,W
552 01BE: MOVWF 78
553 .................... }
554 01BF: RETLW 00
555 ....................
556 ....................
557 .................... void main()
558 .................... {
559 *
560 025F: CLRF 04
561 0260: MOVLW 1F
562 0261: ANDWF 03,F
563 0262: BSF 03.5
564 0263: BCF 1F.4
565 0264: BCF 1F.5
566 0265: MOVF 1B,W
567 0266: ANDLW 80
568 0267: MOVWF 1B
569 0268: MOVLW 07
570 0269: MOVWF 1C
571 026A: MOVF 1C,W
572 026B: BCF 03.5
573 026C: BCF 0D.6
574 .................... unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu)
575 .................... unsigned int8 i;
576 ....................
577 .................... // Hodiny
578 .................... OSCCON = 0x62; // 4 MHz interni RC oscilator
579 026D: MOVLW 62
580 026E: BSF 03.5
581 026F: MOVWF 0F
582 ....................
583 .................... // Digitalni vystupy
584 .................... output_low(PWM); // PWM vystup
585 0270: BCF 06.3
586 0271: BCF 03.5
587 0272: BCF 06.3
588 .................... output_low(MOTOR); // Proud do motoru
589 0273: BSF 03.5
590 0274: BCF 06.2
591 0275: BCF 03.5
592 0276: BCF 06.2
593 .................... output_low(REFPOWER); // Napajeni Vref
594 0277: BSF 03.5
595 0278: BCF 06.1
596 0279: BCF 03.5
597 027A: BCF 06.1
598 .................... output_low(LED); // LED dioda nesviti
599 027B: BSF 03.5
600 027C: BCF 06.4
601 027D: BCF 03.5
602 027E: BCF 06.4
603 .................... port_b_pullups(TRUE); // Zbyvajici vyvody portu B
604 027F: BSF 03.5
605 0280: BCF 01.7
606 ....................
607 .................... // Watch Dog
608 .................... PSA=0; // preddelic prirazen casovaci
609 0281: BCF 01.3
610 .................... WDTCON=0x0E; // Watch Dog cca 130ms
611 0282: MOVLW 0E
612 0283: BCF 03.5
613 0284: BSF 03.6
614 0285: MOVWF 05
615 ....................
616 .................... // Analogove vstupy
617 .................... ANSEL = 0x1F; // AN0 az AN4
618 0286: MOVLW 1F
619 0287: BSF 03.5
620 0288: BCF 03.6
621 0289: MOVWF 1B
622 ....................
623 .................... // nastaveni RS232
624 .................... InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms)
625 028A: BCF 03.5
626 028B: GOTO 0F1
627 ....................
628 .................... // Pipnuti (a cekani)
629 .................... for (i=1;i<30;i++) // pocet 1/2 period
630 028C: MOVLW 01
631 028D: MOVWF 31
632 028E: MOVF 31,W
633 028F: SUBLW 1D
634 0290: BTFSS 03.0
635 0291: GOTO 2AE
636 .................... {
637 .................... int1 beep; // stavova promenna pro pipak
638 ....................
639 .................... output_bit(BEEP0,beep);
640 0292: BTFSC 32.0
641 0293: GOTO 296
642 0294: BCF 05.6
643 0295: GOTO 297
644 0296: BSF 05.6
645 0297: BSF 03.5
646 0298: BCF 05.6
647 .................... beep=~beep;
648 0299: MOVLW 01
649 029A: BCF 03.5
650 029B: XORWF 32,F
651 .................... output_bit(BEEP1,beep);
652 029C: BTFSC 32.0
653 029D: GOTO 2A0
654 029E: BCF 05.7
655 029F: GOTO 2A1
656 02A0: BSF 05.7
657 02A1: BSF 03.5
658 02A2: BCF 05.7
659 .................... delay_us(1000);
660 02A3: CLRWDT
661 02A4: MOVLW 09
662 02A5: BCF 03.5
663 02A6: MOVWF 3E
664 02A7: MOVLW 6C
665 02A8: MOVWF 3F
666 02A9: GOTO 0FD
667 02AA: DECFSZ 3E,F
668 02AB: GOTO 2A7
669 .................... }
670 02AC: INCF 31,F
671 02AD: GOTO 28E
672 ....................
673 .................... // Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu)
674 .................... Debug=0;
675 02AE: CLRF 30
676 .................... if (~input(SW0)) Debug|=1; // precti bit 0
677 02AF: BSF 03.5
678 02B0: BSF 06.7
679 02B1: BCF 03.5
680 02B2: BTFSS 06.7
681 02B3: BSF 30.0
682 .................... if (~input(SW1)) Debug|=2; // precti bit 1
683 02B4: BSF 03.5
684 02B5: BSF 06.6
685 02B6: BCF 03.5
686 02B7: BTFSS 06.6
687 02B8: BSF 30.1
688 .................... output_low(SW0); // nastav L aby se snizila spotreba
689 02B9: BSF 03.5
690 02BA: BCF 06.7
691 02BB: BCF 03.5
692 02BC: BCF 06.7
693 .................... output_low(SW1); // na obou vstupech
694 02BD: BSF 03.5
695 02BE: BCF 06.6
696 02BF: BCF 03.5
697 02C0: BCF 06.6
698 ....................
699 .................... // Zobrazeni rezimu (na ladici seriovy vystup)
700 .................... printf(Putc,"\fMode:%d",Debug);
701 02C1: CLRF 3E
702 02C2: MOVF 3E,W
703 02C3: CALL 049
704 02C4: INCF 3E,F
705 02C5: MOVWF 77
706 02C6: MOVWF 42
707 02C7: CALL 111
708 02C8: MOVLW 06
709 02C9: SUBWF 3E,W
710 02CA: BTFSS 03.2
711 02CB: GOTO 2C2
712 02CC: MOVF 30,W
713 02CD: MOVWF 3F
714 02CE: MOVLW 18
715 02CF: MOVWF 40
716 02D0: GOTO 12F
717 ....................
718 .................... // Inicializace PWM
719 .................... PR2 = 0x1F; // perioda PWM casovace
720 02D1: MOVLW 1F
721 02D2: BSF 03.5
722 02D3: MOVWF 12
723 .................... T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu
724 02D4: MOVLW 04
725 02D5: BCF 03.5
726 02D6: MOVWF 12
727 .................... CCP1CON = 0x0C; // PWM mode, lsb bity nulove
728 02D7: MOVLW 0C
729 02D8: MOVWF 17
730 .................... CCPR1L = 0; // na zacatku nulova data
731 02D9: CLRF 15
732 .................... output_low(PWM); // PWM vystup
733 02DA: BSF 03.5
734 02DB: BCF 06.3
735 02DC: BCF 03.5
736 02DD: BCF 06.3
737 ....................
738 .................... // Inicializace casovace
739 .................... InitT0(); // nastav casovac na cca 1ms
740 02DE: GOTO 18A
741 ....................
742 .................... // ALG=1 Test menice PWM a rozjezdoveho PWM
743 .................... // ========================================
744 .................... // P1 nastavuje primo stridu hlavniho PWM menice
745 .................... // P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8)
746 .................... // Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu
747 .................... if (Debug==1)
748 02DF: DECFSZ 30,W
749 02E0: GOTO 31A
750 .................... {
751 .................... unsigned int8 Data1; // poteniometr P1 = PWM
752 .................... unsigned int8 Data2; // poteniometr P2 = Rozjezd
753 ....................
754 .................... while (1)
755 .................... {
756 .................... // watch dog
757 .................... restart_wdt();
758 02E1: CLRWDT
759 ....................
760 .................... // mereni vstupu
761 .................... Data1=ReadAD(0); // nacti parametr pro PWM
762 02E2: CLRF 3E
763 02E3: CALL 195
764 02E4: MOVF 78,W
765 02E5: MOVWF 33
766 .................... Data1>>=2; // redukuj rozsah na 0 az 63
767 02E6: RRF 33,F
768 02E7: RRF 33,F
769 02E8: MOVLW 3F
770 02E9: ANDWF 33,F
771 .................... Data2=ReadAD(1); // nacti parametr pro rozjezd
772 02EA: MOVLW 01
773 02EB: MOVWF 3E
774 02EC: CALL 195
775 02ED: MOVF 78,W
776 02EE: MOVWF 34
777 .................... Data2>>=4; // redukuj rozsah na 0 az 15
778 02EF: SWAPF 34,F
779 02F0: MOVLW 0F
780 02F1: ANDWF 34,F
781 ....................
782 .................... // zobrazeni
783 .................... printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2);
784 02F2: CLRF 3E
785 02F3: MOVF 3E,W
786 02F4: CALL 056
787 02F5: INCF 3E,F
788 02F6: MOVWF 77
789 02F7: MOVWF 42
790 02F8: CALL 111
791 02F9: MOVLW 05
792 02FA: SUBWF 3E,W
793 02FB: BTFSS 03.2
794 02FC: GOTO 2F3
795 02FD: MOVF 33,W
796 02FE: MOVWF 40
797 02FF: CLRF 41
798 0300: CALL 1C0
799 0301: MOVLW 09
800 0302: MOVWF 3F
801 0303: MOVF 3F,W
802 0304: CALL 056
803 0305: INCF 3F,F
804 0306: MOVWF 77
805 0307: MOVWF 42
806 0308: CALL 111
807 0309: MOVLW 0E
808 030A: SUBWF 3F,W
809 030B: BTFSS 03.2
810 030C: GOTO 303
811 030D: MOVF 34,W
812 030E: MOVWF 40
813 030F: CLRF 41
814 0310: CALL 1C0
815 .................... delay_ms(20);
816 0311: MOVLW 14
817 0312: MOVWF 3E
818 0313: CALL 20D
819 ....................
820 .................... // nastaveni parametru PWM
821 .................... CCPR1L = Data1;
822 0314: MOVF 33,W
823 0315: MOVWF 15
824 ....................
825 .................... // nastaveni parametru RUN
826 .................... MotorSet(Data2);
827 0316: MOVF 34,W
828 0317: MOVWF 3E
829 0318: CALL 224
830 .................... }
831 0319: GOTO 2E1
832 .................... }
833 ....................
834 .................... // ALG=2 Testovani rozjezdu
835 .................... // ========================
836 .................... // P2 nastavuje cas mezi stupni razeni pro rozjezd v ms
837 .................... // Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor
838 .................... if (Debug==2)
839 031A: MOVF 30,W
840 031B: SUBLW 02
841 031C: BTFSS 03.2
842 031D: GOTO 36B
843 .................... {
844 .................... int8 Data;
845 .................... int8 Start;
846 ....................
847 .................... Start=0; // uvodni stav
848 031E: CLRF 36
849 .................... while(1)
850 .................... {
851 .................... // Nacti a zobraz parametr
852 .................... Data=ReadAD(1); // potenciometr P2 = rozjezd
853 031F: MOVLW 01
854 0320: MOVWF 3E
855 0321: CALL 195
856 0322: MOVF 78,W
857 0323: MOVWF 35
858 .................... printf(Putc,"\nRUN:%3ums ",Data); // zobraz
859 0324: CLRF 3E
860 0325: MOVF 3E,W
861 0326: CALL 06D
862 0327: INCF 3E,F
863 0328: MOVWF 77
864 0329: MOVWF 42
865 032A: CALL 111
866 032B: MOVLW 05
867 032C: SUBWF 3E,W
868 032D: BTFSS 03.2
869 032E: GOTO 325
870 032F: MOVF 35,W
871 0330: MOVWF 40
872 0331: MOVLW 10
873 0332: MOVWF 41
874 0333: CALL 1C0
875 0334: MOVLW 6D
876 0335: MOVWF 42
877 0336: CALL 111
878 0337: MOVLW 73
879 0338: MOVWF 42
880 0339: CALL 111
881 033A: MOVLW 20
882 033B: MOVWF 42
883 033C: CALL 111
884 .................... delay_ms(10); // prodleva pro terminal
885 033D: MOVLW 0A
886 033E: MOVWF 3E
887 033F: CALL 20D
888 ....................
889 .................... // Uvodni pauza
890 .................... if (Start==0) // spousti se 1x na zacatku
891 0340: MOVF 36,F
892 0341: BTFSS 03.2
893 0342: GOTO 349
894 .................... {
895 .................... Start++; // dalsi stav je cekani
896 0343: INCF 36,F
897 .................... TimerSet(2000); // na dokonceni uvodni prodlevy
898 0344: MOVLW 07
899 0345: MOVWF 3F
900 0346: MOVLW D0
901 0347: MOVWF 3E
902 0348: CALL 230
903 .................... }
904 ....................
905 .................... // Rozjezd
906 .................... if ((Start==1) && TimerIf())
907 0349: DECFSZ 36,W
908 034A: GOTO 35B
909 034B: CALL 237
910 034C: MOVF 78,F
911 034D: BTFSC 03.2
912 034E: GOTO 35B
913 .................... {
914 .................... Start++;
915 034F: INCF 36,F
916 .................... printf(Putc,"R");
917 0350: MOVLW 52
918 0351: MOVWF 42
919 0352: CALL 111
920 .................... MotorStart(Data); // rozjezd s nastavenim prodlevy
921 0353: MOVF 35,W
922 0354: MOVWF 3E
923 0355: CALL 24D
924 ....................
925 .................... TimerSet(2000); // nastav celkovy cas jizdy
926 0356: MOVLW 07
927 0357: MOVWF 3F
928 0358: MOVLW D0
929 0359: MOVWF 3E
930 035A: CALL 230
931 .................... }
932 ....................
933 .................... // Zastaveni
934 .................... if ((Start==2) && TimerIf())
935 035B: MOVF 36,W
936 035C: SUBLW 02
937 035D: BTFSS 03.2
938 035E: GOTO 369
939 035F: CALL 237
940 0360: MOVF 78,F
941 0361: BTFSC 03.2
942 0362: GOTO 369
943 .................... {
944 .................... Start++;
945 0363: INCF 36,F
946 .................... printf(Putc,"S");
947 0364: MOVLW 53
948 0365: MOVWF 42
949 0366: CALL 111
950 .................... MotorSet(0); // pokud dobehl casovac zastav motor
951 0367: CLRF 3E
952 0368: CALL 224
953 .................... }
954 ....................
955 .................... // watch dog
956 .................... restart_wdt();
957 0369: CLRWDT
958 .................... }
959 036A: GOTO 31F
960 .................... }
961 ....................
962 .................... // ALG=3 Test nabijeciho algoritmu
963 .................... // ===============================
964 .................... // P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni)
965 .................... // Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny
966 .................... // algoritmus jako pro standardni jizdu
967 .................... if (Debug==3)
968 036B: MOVF 30,W
969 036C: SUBLW 03
970 036D: BTFSS 03.2
971 036E: GOTO 3C2
972 .................... {
973 .................... unsigned int8 PwmOut; // akcni hodnota pro PWM
974 .................... unsigned int8 Req; // pozadovana hodnota z P1
975 .................... unsigned int8 Vref; // merena hodnota vref
976 ....................
977 .................... // Inicializace stavove promenne
978 .................... PwmOut=0;
979 036F: CLRF 37
980 ....................
981 .................... // Hlavni smycka
982 .................... while (1)
983 .................... {
984 .................... // watch dog
985 .................... restart_wdt();
986 0370: CLRWDT
987 ....................
988 .................... // pozadovana hodnota (potenciometr P1)
989 .................... Req=ReadAD(0);
990 0371: CLRF 3E
991 0372: CALL 195
992 0373: MOVF 78,W
993 0374: MOVWF 38
994 .................... Req=50+(ReadAD(0)>>1); // 50 az 177
995 0375: CLRF 3E
996 0376: CALL 195
997 0377: BCF 03.0
998 0378: RRF 78,W
999 0379: ADDLW 32
1000 037A: MOVWF 38
1001 ....................
1002 .................... // napeti na napajeni (vref)
1003 .................... Vref=ReadAD(4);
1004 037B: MOVLW 04
1005 037C: MOVWF 3E
1006 037D: CALL 195
1007 037E: MOVF 78,W
1008 037F: MOVWF 39
1009 ....................
1010 .................... // ricici algoritmus
1011 .................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;
1012 0380: MOVF 38,W
1013 0381: SUBWF 39,W
1014 0382: BTFSC 03.0
1015 0383: GOTO 388
1016 0384: MOVF 37,W
1017 0385: SUBLW 1D
1018 0386: BTFSC 03.0
1019 0387: INCF 37,F
1020 .................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;
1021 0388: MOVF 38,W
1022 0389: SUBWF 39,W
1023 038A: BTFSS 03.0
1024 038B: GOTO 38F
1025 038C: MOVF 37,F
1026 038D: BTFSS 03.2
1027 038E: DECF 37,F
1028 .................... Vref+=10;
1029 038F: MOVLW 0A
1030 0390: ADDWF 39,F
1031 .................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu
1032 0391: MOVF 38,W
1033 0392: SUBWF 39,W
1034 0393: BTFSC 03.0
1035 0394: GOTO 399
1036 0395: MOVF 37,W
1037 0396: SUBLW 1D
1038 0397: BTFSC 03.0
1039 0398: INCF 37,F
1040 ....................
1041 .................... // nastaveni parametru PWM
1042 .................... if (PwmOut>24) PwmOut=24; // saturace
1043 0399: MOVF 37,W
1044 039A: SUBLW 18
1045 039B: BTFSC 03.0
1046 039C: GOTO 39F
1047 039D: MOVLW 18
1048 039E: MOVWF 37
1049 .................... CCPR1L = PwmOut; // pouziti vystupu
1050 039F: MOVF 37,W
1051 03A0: MOVWF 15
1052 ....................
1053 .................... // zobrazeni
1054 .................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);
1055 03A1: CLRF 3E
1056 03A2: MOVF 3E,W
1057 03A3: CALL 07D
1058 03A4: INCF 3E,F
1059 03A5: MOVWF 77
1060 03A6: MOVWF 42
1061 03A7: CALL 111
1062 03A8: MOVLW 05
1063 03A9: SUBWF 3E,W
1064 03AA: BTFSS 03.2
1065 03AB: GOTO 3A2
1066 03AC: MOVF 38,W
1067 03AD: MOVWF 40
1068 03AE: CLRF 41
1069 03AF: CALL 1C0
1070 03B0: MOVLW 20
1071 03B1: MOVWF 42
1072 03B2: CALL 111
1073 03B3: MOVF 39,W
1074 03B4: MOVWF 40
1075 03B5: CLRF 41
1076 03B6: CALL 1C0
1077 03B7: MOVLW 20
1078 03B8: MOVWF 42
1079 03B9: CALL 111
1080 03BA: MOVF 37,W
1081 03BB: MOVWF 40
1082 03BC: CLRF 41
1083 03BD: CALL 1C0
1084 .................... delay_ms(10);
1085 03BE: MOVLW 0A
1086 03BF: MOVWF 3E
1087 03C0: CALL 20D
1088 .................... }
1089 03C1: GOTO 370
1090 .................... }
1091 ....................
1092 .................... // ALG=0 Standardni jizda
1093 .................... // ======================
1094 .................... // P1 nastavuje pozadovane napeti na clancich
1095 .................... // P2 nastavuje prodlevu razeni pri rozjezdu, nacita se jen 1x na zacatku
1096 .................... // Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede
1097 .................... // rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku.
1098 .................... // Parametry P1 a P2 jsou chapany stejne jako v algoritmech 2 a 3.
1099 .................... if (Debug==0)
1100 03C2: MOVF 30,F
1101 03C3: BTFSS 03.2
1102 03C4: GOTO 449
1103 .................... {
1104 .................... unsigned int8 PwmOut; // akcni hodnota pro PWM
1105 .................... unsigned int8 Req; // pozadovana hodnota z P1
1106 .................... unsigned int8 Vref; // merena hodnota vref
1107 .................... int8 Delay; // pozadovana honota prodlevy razeni z P2
1108 .................... int1 Run;
1109 ....................
1110 .................... // Nacti parametr rozjezdu
1111 .................... Delay=ReadAD(1); // potenciometr P2 = rozjezd
1112 03C5: MOVLW 01
1113 03C6: MOVWF 3E
1114 03C7: CALL 195
1115 03C8: MOVF 78,W
1116 03C9: MOVWF 3D
1117 .................... printf(Putc," RUN:%3ums ",Delay); // zobraz
1118 03CA: CLRF 3E
1119 03CB: MOVF 3E,W
1120 03CC: CALL 095
1121 03CD: INCF 3E,F
1122 03CE: MOVWF 77
1123 03CF: MOVWF 42
1124 03D0: CALL 111
1125 03D1: MOVLW 05
1126 03D2: SUBWF 3E,W
1127 03D3: BTFSS 03.2
1128 03D4: GOTO 3CB
1129 03D5: MOVF 3D,W
1130 03D6: MOVWF 40
1131 03D7: MOVLW 10
1132 03D8: MOVWF 41
1133 03D9: CALL 1C0
1134 03DA: MOVLW 6D
1135 03DB: MOVWF 42
1136 03DC: CALL 111
1137 03DD: MOVLW 73
1138 03DE: MOVWF 42
1139 03DF: CALL 111
1140 03E0: MOVLW 20
1141 03E1: MOVWF 42
1142 03E2: CALL 111
1143 .................... delay_ms(10); // prodleva pro terminal
1144 03E3: MOVLW 0A
1145 03E4: MOVWF 3E
1146 03E5: CALL 20D
1147 ....................
1148 .................... // Inicializace stavove promenne
1149 .................... PwmOut=0;
1150 03E6: CLRF 3A
1151 .................... TimerSet(14000); // casovani startu
1152 03E7: MOVLW 36
1153 03E8: MOVWF 3F
1154 03E9: MOVLW B0
1155 03EA: MOVWF 3E
1156 03EB: CALL 230
1157 .................... Run=1;
1158 03EC: BSF 32.1
1159 ....................
1160 .................... // Hlavni smycka
1161 .................... while (1)
1162 .................... {
1163 .................... // watch dog
1164 .................... restart_wdt();
1165 03ED: CLRWDT
1166 ....................
1167 .................... // pozadovana hodnota (potenciometr P1)
1168 .................... Req=ReadAD(0);
1169 03EE: CLRF 3E
1170 03EF: CALL 195
1171 03F0: MOVF 78,W
1172 03F1: MOVWF 3B
1173 .................... Req=50+(ReadAD(0)>>1); // 50 az 177
1174 03F2: CLRF 3E
1175 03F3: CALL 195
1176 03F4: BCF 03.0
1177 03F5: RRF 78,W
1178 03F6: ADDLW 32
1179 03F7: MOVWF 3B
1180 ....................
1181 .................... // napeti na napajeni (vref)
1182 .................... Vref=ReadAD(4);
1183 03F8: MOVLW 04
1184 03F9: MOVWF 3E
1185 03FA: CALL 195
1186 03FB: MOVF 78,W
1187 03FC: MOVWF 3C
1188 ....................
1189 .................... // ricici algoritmus
1190 .................... if ((Vref<Req) &&(PwmOut<30)) PwmOut++;
1191 03FD: MOVF 3B,W
1192 03FE: SUBWF 3C,W
1193 03FF: BTFSC 03.0
1194 0400: GOTO 405
1195 0401: MOVF 3A,W
1196 0402: SUBLW 1D
1197 0403: BTFSC 03.0
1198 0404: INCF 3A,F
1199 .................... if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;
1200 0405: MOVF 3B,W
1201 0406: SUBWF 3C,W
1202 0407: BTFSS 03.0
1203 0408: GOTO 40C
1204 0409: MOVF 3A,F
1205 040A: BTFSS 03.2
1206 040B: DECF 3A,F
1207 .................... Vref+=10;
1208 040C: MOVLW 0A
1209 040D: ADDWF 3C,F
1210 .................... if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu
1211 040E: MOVF 3B,W
1212 040F: SUBWF 3C,W
1213 0410: BTFSC 03.0
1214 0411: GOTO 416
1215 0412: MOVF 3A,W
1216 0413: SUBLW 1D
1217 0414: BTFSC 03.0
1218 0415: INCF 3A,F
1219 ....................
1220 .................... // nastaveni parametru PWM
1221 .................... if (PwmOut>24) PwmOut=24; // saturace
1222 0416: MOVF 3A,W
1223 0417: SUBLW 18
1224 0418: BTFSC 03.0
1225 0419: GOTO 41C
1226 041A: MOVLW 18
1227 041B: MOVWF 3A
1228 .................... CCPR1L = PwmOut; // pouziti vystupu
1229 041C: MOVF 3A,W
1230 041D: MOVWF 15
1231 ....................
1232 .................... // zobrazeni
1233 .................... printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);
1234 041E: CLRF 3E
1235 041F: MOVF 3E,W
1236 0420: CALL 07D
1237 0421: INCF 3E,F
1238 0422: MOVWF 77
1239 0423: MOVWF 42
1240 0424: CALL 111
1241 0425: MOVLW 05
1242 0426: SUBWF 3E,W
1243 0427: BTFSS 03.2
1244 0428: GOTO 41F
1245 0429: MOVF 3B,W
1246 042A: MOVWF 40
1247 042B: CLRF 41
1248 042C: CALL 1C0
1249 042D: MOVLW 20
1250 042E: MOVWF 42
1251 042F: CALL 111
1252 0430: MOVF 3C,W
1253 0431: MOVWF 40
1254 0432: CLRF 41
1255 0433: CALL 1C0
1256 0434: MOVLW 20
1257 0435: MOVWF 42
1258 0436: CALL 111
1259 0437: MOVF 3A,W
1260 0438: MOVWF 40
1261 0439: CLRF 41
1262 043A: CALL 1C0
1263 .................... delay_ms(10);
1264 043B: MOVLW 0A
1265 043C: MOVWF 3E
1266 043D: CALL 20D
1267 ....................
1268 .................... // rozjezd
1269 .................... if (TimerIf()&&Run)
1270 043E: CALL 237
1271 043F: MOVF 78,F
1272 0440: BTFSC 03.2
1273 0441: GOTO 448
1274 0442: BTFSS 32.1
1275 0443: GOTO 448
1276 .................... {
1277 .................... Run=0;
1278 0444: BCF 32.1
1279 .................... MotorStart(Delay); // prodleva razeni z P2
1280 0445: MOVF 3D,W
1281 0446: MOVWF 3E
1282 0447: CALL 24D
1283 .................... }
1284 .................... }
1285 0448: GOTO 3ED
1286 .................... }
1287 .................... }
1288 ....................
1289 0449: SLEEP
1290  
1291 Configuration Fuses:
1292 Word 1: 2F3C WDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB3 NOPROTECT INTRC_IO
1293 Word 2: 3FFF FCMEN IESO