Rev Author Line No. Line
3463 kaklik 1 CCS PCM C Compiler, Version 4.106, 47914 04-II-14 15:49
3458 kaklik 2  
3462 kaklik 3 Filename: Z:\home\kaklik\svn\svnMLAB\Designs\Measuring_instruments\RMDS01C\SW\PIC16F887\main.lst
3458 kaklik 4  
3463 kaklik 5 ROM used: 421 words (5%)
3458 kaklik 6 Largest free fragment is 2048
3463 kaklik 7 RAM used: 31 (8%) at main() level
8 37 (10%) worst case
3462 kaklik 9 Stack: 3 worst case (1 in main + 2 for interrupts)
3458 kaklik 10  
11 *
3463 kaklik 12 0000: MOVLW 01
3458 kaklik 13 0001: MOVWF 0A
3463 kaklik 14 0002: GOTO 111
3458 kaklik 15 0003: NOP
16 0004: MOVWF 7F
17 0005: SWAPF 03,W
18 0006: CLRF 03
19 0007: MOVWF 21
20 0008: MOVF 0A,W
21 0009: MOVWF 20
22 000A: CLRF 0A
23 000B: MOVF 04,W
24 000C: MOVWF 22
25 000D: MOVF 77,W
26 000E: MOVWF 23
27 000F: MOVF 78,W
28 0010: MOVWF 24
29 0011: MOVF 79,W
30 0012: MOVWF 25
31 0013: MOVF 7A,W
32 0014: MOVWF 26
33 0015: BCF 03.7
34 0016: BCF 03.5
3463 kaklik 35 0017: MOVLW 8C
36 0018: MOVWF 04
37 0019: BTFSS 00.3
38 001A: GOTO 01D
39 001B: BTFSC 0C.3
40 001C: GOTO 02E
41 001D: MOVF 22,W
42 001E: MOVWF 04
43 001F: MOVF 23,W
44 0020: MOVWF 77
45 0021: MOVF 24,W
46 0022: MOVWF 78
47 0023: MOVF 25,W
48 0024: MOVWF 79
49 0025: MOVF 26,W
50 0026: MOVWF 7A
51 0027: MOVF 20,W
52 0028: MOVWF 0A
53 0029: SWAPF 21,W
54 002A: MOVWF 03
55 002B: SWAPF 7F,F
56 002C: SWAPF 7F,W
57 002D: RETFIE
58 002E: BCF 0A.3
59 002F: BCF 0A.4
60 0030: GOTO 03E
61 .................... #define ID "$Id: main.c 2916 2013-04-14 17:42:03Z kaklik $"
3458 kaklik 62 .................... #include "main.h"
63 .................... #include <16F887.h>
64 .................... //////// Standard Header file for the PIC16F887 device ////////////////
65 .................... #device PIC16F887
66 .................... #list
67 ....................
68 .................... #device adc=8
69 ....................
70 .................... #FUSES NOWDT //No Watch Dog Timer
71 .................... #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
72 .................... #FUSES NOPUT //No Power Up Timer
73 .................... #FUSES MCLR //Master Clear pin enabled
74 .................... #FUSES NOPROTECT //Code not protected from reading
75 .................... #FUSES NOCPD //No EE protection
76 .................... #FUSES NOBROWNOUT //No brownout reset
77 .................... #FUSES IESO //Internal External Switch Over mode enabled
78 .................... #FUSES FCMEN //Fail-safe clock monitor enabled
79 .................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
80 .................... #FUSES NODEBUG //No Debug mode for ICD
81 .................... #FUSES NOWRT //Program memory not write protected
82 .................... #FUSES BORV40 //Brownout reset at 4.0V
83 ....................
84 .................... #use delay(clock=20000000)
85 *
3463 kaklik 86 00D8: MOVLW 3A
87 00D9: MOVWF 04
88 00DA: BCF 03.7
89 00DB: MOVF 00,W
90 00DC: BTFSC 03.2
91 00DD: GOTO 0EB
92 00DE: MOVLW 06
93 00DF: MOVWF 78
94 00E0: CLRF 77
95 00E1: DECFSZ 77,F
96 00E2: GOTO 0E1
97 00E3: DECFSZ 78,F
98 00E4: GOTO 0E0
99 00E5: MOVLW 7B
100 00E6: MOVWF 77
101 00E7: DECFSZ 77,F
102 00E8: GOTO 0E7
103 00E9: DECFSZ 00,F
104 00EA: GOTO 0DE
105 00EB: BCF 0A.3
106 00EC: BCF 0A.4
107 00ED: GOTO 179 (RETURN)
3458 kaklik 108 .................... #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
109 ....................
110 ....................
111 ....................
3463 kaklik 112 .................... #use i2c(SLAVE, Fast, sda=PIN_C4, scl=PIN_C3, force_hw, address=0xA2)
3462 kaklik 113 *
3463 kaklik 114 0031: MOVF 13,W
115 0032: MOVF 3F,W
116 0033: MOVWF 13
117 0034: BSF 14.4
118 0035: BCF 0C.3
119 0036: BSF 03.5
120 0037: BTFSC 14.0
121 0038: GOTO 037
122 0039: CLRF 78
123 003A: BCF 03.5
124 003B: BTFSC 14.4
125 003C: INCF 78,F
126 003D: RETURN
3462 kaklik 127 ....................
3463 kaklik 128 .................... //#include <string.h>
3462 kaklik 129 ....................
3458 kaklik 130 .................... #define LED PIN_E1
131 .................... #define CE PIN_E2
132 ....................
3462 kaklik 133 .................... #define SEL0 PIN_E0 // external counter division ratio
134 .................... #define SEL1 PIN_E1 // external counter division ratio
135 .................... #define MR PIN_E2 // external counter master reset
136 .................... #define CLKI PIN_C0 // internal counter input
137 .................... #define BEEP PIN_C3 // buzzer
3458 kaklik 138 ....................
3462 kaklik 139 .................... unsigned int32 count;
3458 kaklik 140 ....................
3463 kaklik 141 .................... const int8 buf_len=8;
142 .................... int8 buffer[buf_len]; // I2C buffer
143 .................... int8 address=0;
3462 kaklik 144 ....................
145 .................... unsigned int16 of=0; // count of overflow
146 ....................
3458 kaklik 147 .................... const char cmd[40]={0xB5, 0x62, 0x06, 0x31, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x80, 0x84, 0x1E, 0x00, 0xE0, 0xC8, 0x10, 0x00, 0x40, 0x42, 0x0F, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x00, 0x12, 0x03};
148 ....................
3463 kaklik 149 ....................
3458 kaklik 150 .................... #INT_SSP
151 .................... void ssp_interupt ()
152 .................... {
3463 kaklik 153 .................... BYTE incoming, state;
3458 kaklik 154 ....................
155 .................... state = i2c_isr_state();
3463 kaklik 156 003E: BSF 03.5
157 003F: BTFSC 14.5
158 0040: GOTO 049
159 0041: BCF 03.5
160 0042: CLRF 38
161 0043: BSF 03.5
162 0044: BTFSS 14.2
163 0045: GOTO 049
164 0046: BCF 03.5
165 0047: BSF 38.7
166 0048: BSF 03.5
167 0049: BCF 03.5
168 004A: MOVF 38,W
169 004B: INCF 38,F
170 004C: MOVWF 3D
3458 kaklik 171 .................... if(state < 0x80) //Master is sending data
3463 kaklik 172 004D: MOVF 3D,W
173 004E: SUBLW 7F
174 004F: BTFSS 03.0
175 0050: GOTO 069
3458 kaklik 176 .................... {
177 .................... incoming = i2c_read();
3463 kaklik 178 0051: BCF 14.6
179 0052: BTFSS 0C.3
180 0053: GOTO 052
181 0054: MOVF 13,W
182 0055: BSF 14.4
183 0056: MOVWF 3C
3458 kaklik 184 .................... if(state == 1) //First received byte is address
3463 kaklik 185 0057: DECFSZ 3D,W
186 0058: GOTO 05F
3458 kaklik 187 .................... {
188 .................... address = incoming;
3463 kaklik 189 0059: MOVF 3C,W
190 005A: MOVWF 35
3458 kaklik 191 .................... if (incoming == 2)
3463 kaklik 192 005B: MOVF 3C,W
193 005C: SUBLW 02
194 005D: BTFSS 03.2
195 005E: GOTO 05F
3458 kaklik 196 .................... {
3463 kaklik 197 .................... /* buffer[0]=make8(anemo,0);
198 .................... buffer[1]=make8(anemo,1);
199 .................... buffer[2]=make8(rain,0);
200 .................... buffer[3]=make8(rain,1);
201 .................... */ }
3458 kaklik 202 .................... }
203 .................... if(state == 2) //Second received byte is data
3463 kaklik 204 005F: MOVF 3D,W
205 0060: SUBLW 02
206 0061: BTFSS 03.2
207 0062: GOTO 069
3458 kaklik 208 .................... buffer[address] = incoming;
3463 kaklik 209 0063: MOVLW 2D
210 0064: ADDWF 35,W
211 0065: MOVWF 04
212 0066: BCF 03.7
213 0067: MOVF 3C,W
214 0068: MOVWF 00
3458 kaklik 215 .................... }
216 .................... if(state == 0x80) //Master is requesting data
3463 kaklik 217 0069: MOVF 3D,W
218 006A: SUBLW 80
219 006B: BTFSS 03.2
220 006C: GOTO 085
3458 kaklik 221 .................... {
3463 kaklik 222 .................... if(address <= buf_len) i2c_write(buffer[address]);
223 006D: MOVF 35,W
224 006E: SUBLW 08
225 006F: BTFSS 03.0
226 0070: GOTO 07A
227 0071: MOVLW 2D
228 0072: ADDWF 35,W
229 0073: MOVWF 04
230 0074: BCF 03.7
231 0075: MOVF 00,W
232 0076: MOVWF 3E
233 0077: MOVWF 3F
234 0078: CALL 031
235 .................... else i2c_write(ID[address - buf_len]);
236 0079: GOTO 085
237 007A: MOVLW 08
238 007B: SUBWF 35,W
239 007C: ADDWF 00,W
240 007D: MOVWF 04
241 007E: BCF 03.7
242 007F: BTFSC 56.0
243 0080: BSF 03.7
244 0081: MOVF 00,W
245 0082: MOVWF 3E
246 0083: MOVWF 3F
247 0084: CALL 031
3458 kaklik 248 .................... }
249 .................... }
250 ....................
251 ....................
3463 kaklik 252 ....................
253 .................... /*#int_EXT // Interrupt from 1PPS
3462 kaklik 254 .................... void EXT_isr(void)
255 .................... {
256 .................... unsigned int16 countH;
257 .................... unsigned int8 countL;
258 .................... char countS[10], a[4], b[4], c[4]; // strings for printing results
259 ....................
260 .................... countL=0;
261 .................... countH=get_timer1(); // read internal counter
262 .................... output_low(SEL0);
263 .................... output_low(SEL1);
264 .................... countL=input(CLKI); // read bit 0 of external counter
265 .................... output_high(SEL0);
266 .................... output_low(SEL1);
267 .................... countL|=input(CLKI)<<1; // read bit 1 of external counter
268 .................... output_low(SEL0);
269 .................... output_high(SEL1);
270 .................... countL|=input(CLKI)<<2; // read bit 2 of external counter
271 .................... output_high(SEL0);
272 .................... output_high(SEL1);
273 .................... countL|=input(CLKI)<<3; // read bit 3 of external counter
274 ....................
275 .................... output_low(MR); // External counter Master Reset
276 .................... output_high(MR);
277 ....................
278 .................... set_timer1(0); // Internal counter reset
279 ....................
280 .................... count=((unsigned int32)of<<20)+((unsigned int32)countH<<4)+(unsigned int32)countL; // concatenate
281 ....................
282 .................... sprintf(countS,"%09Lu", count); // engeneering values conversion
283 .................... strncpy(a, countS, 3); a[3]='\0';
284 .................... strncpy(b, &countS[3], 3); b[3]='\0';
285 .................... strncpy(c, &countS[6], 3); c[3]='\0';
286 ....................
287 .................... printf("%s\r\n", countS); // output to RS232
288 ....................
289 .................... output_toggle(BEEP); // cvak...
290 ....................
291 .................... of=0; // reset overflow counter
292 .................... }
293 ....................
294 .................... #int_TIMER1 // Interrupf from overflow
295 .................... void TIMER1_isr(void)
296 .................... {
297 .................... of++;
298 .................... }
299 ....................
300 ....................
301 .................... /*#int_TIMER2 // every 10 ms
3458 kaklik 302 .................... void TIMER2_isr(void)
303 .................... {
304 .................... output_low(CE);
305 .................... count=get_timer1();
306 .................... set_timer1(0);
307 .................... output_high(CE);
3462 kaklik 308 .................... }*/
3458 kaklik 309 ....................
310 ....................
3463 kaklik 311 0085: BCF 0C.3
312 0086: BCF 0A.3
313 0087: BCF 0A.4
314 0088: GOTO 01D
3458 kaklik 315 .................... void main()
316 .................... {
317 *
3463 kaklik 318 0111: CLRF 04
319 0112: BCF 03.7
320 0113: MOVLW 1F
321 0114: ANDWF 03,F
322 0115: BSF 03.5
323 0116: BSF 03.6
324 0117: BSF 07.3
325 0118: MOVLW 08
326 0119: BCF 03.6
327 011A: MOVWF 19
328 011B: MOVLW 02
329 011C: MOVWF 1A
330 011D: MOVLW A6
331 011E: MOVWF 18
332 011F: MOVLW 90
333 0120: BCF 03.5
334 0121: MOVWF 18
335 0122: BSF 28.3
336 0123: MOVF 28,W
337 0124: BSF 03.5
338 0125: MOVWF 07
339 0126: BCF 03.5
340 0127: BSF 28.4
341 0128: MOVF 28,W
342 0129: BSF 03.5
343 012A: MOVWF 07
344 012B: MOVLW A2
345 012C: MOVWF 13
346 012D: MOVLW 36
347 012E: BCF 03.5
348 012F: MOVWF 14
349 0130: CLRF 35
350 0131: CLRF 37
351 0132: CLRF 36
352 0133: BSF 03.5
353 0134: BSF 03.6
354 0135: MOVF 09,W
355 0136: ANDLW C0
356 0137: MOVWF 09
357 0138: BCF 03.6
358 0139: BCF 1F.4
359 013A: BCF 1F.5
360 013B: MOVLW 00
361 013C: BSF 03.6
362 013D: MOVWF 08
363 013E: BCF 03.5
364 013F: CLRF 07
365 0140: CLRF 08
366 0141: CLRF 09
367 .................... /* setup_adc_ports(NO_ANALOGS|VSS_VDD);
3458 kaklik 368 .................... setup_adc(ADC_OFF);
3463 kaklik 369 .................... // setup_spi(SPI_SS_DISABLED);
3458 kaklik 370 .................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
371 .................... // setup_wdt(WDT_144MS);
372 .................... setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
373 .................... setup_timer_2(T2_DIV_BY_16,196,16);
374 .................... setup_ccp1(CCP_OFF);
375 .................... setup_comparator(NC_NC_NC_NC);
376 .................... setup_vref(FALSE);
3463 kaklik 377 ....................
378 .................... */
379 ....................
380 .................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
381 *
382 0148: BSF 03.5
383 0149: BSF 03.6
384 014A: MOVF 09,W
385 014B: ANDLW C0
386 014C: MOVWF 09
387 014D: BCF 03.6
388 014E: BCF 1F.4
389 014F: BCF 1F.5
390 0150: MOVLW 00
391 0151: BSF 03.6
392 0152: MOVWF 08
393 .................... // setup_adc(ADC_CLOCK_DIV_2);
394 .................... setup_adc(ADC_OFF);
395 0153: BCF 03.5
396 0154: BCF 03.6
397 0155: BCF 1F.0
398 .................... // setup_spi(SPI_SS_DISABLED); //must not be set if I2C are in use!
399 .................... setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
400 0156: BSF 03.5
401 0157: MOVF 01,W
402 0158: ANDLW C7
403 0159: IORLW 28
404 015A: MOVWF 01
405 .................... // setup_timer_0(RTCC_INTERNAL);setup_wdt(WDT_144MS);
406 .................... setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
407 015B: MOVLW 0F
408 015C: BCF 03.5
409 015D: MOVWF 10
410 .................... // setup_timer_2(T2_DISABLED,0,1);
411 .................... setup_comparator(NC_NC_NC_NC);
412 015E: BSF 03.6
413 015F: CLRF 07
414 0160: CLRF 08
415 0161: CLRF 09
416 .................... setup_vref(FALSE);
417 0162: BSF 03.5
418 0163: BCF 03.6
419 0164: CLRF 17
420 .................... // setup_oscillator(OSC_8MHZ|OSC_INTRC);
421 ....................
422 .................... // ext_int_edge( L_TO_H ); // set 1PPS active edge
423 .................... // enable_interrupts(INT_TIMER1);
424 .................... // enable_interrupts(INT_EXT);
425 .................... enable_interrupts(INT_SSP);
426 0165: BSF 0C.3
427 .................... // enable_interrupts(INT_TIMER2);
428 .................... enable_interrupts(GLOBAL);
429 0166: MOVLW C0
430 0167: BCF 03.5
431 0168: IORWF 0B,F
432 ....................
433 ....................
434 .................... /* delay_ms(1000);
3458 kaklik 435 .................... int n;
3462 kaklik 436 .................... for (n=0;n<40;n++) putc(cmd[n]); // setup GPS
3458 kaklik 437 ....................
3463 kaklik 438 .................... */
439 ....................
3458 kaklik 440 .................... printf("cvak...\r\n");
3463 kaklik 441 0169: MOVLW 89
442 016A: BSF 03.6
443 016B: MOVWF 0D
444 016C: MOVLW 00
445 016D: MOVWF 0F
446 016E: BCF 03.6
447 016F: GOTO 08E
3458 kaklik 448 ....................
449 ....................
3463 kaklik 450 .................... buffer[2]=0;
451 0170: CLRF 2F
452 .................... buffer[3]=0;
453 0171: CLRF 30
454 .................... buffer[4]=0;
455 0172: CLRF 31
456 .................... buffer[5]=0;
457 0173: CLRF 32
458 ....................
3458 kaklik 459 .................... while(true)
3462 kaklik 460 .................... {
3463 kaklik 461 .................... // output_high(LED);
462 .................... delay_ms(1000);
463 0174: MOVLW 04
464 0175: MOVWF 39
465 0176: MOVLW FA
466 0177: MOVWF 3A
467 0178: GOTO 0D8
468 0179: DECFSZ 39,F
469 017A: GOTO 176
470 .................... // output_low(LED);
471 .................... // delay_ms(999);
3462 kaklik 472 .................... printf("%X %X %X %X\r\n", buffer[0],buffer[1],buffer[2],buffer[3]);
3463 kaklik 473 017B: MOVF 2D,W
474 017C: MOVWF 39
475 017D: MOVLW 37
476 017E: MOVWF 3A
477 017F: CALL 0EE
478 0180: MOVLW 20
479 0181: BTFSS 0C.4
480 0182: GOTO 181
481 0183: MOVWF 19
482 0184: MOVF 2E,W
483 0185: MOVWF 39
484 0186: MOVLW 37
485 0187: MOVWF 3A
486 0188: CALL 0EE
487 0189: MOVLW 20
488 018A: BTFSS 0C.4
489 018B: GOTO 18A
490 018C: MOVWF 19
491 018D: MOVF 2F,W
492 018E: MOVWF 39
493 018F: MOVLW 37
494 0190: MOVWF 3A
495 0191: CALL 0EE
496 0192: MOVLW 20
497 0193: BTFSS 0C.4
498 0194: GOTO 193
499 0195: MOVWF 19
500 0196: MOVF 30,W
501 0197: MOVWF 39
502 0198: MOVLW 37
503 0199: MOVWF 3A
504 019A: CALL 0EE
505 019B: MOVLW 0D
506 019C: BTFSS 0C.4
507 019D: GOTO 19C
508 019E: MOVWF 19
509 019F: MOVLW 0A
510 01A0: BTFSS 0C.4
511 01A1: GOTO 1A0
512 01A2: MOVWF 19
513 ....................
3458 kaklik 514 .................... }
3463 kaklik 515 01A3: GOTO 174
3458 kaklik 516 .................... }
3463 kaklik 517 01A4: SLEEP
3458 kaklik 518  
519 Configuration Fuses:
520 Word 1: 2CF2 HS NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT IESO FCMEN NOLVP NODEBUG
521 Word 2: 3FFF NOWRT BORV40