Subversion Repositories svnkaklik

Rev

Go to most recent revision | Details | Last modification | View Log

Rev Author Line No. Line
2 kaklik 1
CCS PCM C Compiler, Version 3.221, 27853               21-VIII-05 18:18
2
 
3
               Filename: C:\PIC\jump\miho\DART.LST
4
 
5
               ROM used: 834 words (20%)
6
                         Largest free fragment is 2048
7
               RAM used: 25 (14%) at main() level
8
                         42 (24%) 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   1C8
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   089
71
003B:  BCF    0A.3
72
003C:  GOTO   0B7
73
....................  // DART01A verze programu 1.00  
74
.................... // (c)miho 2005  
75
....................   
76
.................... #include "DART.h" 
77
....................  // DART01A verze programu 1.00  
78
.................... // (c)miho 2005  
79
....................   
80
.................... #include ".\lib\16F88.h"                     // standardni definice konstant 
81
....................  //////// Header file for the PIC16F88  
82
.................... #device PIC16F88  
83
.................... #list 
84
.................... #include ".\lib\16F88_Reg.h"                 // standardni definice vsech FSR 
85
.................... #list  
86
....................  
87
....................   
88
.................... #device adc=8                          // AD prevodnik jen na 8 bitu  
89
.................... #define xclock 4168000                 // muj konkretni PIC je trochu rychlejsi  
90
.................... #use delay(clock=xclock,restart_wdt)  
91
0176:  MOVLW  3D
92
0177:  MOVWF  04
93
0178:  MOVF   00,W
94
0179:  BTFSC  03.2
95
017A:  GOTO   18C
96
017B:  MOVLW  01
97
017C:  MOVWF  78
98
017D:  MOVLW  BF
99
017E:  MOVWF  77
100
017F:  CLRWDT
101
0180:  DECFSZ 77,F
102
0181:  GOTO   17F
103
0182:  DECFSZ 78,F
104
0183:  GOTO   17D
105
0184:  MOVLW  58
106
0185:  MOVWF  77
107
0186:  DECFSZ 77,F
108
0187:  GOTO   186
109
0188:  NOP
110
0189:  CLRWDT
111
018A:  DECFSZ 00,F
112
018B:  GOTO   17B
113
018C:  RETLW  00
114
.................... #fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD, NODEBUG, CCPB3  
115
....................  
116
....................   
117
....................   
118
.................... #define BEEP0     PIN_A6   // pipak, prvni vystup  
119
.................... #define BEEP1     PIN_A7   // pipak, druhy vystup  
120
.................... #define PWM       PIN_B3   // PWM vystup pro menic  
121
.................... #define REFPOWER  PIN_B1   // napajeni zdroje Vref  
122
.................... #define MOTOR     PIN_B2   // zapinani motoru  
123
.................... #define SW0       PIN_B7   // konfiguracni prepinac 0  
124
.................... #define SW1       PIN_B6   // konfiguracni prepinac 1  
125
....................   
126
....................   
127
.................... void InitRS232()  
128
.................... // Inicializace HW RS232  
129
.................... {  
130
....................    SPBRG=xclock/9600/16-1; // ryclost 9600Bd  
131
....................    RCSTA=0b10000000;       // enable USART  
132
....................    TXSTA=0b00100100;       // BRGH=1, TX enable  
133
.................... }  
134
....................   
135
....................   
136
.................... void Putc(char c)  
137
.................... // Posilani znaku pres HW RS232  
138
.................... {  
139
....................    while(TRMT==0);         // cekej na prazdny TX buffer  
140
*
141
010B:  BSF    03.5
142
010C:  BTFSC  18.1
143
010D:  GOTO   110
144
010E:  BCF    03.5
145
010F:  GOTO   10B
146
....................    TXREG=c;                // predej data  
147
0110:  BCF    03.5
148
0111:  MOVF   41,W
149
0112:  MOVWF  19
150
.................... }  
151
0113:  RETLW  00
152
....................   
153
....................   
154
.................... // Globalni promenna pro data posilana na SSP  
155
.................... //   Nastavuje se funkci MotorPatternSet()  
156
.................... //   Vyuziva se v prerusovaci rutine IntSSP()  
157
.................... unsigned int8 MotorPattern;   // aktualni data pro SSP jednotku  
158
....................   
159
....................   
160
.................... void MotorPatternSet(unsigned int Gear)  
161
.................... // Na zaklade rychlosti nastavi MotorPattern pro SSP  
162
.................... // Rychlost 0 znamena stop, rychlost 8 je maximum  
163
.................... {  
164
....................    // Tabulka rychlost -> pattern pro SSP  
165
....................    unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};  
166
....................   
167
....................    // Vyber patternu  
168
....................    if (Gear==0)                     // stav 0 znamena stop  
169
*
170
008E:  MOVF   44,F
171
008F:  BTFSS  03.2
172
0090:  GOTO   09D
173
....................    {  
174
....................       output_low(MOTOR);            // klidovy stav  
175
0091:  BSF    03.5
176
0092:  BCF    06.2
177
0093:  BCF    03.5
178
0094:  BCF    06.2
179
....................       SSPSTAT = 0;  
180
0095:  BSF    03.5
181
0096:  CLRF   14
182
....................       SSPCON1 = 0;                  // SPI stop  
183
0097:  BCF    03.5
184
0098:  CLRF   14
185
....................       disable_interrupts(INT_SSP);  // neni preruseni od SSP  
186
0099:  BSF    03.5
187
009A:  BCF    0C.3
188
....................    }  
189
....................    else                             // rizeny vykon  
190
009B:  GOTO   0B5
191
009C:  BCF    03.5
192
....................    {  
193
....................       if (Gear>7)                   // stav 8 a vice znamena plny vykon  
194
009D:  MOVF   44,W
195
009E:  SUBLW  07
196
009F:  BTFSC  03.0
197
00A0:  GOTO   0A3
198
....................       {  
199
....................          Gear=8;                    // plny plyn  
200
00A1:  MOVLW  08
201
00A2:  MOVWF  44
202
....................       }  
203
....................   
204
....................       MotorPattern=ExpTab[--Gear];  // prevod z hodnoty plynu na data pro SSP  
205
00A3:  DECF   44,F
206
00A4:  MOVF   44,W
207
00A5:  CALL   03D
208
00A6:  MOVWF  78
209
00A7:  MOVWF  2A
210
....................       output_low(MOTOR);            // klidovy stav  
211
00A8:  BSF    03.5
212
00A9:  BCF    06.2
213
00AA:  BCF    03.5
214
00AB:  BCF    06.2
215
....................       SSPSTAT = 0;  
216
00AC:  BSF    03.5
217
00AD:  CLRF   14
218
....................       SSPCON1 = 0x22;               // SPI OSC/64  
219
00AE:  MOVLW  22
220
00AF:  BCF    03.5
221
00B0:  MOVWF  14
222
....................   
223
....................       SSPBUF=MotorPattern;          // prvni data pro vyslani  
224
00B1:  MOVF   2A,W
225
00B2:  MOVWF  13
226
....................       enable_interrupts(INT_SSP);   // az budou vyslana prijde interrupt od SSP  
227
00B3:  BSF    03.5
228
00B4:  BSF    0C.3
229
....................    }  
230
.................... }  
231
00B5:  BCF    03.5
232
00B6:  RETLW  00
233
....................   
234
....................   
235
.................... // Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP.  
236
.................... #INT_SSP  
237
.................... void IntSSP()  
238
.................... {  
239
....................    SSPBUF=MotorPattern;             // znova hdnota PWM patternu na SSP  
240
*
241
0089:  MOVF   2A,W
242
008A:  MOVWF  13
243
.................... }  
244
....................   
245
....................   
246
008B:  BCF    0C.3
247
008C:  BCF    0A.3
248
008D:  GOTO   026
249
.................... void MotorSet(unsigned int Gear)  
250
*
251
018D:  CLRF   29
252
018E:  BTFSC  0B.7
253
018F:  BSF    29.7
254
0190:  BCF    0B.7
255
.................... // Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim  
256
.................... // od SSP jednotky  
257
.................... //    0   stop  
258
.................... //    1-7 pocet 1/8 vykonu  
259
.................... //    >7  plny vykon  
260
.................... {  
261
....................    // Nastav PWM pattern  
262
....................    MotorPatternSet(Gear);           // nastav PWM pattern pro SSP  
263
0191:  MOVF   3D,W
264
0192:  MOVWF  44
265
0193:  CALL   08E
266
0194:  BTFSC  29.7
267
0195:  BSF    0B.7
268
....................   
269
....................    // Povol preruseni  
270
....................    enable_interrupts(GLOBAL);       // povol preruseni  
271
0196:  MOVLW  C0
272
0197:  IORWF  0B,F
273
.................... }  
274
0198:  RETLW  00
275
....................   
276
....................   
277
.................... void InitT0()  
278
.................... // Inicializace casovace T0 (cca 1000x za sekundu)  
279
.................... {  
280
....................    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);  // T0 z internich hodin 1/4  
281
*
282
00D5:  BSF    03.5
283
00D6:  MOVF   01,W
284
00D7:  ANDLW  C0
285
00D8:  IORLW  01
286
00D9:  MOVWF  01
287
....................    enable_interrupts(INT_RTCC);              // generuj preruseni od T0  
288
00DA:  BCF    03.5
289
00DB:  BSF    0B.5
290
....................    enable_interrupts(GLOBAL);                // povol preruseni  
291
00DC:  MOVLW  C0
292
00DD:  IORWF  0B,F
293
.................... }  
294
00DE:  BCF    0A.3
295
00DF:  GOTO   1EF (RETURN)
296
....................   
297
....................   
298
.................... // Globalni promenna pro mereni casu  
299
.................... //   Nastavuje se procedurou TimeSet()  
300
.................... //   Testuje se funkci TimeIf()  
301
.................... //   Modifikuje se pri preruseni od casovace IntTo()  
302
.................... unsigned int16 TimeTime;  
303
....................   
304
....................   
305
.................... void TimerSet(unsigned int16 Time)  
306
.................... // Nastavi casovac na zadany pocet ms  
307
.................... // Test uplynuti casu se dela pomoci TimerIf()  
308
.................... {  
309
....................    // Nastav hodnotu  
310
....................    disable_interrupts(INT_RTCC);    // nesmi prijit preruseni  
311
*
312
0199:  BCF    0B.5
313
....................    TimeTime=Time;                   // pri nastavovani hodnoty  
314
019A:  MOVF   3E,W
315
019B:  MOVWF  2C
316
019C:  MOVF   3D,W
317
019D:  MOVWF  2B
318
....................    enable_interrupts(INT_RTCC);     // promenne (o delce vice nez 8 bitu)  
319
019E:  BSF    0B.5
320
.................... }  
321
019F:  RETLW  00
322
....................   
323
....................   
324
.................... int1 TimerIf()  
325
.................... // Vraci TRUE pokud casovac jiz dobehl  
326
.................... {  
327
....................    int1 Flag;                       // pomocna promenna  
328
....................   
329
....................    // Otestuj casovac  
330
....................    disable_interrupts(INT_RTCC);    // nesmi prijit preruseni  
331
01A0:  BCF    0B.5
332
....................    Flag=(TimeTime==0);              // behem testu promenne  
333
01A1:  MOVF   2B,F
334
01A2:  BTFSS  03.2
335
01A3:  GOTO   1A7
336
01A4:  MOVF   2C,F
337
01A5:  BTFSC  03.2
338
01A6:  GOTO   1A9
339
01A7:  MOVLW  00
340
01A8:  GOTO   1AA
341
01A9:  MOVLW  01
342
01AA:  MOVWF  78
343
01AB:  BTFSC  78.0
344
01AC:  GOTO   1AF
345
01AD:  BCF    3D.0
346
01AE:  GOTO   1B0
347
01AF:  BSF    3D.0
348
....................    enable_interrupts(INT_RTCC);     // ted uz muze  
349
01B0:  BSF    0B.5
350
....................   
351
....................    // Navratova hodnota  
352
....................    return Flag;                     // TRUE znamena dobehl casovac  
353
01B1:  MOVLW  00
354
01B2:  BTFSC  3D.0
355
01B3:  MOVLW  01
356
01B4:  MOVWF  78
357
.................... }  
358
01B5:  RETLW  00
359
....................   
360
....................   
361
.................... // Globalni promenne pro akceleraci  
362
.................... //   Nastavuje se metodou MotorStart()  
363
.................... //   Pouziva se v obsluze preruseni IntT0()  
364
.................... unsigned int8 MotorTime;            // aktualni casovac pro rozjezd  
365
.................... unsigned int8 MotorDelay;           // spozdeni mezi razenim  
366
.................... unsigned int8 MotorGear;            // rychlostni stupen  
367
....................   
368
....................   
369
.................... void MotorStart(unsigned int8 Delay)  
370
.................... // Provede rizeny rozjezd motoru  
371
.................... {  
372
....................    disable_interrupts(INT_RTCC);  
373
01B6:  BCF    0B.5
374
....................    MotorGear=1;  
375
01B7:  MOVLW  01
376
01B8:  MOVWF  2F
377
....................    MotorDelay=Delay;  
378
01B9:  MOVF   3D,W
379
01BA:  MOVWF  2E
380
....................    MotorTime=MotorDelay;  
381
01BB:  MOVF   2E,W
382
01BC:  MOVWF  2D
383
....................    enable_interrupts(INT_RTCC);  
384
01BD:  BSF    0B.5
385
01BE:  CLRF   29
386
01BF:  BTFSC  0B.7
387
01C0:  BSF    29.7
388
01C1:  BCF    0B.7
389
....................   
390
....................    MotorPatternSet(1);  
391
01C2:  MOVLW  01
392
01C3:  MOVWF  44
393
01C4:  CALL   08E
394
01C5:  BTFSC  29.7
395
01C6:  BSF    0B.7
396
.................... }  
397
01C7:  RETLW  00
398
....................   
399
....................   
400
.................... #INT_TIMER0  
401
.................... void IntT0()  
402
.................... // Preruseni od casovace cca 1000x za sekundu  
403
.................... {  
404
....................    // Odpocitavani casovace  
405
....................    if (TimeTime) TimeTime--;  
406
*
407
00B7:  MOVF   2B,W
408
00B8:  IORWF  2C,W
409
00B9:  BTFSC  03.2
410
00BA:  GOTO   0BF
411
00BB:  MOVF   2B,W
412
00BC:  BTFSC  03.2
413
00BD:  DECF   2C,F
414
00BE:  DECF   2B,F
415
....................   
416
....................    // Obsluha akcelerace  
417
....................    if (MotorTime) MotorTime--;                           // dekrementuj casovac rozjezdu  
418
00BF:  MOVF   2D,F
419
00C0:  BTFSS  03.2
420
00C1:  DECF   2D,F
421
....................    if ((MotorGear>0) && (MotorGear<8) && (!MotorTime))   // dalsi rychlostni stupen  
422
00C2:  MOVF   2F,F
423
00C3:  BTFSC  03.2
424
00C4:  GOTO   0D2
425
00C5:  MOVF   2F,W
426
00C6:  SUBLW  07
427
00C7:  BTFSS  03.0
428
00C8:  GOTO   0D2
429
00C9:  MOVF   2D,F
430
00CA:  BTFSS  03.2
431
00CB:  GOTO   0D2
432
....................    {  
433
....................       MotorTime=MotorDelay;         // znovu nastav casovac  
434
00CC:  MOVF   2E,W
435
00CD:  MOVWF  2D
436
....................       MotorGear++;                  // dalsi rychlost  
437
00CE:  INCF   2F,F
438
....................       MotorPatternSet(MotorGear);   // nastav rychlost  
439
00CF:  MOVF   2F,W
440
00D0:  MOVWF  44
441
00D1:  CALL   08E
442
....................    }  
443
.................... }  
444
....................   
445
....................   
446
.................... // Cteni dat z AD prevodniku, zadava se cislo kanalu  
447
00D2:  BCF    0B.2
448
00D3:  BCF    0A.3
449
00D4:  GOTO   026
450
.................... int8 ReadAD(int8 Ch)  
451
.................... {  
452
....................    // Pokud merim Vref zapnu si jeho napajeni  
453
....................    if (Ch==4) output_high(REFPOWER);  
454
*
455
00E0:  MOVF   3D,W
456
00E1:  SUBLW  04
457
00E2:  BTFSS  03.2
458
00E3:  GOTO   0E8
459
00E4:  BSF    03.5
460
00E5:  BCF    06.1
461
00E6:  BCF    03.5
462
00E7:  BSF    06.1
463
....................   
464
....................    // Inicializace a cislo kanalu  
465
....................    ADCON1=0x30;         // Vref+-, bez deleni hodin, Left Justify  
466
00E8:  MOVLW  30
467
00E9:  BSF    03.5
468
00EA:  MOVWF  1F
469
....................    ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu  
470
00EB:  BCF    03.5
471
00EC:  RLF    3D,W
472
00ED:  MOVWF  77
473
00EE:  RLF    77,F
474
00EF:  RLF    77,F
475
00F0:  MOVLW  F8
476
00F1:  ANDWF  77,F
477
00F2:  MOVF   77,W
478
00F3:  ADDLW  41
479
00F4:  MOVWF  1F
480
....................   
481
....................    // Mereni  
482
....................    delay_us(50);        // doba na prepnuti kanalu  
483
00F5:  CLRWDT
484
00F6:  MOVLW  10
485
00F7:  MOVWF  77
486
00F8:  DECFSZ 77,F
487
00F9:  GOTO   0F8
488
00FA:  NOP
489
00FB:  NOP
490
....................    ADCON0 |= 4;         // start prevodu  
491
00FC:  BSF    1F.2
492
....................    delay_us(50);        // doba na prevod  
493
00FD:  CLRWDT
494
00FE:  MOVLW  10
495
00FF:  MOVWF  77
496
0100:  DECFSZ 77,F
497
0101:  GOTO   100
498
0102:  NOP
499
0103:  NOP
500
....................   
501
....................    // Vypnu napajeni Vref (vzdycky)  
502
....................    output_low(REFPOWER);  
503
0104:  BSF    03.5
504
0105:  BCF    06.1
505
0106:  BCF    03.5
506
0107:  BCF    06.1
507
....................   
508
....................    // Navrat hodnoty  
509
....................    return ADRESH;  
510
0108:  MOVF   1E,W
511
0109:  MOVWF  78
512
.................... }  
513
010A:  RETLW  00
514
....................   
515
....................   
516
.................... void main()  
517
.................... {  
518
*
519
01C8:  CLRF   04
520
01C9:  MOVLW  1F
521
01CA:  ANDWF  03,F
522
01CB:  BSF    03.5
523
01CC:  BCF    1F.4
524
01CD:  BCF    1F.5
525
01CE:  MOVF   1B,W
526
01CF:  ANDLW  80
527
01D0:  MOVWF  1B
528
01D1:  MOVLW  07
529
01D2:  MOVWF  1C
530
01D3:  MOVF   05,W
531
01D4:  CLRWDT
532
01D5:  MOVF   1C,W
533
01D6:  BCF    03.5
534
01D7:  BCF    0D.6
535
....................    unsigned int8 Debug;  
536
....................    unsigned int8 i;  
537
....................   
538
....................    // Hodiny  
539
....................    OSCCON = 0x62;          // 4 MHz interni RC oscilator  
540
01D8:  MOVLW  62
541
01D9:  BSF    03.5
542
01DA:  MOVWF  0F
543
.................... /*  
544
....................    // Digitalni vystupy  
545
....................    output_low(PWM);        // PWM vystup  
546
....................    output_low(MOTOR);      // Proud do motoru  
547
....................    output_low(REFPOWER);   // Napajeni Vref  
548
....................    port_b_pullups(TRUE);   // Zbyvajici vyvody portu B  
549
....................   
550
....................    // Watch Dog  
551
....................    PSA=0;                  // preddelic prirazen casovaci  
552
....................    WDTCON=0x0E;            // Watch Dog cca 130ms  
553
....................    // Analogove vstupy  
554
....................    ANSEL = 0x1F;           // AN0 az AN4  
555
....................   
556
....................    // nastaveni RS232  
557
....................    InitRS232();            // inicializace HW RS232 (nutno pockat cca 10ms)  
558
....................   
559
....................    // Pipnuti (a cekani)  
560
....................    for (i=1;i<30;i++)      // pocet 1/2 period  
561
....................    {  
562
....................       int1 beep;           // stavova promenna pro pipak  
563
....................   
564
....................       output_bit(BEEP0,beep);  
565
....................       beep=~beep;  
566
....................       output_bit(BEEP1,beep);  
567
....................       delay_us(1000);  
568
....................    }  
569
....................   
570
....................    // Rozhodnuti o rezimu cinnosti  
571
....................    Debug=0;  
572
....................    if (~input(SW0)) Debug|=1;    // precti bit 0  
573
....................    if (~input(SW1)) Debug|=2;    // precti bit 1  
574
....................    output_low(SW0);              // nastav L aby se snizila spotreba  
575
....................    output_low(SW1);              // na obou vstupech  
576
....................   
577
....................    // Zobrazeni rezimu  
578
....................    printf(Putc,"\fMode:%d",Debug);  
579
.................... */  
580
....................    // Inicializace PWM  
581
....................    PR2     = 0x1F;      // perioda PWM casovace  
582
01DB:  MOVLW  1F
583
01DC:  MOVWF  12
584
....................    T2CON   = 0x04;      // povoleni casovace T2 bez preddelicu a postdelicu  
585
01DD:  MOVLW  04
586
01DE:  BCF    03.5
587
01DF:  MOVWF  12
588
....................    CCP1CON = 0x0C;      // PWM mode, lsb bity nulove  
589
01E0:  MOVLW  0C
590
01E1:  MOVWF  17
591
....................    CCPR1L  =    0;      // na zacatku nulova data  
592
01E2:  CLRF   15
593
....................    output_low(PWM);     // PWM vystup  
594
01E3:  BSF    03.5
595
01E4:  BCF    06.3
596
01E5:  BCF    03.5
597
01E6:  BCF    06.3
598
....................   
599
.................... //!!!KAKL  
600
.................... CCPR1L = 20;              // pouziti vystupu  
601
01E7:  MOVLW  14
602
01E8:  MOVWF  15
603
.................... disable_interrupts(GLOBAL);  
604
01E9:  BCF    0B.6
605
01EA:  BCF    0B.7
606
01EB:  BTFSC  0B.7
607
01EC:  GOTO   1EA
608
.................... while(true);  
609
01ED:  GOTO   1ED
610
....................   
611
....................    // Inicializace casovace  
612
....................    InitT0();            // nastav casovac na cca 1ms  
613
01EE:  GOTO   0D5
614
....................   
615
.................... //!!!KAKL  
616
.................... Debug=3;  
617
01EF:  MOVLW  03
618
01F0:  MOVWF  30
619
....................   
620
....................    // Test menice PWM a rozjezdoveho PWM  
621
....................    if (Debug==1)  
622
01F1:  DECFSZ 30,W
623
01F2:  GOTO   22C
624
....................    {  
625
....................       unsigned int8 Data1;       // poteniometr P1 = PWM  
626
....................       unsigned int8 Data2;       // poteniometr P2 = Rozjezd  
627
....................   
628
....................       while (1)  
629
....................       {  
630
....................          // watch dog  
631
....................          restart_wdt();  
632
01F3:  CLRWDT
633
....................   
634
....................          // mereni vstupu  
635
....................          Data1=ReadAD(0);        // nacti parametr pro PWM  
636
01F4:  CLRF   3D
637
01F5:  CALL   0E0
638
01F6:  MOVF   78,W
639
01F7:  MOVWF  32
640
....................          Data1>>=2;              // redukuj rozsah na 0 az 63  
641
01F8:  RRF    32,F
642
01F9:  RRF    32,F
643
01FA:  MOVLW  3F
644
01FB:  ANDWF  32,F
645
....................          Data2=ReadAD(1);        // nacti parametr pro rozjezd  
646
01FC:  MOVLW  01
647
01FD:  MOVWF  3D
648
01FE:  CALL   0E0
649
01FF:  MOVF   78,W
650
0200:  MOVWF  33
651
....................          Data2>>=4;              // redukuj rozsah na 0 az 15  
652
0201:  SWAPF  33,F
653
0202:  MOVLW  0F
654
0203:  ANDWF  33,F
655
....................   
656
....................          // zobrazeni  
657
....................          printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2);  
658
0204:  CLRF   3D
659
0205:  MOVF   3D,W
660
0206:  CALL   049
661
0207:  INCF   3D,F
662
0208:  MOVWF  77
663
0209:  MOVWF  41
664
020A:  CALL   10B
665
020B:  MOVLW  05
666
020C:  SUBWF  3D,W
667
020D:  BTFSS  03.2
668
020E:  GOTO   205
669
020F:  MOVF   32,W
670
0210:  MOVWF  3F
671
0211:  CLRF   40
672
0212:  CALL   129
673
0213:  MOVLW  09
674
0214:  MOVWF  3E
675
0215:  MOVF   3E,W
676
0216:  CALL   049
677
0217:  INCF   3E,F
678
0218:  MOVWF  77
679
0219:  MOVWF  41
680
021A:  CALL   10B
681
021B:  MOVLW  0E
682
021C:  SUBWF  3E,W
683
021D:  BTFSS  03.2
684
021E:  GOTO   215
685
021F:  MOVF   33,W
686
0220:  MOVWF  3F
687
0221:  CLRF   40
688
0222:  CALL   129
689
....................          delay_ms(20);  
690
0223:  MOVLW  14
691
0224:  MOVWF  3D
692
0225:  CALL   176
693
....................   
694
....................          // nastaveni parametru PWM  
695
....................          CCPR1L = Data1;  
696
0226:  MOVF   32,W
697
0227:  MOVWF  15
698
....................   
699
....................          // nastaveni parametru RUN  
700
....................          MotorSet(Data2);  
701
0228:  MOVF   33,W
702
0229:  MOVWF  3D
703
022A:  CALL   18D
704
....................       }  
705
022B:  GOTO   1F3
706
....................    }  
707
....................   
708
....................    // Testovani rozjezdu  
709
....................    // Zadava se cas mezi stupni razeni pro rozjezd v ms  
710
....................    if (Debug==2)  
711
022C:  MOVF   30,W
712
022D:  SUBLW  02
713
022E:  BTFSS  03.2
714
022F:  GOTO   27D
715
....................    {  
716
....................       int8 Data;  
717
....................       int8 Start;  
718
....................   
719
....................       Start=0;                               // uvodni stav  
720
0230:  CLRF   35
721
....................       while(1)  
722
....................       {  
723
....................          // Nacti a zobraz parametr  
724
....................          Data=ReadAD(1);                     // potenciometr P2 = rozjezd  
725
0231:  MOVLW  01
726
0232:  MOVWF  3D
727
0233:  CALL   0E0
728
0234:  MOVF   78,W
729
0235:  MOVWF  34
730
....................          printf(Putc,"\nRUN: %3ums ",Data);  // zobraz  
731
0236:  CLRF   3D
732
0237:  MOVF   3D,W
733
0238:  CALL   060
734
0239:  INCF   3D,F
735
023A:  MOVWF  77
736
023B:  MOVWF  41
737
023C:  CALL   10B
738
023D:  MOVLW  06
739
023E:  SUBWF  3D,W
740
023F:  BTFSS  03.2
741
0240:  GOTO   237
742
0241:  MOVF   34,W
743
0242:  MOVWF  3F
744
0243:  MOVLW  10
745
0244:  MOVWF  40
746
0245:  CALL   129
747
0246:  MOVLW  6D
748
0247:  MOVWF  41
749
0248:  CALL   10B
750
0249:  MOVLW  73
751
024A:  MOVWF  41
752
024B:  CALL   10B
753
024C:  MOVLW  20
754
024D:  MOVWF  41
755
024E:  CALL   10B
756
....................          delay_ms(10);                       // prodleva pro terminal  
757
024F:  MOVLW  0A
758
0250:  MOVWF  3D
759
0251:  CALL   176
760
....................   
761
....................          // Uvodni pauza  
762
....................          if (Start==0)                       // spousti se 1x na zacatku  
763
0252:  MOVF   35,F
764
0253:  BTFSS  03.2
765
0254:  GOTO   25B
766
....................          {  
767
....................             Start++;                         // dalsi stav je cekani  
768
0255:  INCF   35,F
769
....................             TimerSet(2000);                  // na dokonceni uvodni prodlevy  
770
0256:  MOVLW  07
771
0257:  MOVWF  3E
772
0258:  MOVLW  D0
773
0259:  MOVWF  3D
774
025A:  CALL   199
775
....................          }  
776
....................   
777
....................          // Rozjezd  
778
....................          if ((Start==1) && TimerIf())  
779
025B:  DECFSZ 35,W
780
025C:  GOTO   26D
781
025D:  CALL   1A0
782
025E:  MOVF   78,F
783
025F:  BTFSC  03.2
784
0260:  GOTO   26D
785
....................          {  
786
....................             Start++;  
787
0261:  INCF   35,F
788
....................             printf(Putc,"R");  
789
0262:  MOVLW  52
790
0263:  MOVWF  41
791
0264:  CALL   10B
792
....................             MotorStart(Data);                // rozjezd s nastavenim prodlevy  
793
0265:  MOVF   34,W
794
0266:  MOVWF  3D
795
0267:  CALL   1B6
796
....................   
797
....................             TimerSet(2000);                  // nastav celkovy cas jizdy  
798
0268:  MOVLW  07
799
0269:  MOVWF  3E
800
026A:  MOVLW  D0
801
026B:  MOVWF  3D
802
026C:  CALL   199
803
....................          }  
804
....................   
805
....................          // Zastaveni  
806
....................          if ((Start==2) && TimerIf())  
807
026D:  MOVF   35,W
808
026E:  SUBLW  02
809
026F:  BTFSS  03.2
810
0270:  GOTO   27B
811
0271:  CALL   1A0
812
0272:  MOVF   78,F
813
0273:  BTFSC  03.2
814
0274:  GOTO   27B
815
....................          {  
816
....................             Start++;  
817
0275:  INCF   35,F
818
....................             printf(Putc,"S");  
819
0276:  MOVLW  53
820
0277:  MOVWF  41
821
0278:  CALL   10B
822
....................             MotorSet(0);                     // pokud dobehl casovac zastav motor  
823
0279:  CLRF   3D
824
027A:  CALL   18D
825
....................          }  
826
....................   
827
....................          // watch dog  
828
....................          restart_wdt();  
829
027B:  CLRWDT
830
....................       }  
831
027C:  GOTO   231
832
....................    }  
833
....................   
834
....................    // Test nabijeciho algoritmu  
835
....................    if (Debug==3)  
836
027D:  MOVF   30,W
837
027E:  SUBLW  03
838
027F:  BTFSS  03.2
839
0280:  GOTO   2DB
840
....................    {  
841
....................       unsigned int8 PwmOut;   // akcni hodnota pro PWM  
842
....................       unsigned int8 Req;      // pozadovana hodnota z P1  
843
....................       unsigned int8 Vref;     // merena hodnota vref  
844
....................   
845
....................       // Inicializace stavove promenne  
846
....................       PwmOut=0;  
847
0281:  CLRF   36
848
....................   
849
....................       // Hlavni smycka  
850
....................       while (1)  
851
....................       {  
852
....................          // watch dog  
853
....................          restart_wdt();  
854
0282:  CLRWDT
855
....................   
856
....................          // pozadovana hodnota (potenciometr P1)  
857
....................          Req=ReadAD(0);  
858
0283:  CLRF   3D
859
0284:  CALL   0E0
860
0285:  MOVF   78,W
861
0286:  MOVWF  37
862
....................          Req=50+(ReadAD(0)>>1);                      // 50 az 177  
863
0287:  CLRF   3D
864
0288:  CALL   0E0
865
0289:  BCF    03.0
866
028A:  RRF    78,W
867
028B:  ADDLW  32
868
028C:  MOVWF  37
869
....................   
870
....................          // napeti na napajeni (vref)  
871
....................          Vref=ReadAD(4);  
872
028D:  MOVLW  04
873
028E:  MOVWF  3D
874
028F:  CALL   0E0
875
0290:  MOVF   78,W
876
0291:  MOVWF  38
877
....................   
878
....................          // ricici algoritmus  
879
....................          if ((Vref<Req) &&(PwmOut<30)) PwmOut++;  
880
0292:  MOVF   37,W
881
0293:  SUBWF  38,W
882
0294:  BTFSC  03.0
883
0295:  GOTO   29A
884
0296:  MOVF   36,W
885
0297:  SUBLW  1D
886
0298:  BTFSC  03.0
887
0299:  INCF   36,F
888
....................          if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;  
889
029A:  MOVF   37,W
890
029B:  SUBWF  38,W
891
029C:  BTFSS  03.0
892
029D:  GOTO   2A1
893
029E:  MOVF   36,F
894
029F:  BTFSS  03.2
895
02A0:  DECF   36,F
896
....................          Vref+=10;  
897
02A1:  MOVLW  0A
898
02A2:  ADDWF  38,F
899
....................          if ((Vref<(Req))&&(PwmOut<30)) PwmOut++;    // urychleni nabehu  
900
02A3:  MOVF   37,W
901
02A4:  SUBWF  38,W
902
02A5:  BTFSC  03.0
903
02A6:  GOTO   2AB
904
02A7:  MOVF   36,W
905
02A8:  SUBLW  1D
906
02A9:  BTFSC  03.0
907
02AA:  INCF   36,F
908
....................   
909
....................          // nastaveni parametru PWM  
910
....................          if (PwmOut>24) PwmOut=24;     // saturace  
911
02AB:  MOVF   36,W
912
02AC:  SUBLW  18
913
02AD:  BTFSC  03.0
914
02AE:  GOTO   2B1
915
02AF:  MOVLW  18
916
02B0:  MOVWF  36
917
.................... //!!!KAKL  
918
.................... PwmOut=20;  
919
02B1:  MOVLW  14
920
02B2:  MOVWF  36
921
....................          CCPR1L = PwmOut;              // pouziti vystupu  
922
02B3:  MOVF   36,W
923
02B4:  MOVWF  15
924
.................... disable_interrupts(GLOBAL);  
925
02B5:  BCF    0B.6
926
02B6:  BCF    0B.7
927
02B7:  BTFSC  0B.7
928
02B8:  GOTO   2B6
929
.................... while(true);  
930
02B9:  GOTO   2B9
931
....................          // zobrazeni  
932
....................          printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);  
933
02BA:  CLRF   3D
934
02BB:  MOVF   3D,W
935
02BC:  CALL   071
936
02BD:  INCF   3D,F
937
02BE:  MOVWF  77
938
02BF:  MOVWF  41
939
02C0:  CALL   10B
940
02C1:  MOVLW  05
941
02C2:  SUBWF  3D,W
942
02C3:  BTFSS  03.2
943
02C4:  GOTO   2BB
944
02C5:  MOVF   37,W
945
02C6:  MOVWF  3F
946
02C7:  CLRF   40
947
02C8:  CALL   129
948
02C9:  MOVLW  20
949
02CA:  MOVWF  41
950
02CB:  CALL   10B
951
02CC:  MOVF   38,W
952
02CD:  MOVWF  3F
953
02CE:  CLRF   40
954
02CF:  CALL   129
955
02D0:  MOVLW  20
956
02D1:  MOVWF  41
957
02D2:  CALL   10B
958
02D3:  MOVF   36,W
959
02D4:  MOVWF  3F
960
02D5:  CLRF   40
961
02D6:  CALL   129
962
....................          delay_ms(10);  
963
02D7:  MOVLW  0A
964
02D8:  MOVWF  3D
965
02D9:  CALL   176
966
....................       }  
967
02DA:  GOTO   282
968
....................    }  
969
....................   
970
....................    // Standardni beh  
971
....................    if (Debug==0)  
972
02DB:  MOVF   30,F
973
02DC:  BTFSS  03.2
974
02DD:  GOTO   341
975
....................    {  
976
....................       unsigned int8 PwmOut;   // akcni hodnota pro PWM  
977
....................       unsigned int8 Req;      // pozadovana hodnota z P1  
978
....................       unsigned int8 Vref;     // merena hodnota vref  
979
....................       int1 Run;  
980
....................   
981
....................       // Inicializace stavove promenne  
982
....................       PwmOut=0;  
983
02DE:  CLRF   39
984
....................       TimerSet(14000);        // casovani startu  
985
02DF:  MOVLW  36
986
02E0:  MOVWF  3E
987
02E1:  MOVLW  B0
988
02E2:  MOVWF  3D
989
02E3:  CALL   199
990
....................       Run=1;  
991
02E4:  BSF    3C.0
992
....................   
993
....................       // Hlavni smycka  
994
....................       while (1)  
995
....................       {  
996
....................          // watch dog  
997
....................          restart_wdt();  
998
02E5:  CLRWDT
999
....................   
1000
....................          // pozadovana hodnota (potenciometr P1)  
1001
....................          Req=ReadAD(0);  
1002
02E6:  CLRF   3D
1003
02E7:  CALL   0E0
1004
02E8:  MOVF   78,W
1005
02E9:  MOVWF  3A
1006
....................          Req=50+(ReadAD(0)>>1);                      // 50 az 177  
1007
02EA:  CLRF   3D
1008
02EB:  CALL   0E0
1009
02EC:  BCF    03.0
1010
02ED:  RRF    78,W
1011
02EE:  ADDLW  32
1012
02EF:  MOVWF  3A
1013
....................   
1014
....................          // napeti na napajeni (vref)  
1015
....................          Vref=ReadAD(4);  
1016
02F0:  MOVLW  04
1017
02F1:  MOVWF  3D
1018
02F2:  CALL   0E0
1019
02F3:  MOVF   78,W
1020
02F4:  MOVWF  3B
1021
....................   
1022
....................          // ricici algoritmus  
1023
....................          if ((Vref<Req) &&(PwmOut<30)) PwmOut++;  
1024
02F5:  MOVF   3A,W
1025
02F6:  SUBWF  3B,W
1026
02F7:  BTFSC  03.0
1027
02F8:  GOTO   2FD
1028
02F9:  MOVF   39,W
1029
02FA:  SUBLW  1D
1030
02FB:  BTFSC  03.0
1031
02FC:  INCF   39,F
1032
....................          if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;  
1033
02FD:  MOVF   3A,W
1034
02FE:  SUBWF  3B,W
1035
02FF:  BTFSS  03.0
1036
0300:  GOTO   304
1037
0301:  MOVF   39,F
1038
0302:  BTFSS  03.2
1039
0303:  DECF   39,F
1040
....................          Vref+=10;  
1041
0304:  MOVLW  0A
1042
0305:  ADDWF  3B,F
1043
....................          if ((Vref<(Req))&&(PwmOut<30)) PwmOut++;    // urychleni nabehu  
1044
0306:  MOVF   3A,W
1045
0307:  SUBWF  3B,W
1046
0308:  BTFSC  03.0
1047
0309:  GOTO   30E
1048
030A:  MOVF   39,W
1049
030B:  SUBLW  1D
1050
030C:  BTFSC  03.0
1051
030D:  INCF   39,F
1052
....................   
1053
....................          // nastaveni parametru PWM  
1054
....................          if (PwmOut>24) PwmOut=24;     // saturace  
1055
030E:  MOVF   39,W
1056
030F:  SUBLW  18
1057
0310:  BTFSC  03.0
1058
0311:  GOTO   314
1059
0312:  MOVLW  18
1060
0313:  MOVWF  39
1061
....................          CCPR1L = PwmOut;              // pouziti vystupu  
1062
0314:  MOVF   39,W
1063
0315:  MOVWF  15
1064
....................   
1065
....................          // zobrazeni  
1066
....................          printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);  
1067
0316:  CLRF   3D
1068
0317:  MOVF   3D,W
1069
0318:  CALL   071
1070
0319:  INCF   3D,F
1071
031A:  MOVWF  77
1072
031B:  MOVWF  41
1073
031C:  CALL   10B
1074
031D:  MOVLW  05
1075
031E:  SUBWF  3D,W
1076
031F:  BTFSS  03.2
1077
0320:  GOTO   317
1078
0321:  MOVF   3A,W
1079
0322:  MOVWF  3F
1080
0323:  CLRF   40
1081
0324:  CALL   129
1082
0325:  MOVLW  20
1083
0326:  MOVWF  41
1084
0327:  CALL   10B
1085
0328:  MOVF   3B,W
1086
0329:  MOVWF  3F
1087
032A:  CLRF   40
1088
032B:  CALL   129
1089
032C:  MOVLW  20
1090
032D:  MOVWF  41
1091
032E:  CALL   10B
1092
032F:  MOVF   39,W
1093
0330:  MOVWF  3F
1094
0331:  CLRF   40
1095
0332:  CALL   129
1096
....................          delay_ms(10);  
1097
0333:  MOVLW  0A
1098
0334:  MOVWF  3D
1099
0335:  CALL   176
1100
....................   
1101
....................          // rozjezd  
1102
....................          if (TimerIf()&&Run)  
1103
0336:  CALL   1A0
1104
0337:  MOVF   78,F
1105
0338:  BTFSC  03.2
1106
0339:  GOTO   340
1107
033A:  BTFSS  3C.0
1108
033B:  GOTO   340
1109
....................          {  
1110
....................             Run=0;  
1111
033C:  BCF    3C.0
1112
....................             MotorStart(65);  
1113
033D:  MOVLW  41
1114
033E:  MOVWF  3D
1115
033F:  CALL   1B6
1116
....................          }  
1117
....................       }  
1118
0340:  GOTO   2E5
1119
....................    }  
1120
.................... }  
1121
....................  
1122
0341:  SLEEP
1123
 
1124
Configuration Fuses:
1125
   Word  1: 2F38   NOWDT NOPUT MCLR NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG CCPB3 NOPROTECT INTRC_IO
1126
   Word  2: 3FFF   FCMEN IESO