tstrs485.LST
上传用户:sanfwan_06
上传日期:2007-12-18
资源大小:190k
文件大小:100k
源码类别:

串口编程

开发平台:

C/C++

  1. CCS PCW C Compiler, Version 3.023, 11338
  2.                Filename: d:embeddedrs485netsourcetstrs485.LST
  3.                ROM used: 1620 (40%)
  4.                          Largest free fragment is 2048
  5.                RAM used: 115 (60%) at main() level
  6.                          126 (66%) worst case
  7.                Stack:    9 worst case (6 in main + 3 for interrupts)
  8. *
  9. 0000:  MOVLW  00
  10. 0001:  MOVWF  0A
  11. 0002:  GOTO   4C6
  12. 0003:  NOP
  13. 0004:  BTFSS  0A,3
  14. 0005:  BCF    0A,4
  15. 0006:  BTFSC  0A,3
  16. 0007:  BSF    0A,4
  17. 0008:  BCF    0A,3
  18. 0009:  BTFSC  03,5
  19. 000A:  GOTO   00F
  20. 000B:  MOVWF  25
  21. 000C:  SWAPF  03,W
  22. 000D:  MOVWF  26
  23. 000E:  GOTO   014
  24. 000F:  BCF    03,5
  25. 0010:  MOVWF  25
  26. 0011:  SWAPF  03,W
  27. 0012:  MOVWF  26
  28. 0013:  BSF    26,1
  29. 0014:  MOVF   0A,W
  30. 0015:  MOVWF  2D
  31. 0016:  SWAPF  25,F
  32. 0017:  MOVF   04,W
  33. 0018:  MOVWF  27
  34. 0019:  MOVF   20,W
  35. 001A:  MOVWF  28
  36. 001B:  MOVF   21,W
  37. 001C:  MOVWF  29
  38. 001D:  MOVF   22,W
  39. 001E:  MOVWF  2A
  40. 001F:  MOVF   23,W
  41. 0020:  MOVWF  2B
  42. 0021:  MOVF   24,W
  43. 0022:  MOVWF  2C
  44. 0023:  BCF    03,5
  45. 0024:  BTFSS  0B,5
  46. 0025:  GOTO   028
  47. 0026:  BTFSC  0B,2
  48. 0027:  GOTO   046
  49. 0028:  MOVLW  8C
  50. 0029:  MOVWF  04
  51. 002A:  BTFSS  00,5
  52. 002B:  GOTO   02E
  53. 002C:  BTFSC  0C,5
  54. 002D:  GOTO   048
  55. 002E:  MOVF   27,W
  56. 002F:  MOVWF  04
  57. 0030:  MOVF   28,W
  58. 0031:  MOVWF  20
  59. 0032:  MOVF   29,W
  60. 0033:  MOVWF  21
  61. 0034:  MOVF   2A,W
  62. 0035:  MOVWF  22
  63. 0036:  MOVF   2B,W
  64. 0037:  MOVWF  23
  65. 0038:  MOVF   2C,W
  66. 0039:  MOVWF  24
  67. 003A:  MOVF   2D,W
  68. 003B:  MOVWF  0A
  69. 003C:  BTFSC  0A,4
  70. 003D:  BSF    0A,3
  71. 003E:  BCF    0A,4
  72. 003F:  SWAPF  26,W
  73. 0040:  MOVWF  03
  74. 0041:  BCF    03,5
  75. 0042:  SWAPF  25,W
  76. 0043:  BTFSC  26,1
  77. 0044:  BSF    03,5
  78. 0045:  RETFIE
  79. 0046:  BCF    0A,3
  80. 0047:  GOTO   0FE
  81. 0048:  BCF    0A,3
  82. 0049:  GOTO   185
  83. ....................  //********************************************************************************* 
  84. .................... // TsRs485.c 
  85. .................... // 
  86. .................... //                      Test of RS485 network protocol 
  87. .................... // 
  88. .................... // 
  89. .................... // Version 1.0 beta  
  90. .................... // 
  91. .................... // Processor: PIC16F87x 
  92. .................... // Compiler: CCS PCM 3.023 
  93. .................... // 
  94. .................... // 
  95. .................... // By: J.Winpenny 
  96. .................... // j.winpenny@ukonline.co.uk 
  97. .................... // 
  98. .................... // 
  99. .................... // 
  100. .................... //********************************************************************************* 
  101. .................... #DEVICE PIC16F873 *=16 
  102. .................... #include <16f873.h> 
  103. ....................  //////// Standard Header file for the PIC16F873 device //////////////// 
  104. .................... //#device PIC16F873 
  105. .................... #list 
  106. .................... 
  107. .................... #define MASTER 
  108. ....................  
  109. .................... #use delay(clock=4000000) 
  110. *
  111. 01A0:  MOVLW  BC
  112. 01A1:  MOVWF  04
  113. 01A2:  MOVF   00,W
  114. 01A3:  BTFSC  03,2
  115. 01A4:  GOTO   1B4
  116. 01A5:  MOVLW  01
  117. 01A6:  MOVWF  21
  118. 01A7:  CLRF   20
  119. 01A8:  DECFSZ 20,F
  120. 01A9:  GOTO   1A8
  121. 01AA:  DECFSZ 21,F
  122. 01AB:  GOTO   1A7
  123. 01AC:  MOVLW  4A
  124. 01AD:  MOVWF  20
  125. 01AE:  DECFSZ 20,F
  126. 01AF:  GOTO   1AE
  127. 01B0:  NOP
  128. 01B1:  NOP
  129. 01B2:  DECFSZ 00,F
  130. 01B3:  GOTO   1A5
  131. 01B4:  RETLW  00
  132. .................... #fuses HS,NOWDT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOCPD,NOWRT 
  133. ....................  
  134. .................... #include <Tst485.h> 
  135. ....................   
  136. .................... void Setup(void); 
  137. .................... void ConfigureComms(void); 
  138. ....................  
  139. ....................  
  140. .................... // EEPROM addresses 
  141. ....................  
  142. .................... #define NET_ADDRESS_HIGH 0 
  143. .................... #define NET_ADDRESS_LOW  1 
  144. ....................  
  145. .................... #ifndef MASTER 
  146. .................... // PORT Configuration 
  147. .................... #define PortAConfig 0x3F 
  148. .................... #define PortBConfig 0x00 
  149. .................... #define PortCConfig 0x00 
  150. .................... #define PortDConfig 0x00 
  151. .................... #define PortEConfig 0x00 
  152. .................... #else 
  153. .................... // PORT Configuration 
  154. .................... #define PortAConfig 0x00 
  155. .................... #define PortBConfig 0x00 
  156. .................... #define PortCConfig 0x0f 
  157. .................... #define PortDConfig 0x00 
  158. .................... #define PortEConfig 0x00 
  159. .................... #endif 
  160. ....................  
  161. ....................  
  162. .................... //********************************************************************* 
  163. ....................  
  164. ....................  
  165. .................... #define TMR0_RELOAD 255         // TMR0 reload value  
  166. .................... //#define TMR0_RELOAD 248       // TMR0 reload value  
  167. ....................  
  168. ....................  
  169. .................... #BYTE PORTA = 0x05 
  170. .................... #BYTE PORTB = 0x06 
  171. .................... #BYTE PORTC = 0x07 
  172. .................... #BYTE PORTD = 0x08 
  173. .................... #BYTE PORTE = 0x09 
  174. .................... #BYTE RCREG = 0x1a 
  175. .................... #BYTE TXREG = 0x19 
  176. .................... #BYTE STATUS = 0x03 
  177. .................... #BYTE SSPBUF = 0x13 
  178. .................... #BYTE SSPCON = 0x14 
  179. .................... #BYTE SSPCON2 = 0x91 
  180. .................... #BYTE PR2 = 0x92 
  181. .................... #BYTE SSPADD = 0x93 
  182. .................... #BYTE SSPSTAT = 0x94 
  183. .................... #BYTE SPBRG = 0x99 
  184. .................... #BYTE ADCON1 = 0x9f 
  185. .................... #BYTE OPTIONREG = 0x81 
  186. ....................  
  187. .................... #BYTE PIE1 = 0x8c 
  188. .................... #BYTE PIR1 = 0x0c 
  189. .................... #BYTE INTCON = 0x0b 
  190. .................... #BYTE TMR0 = 0x101 
  191. .................... #BYTE RCSTA = 0x18 
  192. .................... #BYTE TXSTA = 0x98 
  193. ....................  
  194. .................... #BYTE TRISA = 0x85 
  195. .................... #BYTE TRISB = 0x86 
  196. .................... #BYTE TRISC = 0x87 
  197. .................... #BYTE TRISD = 0x88 
  198. .................... #BYTE TRISE = 0x89 
  199. ....................  
  200. .................... // INTCON BITS 
  201. .................... #define GIE 7 
  202. .................... #define PEIE 6 
  203. .................... #define T0IE 5 
  204. .................... #define INTE 4 
  205. .................... #define RBIE 3 
  206. .................... #define T0IF 2 
  207. .................... #define INTF 1 
  208. .................... #define RBIF 0 
  209. ....................  
  210. .................... // USART Register bits 
  211. .................... #define CSCR 7 
  212. .................... #define TX9  6 
  213. .................... #define TXEN 5 
  214. .................... #define SYNC 4 
  215. .................... #define BRGH 2 
  216. .................... #define TRMT 1 
  217. .................... #define TX9D 0 
  218. .................... #define SPEN 7 
  219. .................... #define RX9  6 
  220. .................... #define SREN 5 
  221. .................... #define CREN 4 
  222. .................... #define ADDEN 3 
  223. .................... #define FERR 2 
  224. .................... #define OERR 1 
  225. .................... #define RX9D 0 
  226. ....................  
  227. .................... #define TRMT_MASK 2 
  228. ....................  
  229. .................... // Bits of STATUS register 
  230. .................... #define IRP   7 
  231. .................... #define RP1   6 
  232. .................... #define RP0   5 
  233. .................... #define T0    4 
  234. .................... #define PD    3 
  235. .................... #define ZERO  2 
  236. .................... #define DC    1 
  237. .................... #define CARRY 0 
  238. ....................  
  239. .................... // Bits of PIE1 
  240. .................... #define PSPIE 7 
  241. .................... #define ADIE 6 
  242. .................... #define RCIE 5 
  243. .................... #define TXIE 4 
  244. .................... #define SSPIE 3 
  245. .................... #define CCP1IE 2 
  246. .................... #define TMR2IE 1 
  247. .................... #define TMR1IE 0 
  248. ....................  
  249. .................... // Bits of SSPSTAT 
  250. .................... #define SMP 7 
  251. .................... #define CKE 6 
  252. .................... #define D_A 5 
  253. .................... //#define P   4 // Cause compiler error because of identifier s 
  254. .................... //#define S   3 
  255. .................... #define R_W 2 
  256. .................... #define R_W_MASK 0x04 
  257. .................... #define UA  1 
  258. .................... #define BF  0 
  259. ....................  
  260. .................... // Bits of PIR1 
  261. .................... #define PSPIF  7 
  262. .................... #define ADIF   6 
  263. .................... #define RCIF   5 
  264. .................... #define TXIF   4 
  265. .................... #define SSPIF  3 
  266. .................... #define SSPIF_MASK 0x08 
  267. .................... #define CCP1IF 2 
  268. .................... #define TMR2IF 1 
  269. .................... #define TMR1IF 0 
  270. ....................  
  271. .................... // Bits of SSPCON2 
  272. ....................  
  273. .................... #define GCEN    7 
  274. .................... #define ACKSTAT 6 
  275. .................... #define ACKDT   5 
  276. .................... #define ACKEN   4 
  277. .................... #define RCEN    3 
  278. .................... #define PEN     2 
  279. .................... #define RSEN    1 
  280. .................... #define SEN     0 
  281. .................... 
  282. .................... #include <stdlib.h> 
  283. ....................  ////        (C) Copyright 1996,1997 Custom Computer Services            //// 
  284. .................... //// This source code may only be used by licensed users of the CCS C   //// 
  285. .................... //// compiler.  This source code may only be distributed to other       //// 
  286. .................... //// licensed users of the CCS C compiler.  No other use, reproduction  //// 
  287. .................... //// or distribution is permitted without written permission.           //// 
  288. .................... //// Derivative programs created using this software in object code     //// 
  289. .................... //// form are not restricted in any way.                                //// 
  290. .................... //////////////////////////////////////////////////////////////////////////// 
  291. ....................  
  292. .................... #ifndef _stdlib_ 
  293. ....................  
  294. .................... #define _stdlib_ true 
  295. ....................  
  296. .................... float atof(char * s) { 
  297. ....................  float pow10; 
  298. ....................         float result; 
  299. ....................  int sign, point; 
  300. ....................  char c; 
  301. ....................         int ptr; 
  302. ....................  
  303. ....................         ptr=0; 
  304. ....................     sign = 0; 
  305. ....................  point = 0; 
  306. ....................  pow10 = 1.0; 
  307. ....................     result = 0.0; 
  308. ....................  
  309. ....................  do 
  310. ....................           c=s[ptr++]; 
  311. ....................         while ((c<'0'||c>'9') && c!='+' && c!='-' && c!='.'); 
  312. ....................  
  313. ....................  while((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') { 
  314. ....................            if(c == '-') { 
  315. ....................               sign = 1; 
  316. ....................               c = s[ptr++]; 
  317. ....................            } 
  318. ....................  
  319. ....................            while((c >= '0' && c <= '9') && point == 0) { 
  320. ....................               result = 10*result + c - '0'; 
  321. ....................               c = s[ptr++]; 
  322. ....................            } 
  323. ....................  
  324. ....................            if (c == '.') { 
  325. ....................               point = 1; 
  326. ....................               c = s[ptr++]; 
  327. ....................            } 
  328. ....................  
  329. ....................     while((c >= '0' && c <= '9') && point == 1) { 
  330. ....................         pow10 = pow10*10; 
  331. ....................                result += (c - '0')/pow10; 
  332. ....................                c = s[ptr++]; 
  333. ....................            } 
  334. ....................         } 
  335. ....................  
  336. ....................  if (sign == 1) 
  337. ....................       result = -1*result; 
  338. ....................  
  339. ....................  return(result); 
  340. .................... } 
  341. ....................  
  342. .................... #define labs abs 
  343. .................... #define fabs abs 
  344. ....................  
  345. .................... /************************************************************/ 
  346. ....................  
  347. .................... signed int atoi(char *s) 
  348. .................... { 
  349. ....................    signed int result; 
  350. ....................    int sign, base, index; 
  351. ....................    char c; 
  352. ....................  
  353. ....................    index = 0; 
  354. ....................    sign = 0; 
  355. ....................    base = 10; 
  356. ....................    result = 0; 
  357. ....................  
  358. ....................    // Omit all preceeding alpha characters 
  359. ....................    do 
  360. ....................       c = s[index++]; 
  361. ....................    while ((c < '0' || c > '9') && c != '+' && c != '-'); 
  362. ....................  
  363. ....................    // increase index if either positive or negative sign is detected 
  364. ....................    if (c == '-') 
  365. ....................    { 
  366. ....................       sign = 1;         // Set the sign to negative 
  367. ....................       c = s[index++]; 
  368. ....................    } 
  369. ....................    else if (c == '+') 
  370. ....................    { 
  371. ....................       c = s[index++]; 
  372. ....................    } 
  373. ....................  
  374. ....................    if (c >= '0' && c <= '9') 
  375. ....................    { 
  376. ....................  
  377. ....................       // Check for hexa number 
  378. ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X')) 
  379. ....................       { 
  380. ....................          base = 16; 
  381. ....................          index++; 
  382. ....................          c = s[index++]; 
  383. ....................       } 
  384. ....................  
  385. ....................       // The number is a decimal number 
  386. ....................       if (base == 10) 
  387. ....................       { 
  388. ....................          while (c >= '0' && c <= '9') 
  389. ....................          { 
  390. ....................             result = 10*result + (c - '0'); 
  391. ....................             c = s[index++]; 
  392. ....................          } 
  393. ....................       } 
  394. ....................       else if (base == 16)    // The number is a hexa number 
  395. ....................       { 
  396. ....................          while (c = TOUPPER(c), (c >= '0' && c <= '9') || (c >= 'A' && c<='F')) 
  397. ....................          { 
  398. ....................             if (c >= '0' && c <= '9') 
  399. ....................                result = (result << 4) + (c - '0'); 
  400. ....................             else 
  401. ....................                result = (result << 4) + (c - 'A' + 10); 
  402. ....................  
  403. ....................             c = s[index++]; 
  404. ....................          } 
  405. ....................       } 
  406. ....................    } 
  407. ....................  
  408. ....................    if (sign == 1 && base == 10) 
  409. ....................        result = -result; 
  410. ....................  
  411. ....................    return(result); 
  412. .................... } 
  413. ....................  
  414. ....................  
  415. ....................  
  416. .................... signed long atol(char *s) 
  417. .................... { 
  418. ....................    signed long result; 
  419. ....................    int sign, base, index; 
  420. ....................    char c; 
  421. ....................  
  422. ....................    index = 0; 
  423. ....................    sign = 0; 
  424. ....................    base = 10; 
  425. ....................    result = 0; 
  426. ....................  
  427. ....................    do 
  428. ....................       c = s[index++]; 
  429. ....................    while ((c < '0' || c>'9') && c != '+' && c != '-'); 
  430. ....................  
  431. ....................    // increase index if either positive or negative sign is detected 
  432. ....................    if (c == '-') 
  433. ....................    { 
  434. ....................       sign = 1;         // Set the sign to negative 
  435. ....................       c = s[index++]; 
  436. ....................    } 
  437. ....................    else if (c == '+') 
  438. ....................    { 
  439. ....................       c = s[index++]; 
  440. ....................    } 
  441. ....................  
  442. ....................    if (c >= '0' && c <= '9') 
  443. ....................    { 
  444. ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X')) 
  445. ....................       { 
  446. ....................          base = 16; 
  447. ....................          index++; 
  448. ....................          c = s[index++]; 
  449. ....................       } 
  450. ....................  
  451. ....................       // The number is a decimal number 
  452. ....................       if (base == 10) 
  453. ....................       { 
  454. ....................          while (c >= '0' && c <= '9') 
  455. ....................          { 
  456. ....................             result = 10*result + (c - '0'); 
  457. ....................             c = s[index++]; 
  458. ....................          } 
  459. ....................       } 
  460. ....................       else if (base == 16)    // The number is a hexa number 
  461. ....................       { 
  462. ....................          while (c = TOUPPER(c), (c >= '0' && c <= '9') || (c >= 'A' && c <='F')) 
  463. ....................          { 
  464. ....................             if (c >= '0' && c <= '9') 
  465. ....................                result = (result << 4) + (c - '0'); 
  466. ....................             else 
  467. ....................                result = (result << 4) + (c - 'A' + 10); 
  468. ....................  
  469. ....................             c = s[index++]; 
  470. ....................          } 
  471. ....................       } 
  472. ....................    } 
  473. ....................  
  474. ....................    if (base == 10 && sign == 1) 
  475. ....................       result = -result; 
  476. ....................  
  477. ....................    return(result); 
  478. .................... } 
  479. ....................  
  480. .................... signed int32 mult_with10(int32 num) 
  481. .................... { 
  482. ....................    return ( (num << 1) + (num << 3) ); 
  483. .................... } 
  484. ....................  
  485. .................... signed int32 atoi32(char *s) 
  486. .................... { 
  487. ....................    signed int32 result; 
  488. ....................    int sign, base, index; 
  489. ....................    char c; 
  490. ....................  
  491. ....................    index = 0; 
  492. ....................    sign = 0; 
  493. ....................    base = 10; 
  494. ....................    result = 0; 
  495. ....................  
  496. ....................    do 
  497. ....................       c = s[index++]; 
  498. ....................    while ((c < '0' || c>'9') && c != '+' && c != '-'); 
  499. ....................  
  500. ....................    // increase index if either positive or negative sign is detected 
  501. ....................    if (c == '-') 
  502. ....................    { 
  503. ....................       sign = 1;         // Set the sign to negative 
  504. ....................       c = s[index++]; 
  505. ....................    } 
  506. ....................    else if (c == '+') 
  507. ....................    { 
  508. ....................       c = s[index++]; 
  509. ....................    } 
  510. ....................  
  511. ....................    if (c >= '0' && c <= '9') 
  512. ....................    { 
  513. ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X')) 
  514. ....................       { 
  515. ....................          base = 16; 
  516. ....................          index++; 
  517. ....................          c = s[index++]; 
  518. ....................       } 
  519. ....................  
  520. ....................       // The number is a decimal number 
  521. ....................       if (base == 10) 
  522. ....................       { 
  523. ....................          while (c >= '0' && c <= '9') { 
  524. ....................             result = (result << 1) + (result << 3);  // result *= 10; 
  525. ....................             result += (c - '0'); 
  526. ....................             c = s[index++]; 
  527. ....................          } 
  528. ....................       } 
  529. ....................       else if (base == 16)    // The number is a hexa number 
  530. ....................       { 
  531. ....................          while (c = TOUPPER(c), (c >= '0' && c <= '9') || (c >= 'A' && c <='F')) 
  532. ....................          { 
  533. ....................             if (c >= '0' && c <= '9') 
  534. ....................                result = (result << 4) + (c - '0'); 
  535. ....................             else 
  536. ....................                result = (result << 4) + (c - 'A' + 10); 
  537. ....................  
  538. ....................             c = s[index++]; 
  539. ....................          } 
  540. ....................       } 
  541. ....................    } 
  542. ....................  
  543. ....................    if (base == 10 && sign == 1) 
  544. ....................       result = -result; 
  545. ....................  
  546. ....................    return(result); 
  547. .................... } 
  548. ....................  
  549. ....................  
  550. .................... #endif 
  551. .................... 
  552. .................... #include <Rs485.c>    // RS485 packet protocol driver 
  553. ....................  //************************************************************************** 
  554. .................... // Rs495.c 
  555. .................... //                      RS485 network protocol 
  556. .................... // 
  557. .................... // Version 1.0 beta 
  558. .................... // 
  559. .................... // Processor: PIC16F87x 
  560. .................... // 
  561. .................... // Network packet protocol: 
  562. .................... // 
  563. .................... // STX ( 0x02 ) 
  564. .................... // NET ADDRESS HIGH   
  565. .................... // NET ADDRESS LOW 
  566. .................... // PAYLOAD LENGTH 
  567. .................... // COMMAND 
  568. .................... // DATA ( Optional ) 
  569. .................... // CRC HIGH 
  570. .................... // CRC LOW 
  571. .................... // 
  572. .................... // 
  573. .................... // 
  574. .................... // 
  575. .................... // 
  576. .................... // By: J.Winpenny 
  577. .................... // j.winpenny@ukonline.co.uk 
  578. .................... // 
  579. .................... //************************************************************************** 
  580. .................... #include <Rs485.h> 
  581. ....................  #separate 
  582. .................... char Rs485Process(void); 
  583. .................... void Rs485Initialise(char cAddrHigh, char cAddrLow); 
  584. .................... #separate 
  585. .................... char Rs485Decode( void ); 
  586. .................... void Rs485UpdateCrc(char cVal ); 
  587. .................... void CRC16_Init( void ); 
  588. .................... void CRC16_Update4Bits( char val ); 
  589. .................... void Rs485SendPacket( char cCmd, char cLen, char *cData ); 
  590. .................... void Rs485GetPacket( char *cCom, char *cLen, char *cData ); 
  591. .................... void Rs485SendChar( char c ); 
  592. .................... char PostValidatePacket(void); 
  593. .................... char PacketHasPayload(void); 
  594. .................... void BinToHexAscii( char c ); 
  595. ....................  
  596. ....................  
  597. .................... #define NULL 0 
  598. ....................  
  599. .................... // Configurables 
  600. .................... #define RS485_CONTROL PORTC 
  601. .................... #define OUTPUTS_ON 5 
  602. .................... #define NUM_TX_PREAMBLE 3 
  603. ....................  
  604. ....................  
  605. .................... // Protocol defines 
  606. .................... #define PKT_START 0x02 
  607. ....................  
  608. .................... // States of packet decoder state machine 
  609. .................... #define PKT_WAIT_START      0 
  610. .................... #define PKT_WAIT_ADDR_HIGH  1 
  611. .................... #define PKT_WAIT_ADDR_LOW   2 
  612. .................... #define PKT_WAIT_LEN        3 
  613. .................... #define PKT_CMD             4 
  614. .................... #define PKT_WAIT_DATA       5 
  615. .................... #define PKT_WAIT_CRC_HIGH   6 
  616. .................... #define PKT_WAIT_CRC_LOW    7 
  617. .................... #define PKT_COMPLETE        8 
  618. .................... #define PKT_VALID           9 
  619. .................... #define PKT_INVALID       255 
  620. ....................  
  621. .................... // Error codes 
  622. .................... #define BAD_LENGTH 1 
  623. .................... #define BAD_CRC    2 
  624. ....................  
  625. ....................  
  626. .................... // Packet types 
  627. .................... #define SENSOR_POLL_CMD        0xA1 
  628. .................... #define SENSOR_PING_SYNC       0xA2 
  629. .................... #define SENSOR_CONFIG          0xA3 
  630. .................... #define SENSOR_GET_DATA        0xA4 
  631. ....................  
  632. ....................  
  633. ....................  
  634. .................... #define SENSOR_ACK             0xB0 
  635. .................... #define SENSOR_NAK             0xC0 
  636. ....................  
  637. ....................  
  638. ....................  
  639. ....................  
  640. ....................  
  641. ....................  
  642. ....................  
  643. .................... 
  644. .................... #include <lcd2.h> 
  645. ....................  /***********************************************/ 
  646. .................... /* LCD.H   Header for LCD routines             */ 
  647. .................... /***********************************************/ 
  648. ....................  
  649. ....................    void WaitBusyFlag(void); 
  650. ....................    void LCDSetup(void); 
  651. ....................    void FunctionMode(void); 
  652. ....................    void DataMode(void); 
  653. ....................    void Write_8_Bit( char dh ); 
  654. ....................    void LcdWrite(char dl ); 
  655. ....................    void Delay(void); 
  656. ....................    void Clear(void); 
  657. ....................    void SetPos(char Pos); 
  658. ....................    void Line1(void); 
  659. ....................    void Line2(void); 
  660. ....................    void ClearLine1(void); 
  661. ....................    void ClearLine2(void); 
  662. ....................    void WriteString( char *lcdptr ); 
  663. ....................  
  664. .................... 
  665. .................... // #include <lcd873.h> 
  666. ....................  
  667. ....................  
  668. ....................  
  669. .................... //struct 
  670. .................... //{ 
  671. .................... static char cOurAddrHigh; 
  672. .................... static char cOurAddrLow; 
  673. .................... static char cRs485RxChar; 
  674. .................... static char cRS485State; 
  675. ....................  
  676. .................... static char cStart; 
  677. .................... static char cNetAddrHigh, cNetAddrLow; 
  678. .................... static char cLenExpected; 
  679. .................... static char cCommand; 
  680. .................... static char c485Buf[64]; 
  681. .................... static char cRxCrcHigh, cRxCrcLow; 
  682. .................... static char cCalcCrcHigh, cCalcCrcLow; 
  683. .................... static char cBufPtr; 
  684. .................... static char cError; 
  685. .................... static char cCrcTmp, cCrcTmp5, cCrcTmp4, cCrcTmp3, cCrcTmp2; 
  686. .................... //} RS485_Protocol; 
  687. ....................  
  688. ....................  
  689. .................... //**************************************************************************** 
  690. .................... // void Rs485Initialise(void) 
  691. .................... // 
  692. .................... // Initialise RS485 network driver 
  693. .................... //**************************************************************************** 
  694. .................... void Rs485Initialise(char cAddrHigh, char cAddrLow) 
  695. .................... { 
  696. ....................   cOurAddrHigh = cAddrHigh; 
  697. *
  698. 025D:  BSF    03,5
  699. 025E:  MOVF   32,W
  700. 025F:  BCF    03,5
  701. 0260:  MOVWF  2E
  702. ....................   cOurAddrLow = cAddrLow; 
  703. 0261:  BSF    03,5
  704. 0262:  MOVF   33,W
  705. 0263:  BCF    03,5
  706. 0264:  MOVWF  2F
  707. ....................   cRS485State = PKT_WAIT_START; 
  708. 0265:  CLRF   31
  709. ....................   BIT_CLEAR( RS485_CONTROL, OUTPUTS_ON );           // Disable driver 
  710. 0266:  BCF    07,5
  711. ....................   BIT_SET( PIE1, RCIE );                            // Enable Receive Interrupt 
  712. 0267:  BSF    03,5
  713. 0268:  BSF    0C,5
  714. 0269:  BCF    03,5
  715. 026A:  RETLW  00
  716. .................... } 
  717. ....................  
  718. ....................  
  719. .................... //**************************************************************************** 
  720. .................... // char PacketForUs(void) 
  721. .................... // 
  722. .................... // Decide if packet valid and destined for this node. 
  723. .................... // Ignore invalid packets and packets for other nodes 
  724. .................... // 
  725. .................... //**************************************************************************** 
  726. .................... #separate 
  727. .................... char Rs485Process(void) 
  728. .................... { 
  729. .................... char cOurPkt, cPktReady; 
  730. ....................  
  731. ....................     cOurPkt = FALSE; 
  732. *
  733. 0392:  BSF    03,5
  734. 0393:  CLRF   32
  735. ....................     cPktReady = FALSE; 
  736. 0394:  CLRF   33
  737. ....................  
  738. ....................     disable_interrupts(GLOBAL); 
  739. 0395:  BCF    03,5
  740. 0396:  BCF    0B,6
  741. 0397:  BCF    0B,7
  742. 0398:  BTFSC  0B,7
  743. 0399:  GOTO   397
  744. ....................  
  745. ....................     if ( cRS485State == PKT_COMPLETE ) 
  746. 039A:  MOVF   31,W
  747. 039B:  SUBLW  08
  748. 039C:  BTFSS  03,2
  749. 039D:  GOTO   485
  750. ....................     { 
  751. ....................         if ( ( cNetAddrHigh == cOurAddrHigh )&&   // Invalid and destined for this node 
  752. ....................  ( cNetAddrLow == cOurAddrLow ) ) 
  753. 039E:  MOVF   2E,W
  754. 039F:  SUBWF  33,W
  755. 03A0:  BTFSS  03,2
  756. 03A1:  GOTO   3AC
  757. 03A2:  GOTO   3A3
  758. 03A3:  MOVF   2F,W
  759. 03A4:  SUBWF  34,W
  760. 03A5:  BTFSS  03,2
  761. 03A6:  GOTO   3AC
  762. ....................  { 
  763. ....................     cOurPkt = TRUE; 
  764. 03A7:  MOVLW  01
  765. 03A8:  BSF    03,5
  766. 03A9:  MOVWF  32
  767. ....................  } 
  768. ....................  else 
  769. 03AA:  BCF    03,5
  770. 03AB:  GOTO   3C2
  771. ....................  { 
  772. ....................     ClearLine2(); 
  773. 03AC:  CALL   27D
  774. ....................     LcdWrite("traffic");                  // Network traffic for other nodes 
  775. *
  776. 004A:  BCF    0A,0
  777. 004B:  BCF    0A,1
  778. 004C:  BCF    0A,2
  779. 004D:  ADDWF  02,F
  780. 004E:  RETLW  74
  781. 004F:  RETLW  72
  782. 0050:  RETLW  61
  783. 0051:  RETLW  66
  784. 0052:  RETLW  66
  785. 0053:  RETLW  69
  786. 0054:  RETLW  63
  787. 0055:  RETLW  00
  788. *
  789. 03AD:  BSF    03,5
  790. 03AE:  CLRF   34
  791. 03AF:  BCF    03,5
  792. 03B0:  BSF    03,5
  793. 03B1:  MOVF   34,W
  794. 03B2:  BCF    03,5
  795. 03B3:  CALL   04A
  796. 03B4:  IORLW  00
  797. 03B5:  BTFSC  03,2
  798. 03B6:  GOTO   3BD
  799. 03B7:  BSF    03,5
  800. 03B8:  INCF   34,F
  801. 03B9:  MOVWF  3A
  802. 03BA:  BCF    03,5
  803. 03BB:  CALL   1C9
  804. 03BC:  GOTO   3B0
  805. ....................             delay_ms(200); 
  806. 03BD:  MOVLW  C8
  807. 03BE:  BSF    03,5
  808. 03BF:  MOVWF  3C
  809. 03C0:  BCF    03,5
  810. 03C1:  CALL   1A0
  811. ....................        } 
  812. ....................  
  813. ....................       cRS485State = PostValidatePacket();         // Validate packet CRC 
  814. *
  815. 043A:  MOVF   21,W
  816. 043B:  MOVWF  31
  817. ....................  
  818. ....................  if ( (cRS485State == PKT_INVALID)||(cRS485State == PKT_VALID) ) 
  819. 043C:  INCFSZ 31,W
  820. 043D:  GOTO   43F
  821. 043E:  GOTO   443
  822. 043F:  MOVF   31,W
  823. 0440:  SUBLW  09
  824. 0441:  BTFSS  03,2
  825. 0442:  GOTO   485
  826. ....................  { 
  827. ....................  // Reject invalid packets 
  828. ....................  if ( cRS485State == PKT_INVALID )          // NAK our invalid packets 
  829. 0443:  INCFSZ 31,W
  830. 0444:  GOTO   474
  831. ....................  { 
  832. ....................     ClearLine2(); 
  833. 0445:  CALL   27D
  834. ....................     if ( cError == BAD_CRC ) LcdWrite("Bad CRC"); 
  835. *
  836. 0056:  BCF    0A,0
  837. 0057:  BCF    0A,1
  838. 0058:  BCF    0A,2
  839. 0059:  ADDWF  02,F
  840. 005A:  RETLW  42
  841. 005B:  RETLW  61
  842. 005C:  RETLW  64
  843. 005D:  RETLW  20
  844. 005E:  RETLW  43
  845. 005F:  RETLW  52
  846. 0060:  RETLW  43
  847. 0061:  RETLW  00
  848. *
  849. 0446:  MOVF   7C,W
  850. 0447:  SUBLW  02
  851. 0448:  BTFSS  03,2
  852. 0449:  GOTO   45B
  853. 044A:  BSF    03,5
  854. 044B:  CLRF   34
  855. 044C:  BCF    03,5
  856. 044D:  BSF    03,5
  857. 044E:  MOVF   34,W
  858. 044F:  BCF    03,5
  859. 0450:  CALL   056
  860. 0451:  IORLW  00
  861. 0452:  BTFSC  03,2
  862. 0453:  GOTO   45A
  863. 0454:  BSF    03,5
  864. 0455:  INCF   34,F
  865. 0456:  MOVWF  3A
  866. 0457:  BCF    03,5
  867. 0458:  CALL   1C9
  868. 0459:  GOTO   44D
  869. ....................             else if ( cError == BAD_LENGTH ) LcdWrite("Bad length"); 
  870. *
  871. 0062:  BCF    0A,0
  872. 0063:  BCF    0A,1
  873. 0064:  BCF    0A,2
  874. 0065:  ADDWF  02,F
  875. 0066:  RETLW  42
  876. 0067:  RETLW  61
  877. 0068:  RETLW  64
  878. 0069:  RETLW  20
  879. 006A:  RETLW  6C
  880. 006B:  RETLW  65
  881. 006C:  RETLW  6E
  882. 006D:  RETLW  67
  883. 006E:  RETLW  74
  884. 006F:  RETLW  68
  885. 0070:  RETLW  00
  886. *
  887. 045A:  GOTO   46D
  888. 045B:  DECFSZ 7C,W
  889. 045C:  GOTO   46D
  890. 045D:  BSF    03,5
  891. 045E:  CLRF   34
  892. 045F:  BCF    03,5
  893. 0460:  BSF    03,5
  894. 0461:  MOVF   34,W
  895. 0462:  BCF    03,5
  896. 0463:  CALL   062
  897. 0464:  IORLW  00
  898. 0465:  BTFSC  03,2
  899. 0466:  GOTO   46D
  900. 0467:  BSF    03,5
  901. 0468:  INCF   34,F
  902. 0469:  MOVWF  3A
  903. 046A:  BCF    03,5
  904. 046B:  CALL   1C9
  905. 046C:  GOTO   460
  906. ....................             delay_ms(200); 
  907. 046D:  MOVLW  C8
  908. 046E:  BSF    03,5
  909. 046F:  MOVWF  3C
  910. 0470:  BCF    03,5
  911. 0471:  CALL   1A0
  912. ....................     //if ( cOurPkt ) Rs485SendPacket( SENSOR_NAK, 0, NULL ); 
  913. ....................     cRS485State = PKT_WAIT_START; 
  914. 0472:  CLRF   31
  915. ....................  } 
  916. ....................  else if ( cRS485State == PKT_VALID )       // If packet valid 
  917. 0473:  GOTO   485
  918. 0474:  MOVF   31,W
  919. 0475:  SUBLW  09
  920. 0476:  BTFSS  03,2
  921. 0477:  GOTO   485
  922. ....................  {                                          // and destined for this node 
  923. ....................     if ( cOurPkt ) cPktReady = TRUE; 
  924. 0478:  BSF    03,5
  925. 0479:  MOVF   32,F
  926. 047A:  BTFSS  03,2
  927. 047B:  GOTO   47E
  928. 047C:  BCF    03,5
  929. 047D:  GOTO   484
  930. 047E:  BCF    03,5
  931. 047F:  MOVLW  01
  932. 0480:  BSF    03,5
  933. 0481:  MOVWF  33
  934. ....................     else  cRS485State = PKT_WAIT_START; 
  935. 0482:  BCF    03,5
  936. 0483:  GOTO   485
  937. 0484:  CLRF   31
  938. ....................  } 
  939. ....................  } 
  940. ....................    } 
  941. ....................  
  942. ....................    enable_interrupts(GLOBAL); 
  943. 0485:  MOVLW  C0
  944. 0486:  IORWF  0B,F
  945. ....................  
  946. ....................  return cPktReady; 
  947. 0487:  BSF    03,5
  948. 0488:  MOVF   33,W
  949. 0489:  BCF    03,5
  950. 048A:  MOVWF  21
  951. 048B:  BCF    0A,3
  952. 048C:  GOTO   5D2
  953. ....................  
  954. .................... } 
  955. ....................  
  956. ....................  
  957. .................... //**************************************************************************** 
  958. .................... // void Rs485Decode(void) 
  959. .................... // 
  960. .................... // Decode an incomming packet on the RS485 network 
  961. .................... // 
  962. .................... // Expecting: 
  963. .................... // START, 
  964. .................... // NETWORK ADDRESS_HIGH, 
  965. .................... // NETWORK ADDRESS_LOW, 
  966. .................... // PAYLOAD LENGTH, 
  967. .................... // COMMAND, 
  968. .................... // optional DATA, 
  969. .................... // CRC HIGH, 
  970. .................... // CRC LOW 
  971. .................... // 
  972. .................... //**************************************************************************** 
  973. .................... #separate 
  974. .................... char Rs485Decode( void ) 
  975. .................... { 
  976. ....................  
  977. ....................    switch ( cRS485State ) 
  978. *
  979. 0112:  MOVF   31,W
  980. 0113:  MOVWF  20
  981. 0114:  BTFSC  03,2
  982. 0115:  GOTO   13F
  983. 0116:  MOVLW  01
  984. 0117:  SUBWF  20,W
  985. 0118:  BTFSC  03,2
  986. 0119:  GOTO   146
  987. 011A:  MOVLW  02
  988. 011B:  SUBWF  20,W
  989. 011C:  BTFSC  03,2
  990. 011D:  GOTO   14A
  991. 011E:  MOVLW  03
  992. 011F:  SUBWF  20,W
  993. 0120:  BTFSC  03,2
  994. 0121:  GOTO   14E
  995. 0122:  MOVLW  04
  996. 0123:  SUBWF  20,W
  997. 0124:  BTFSC  03,2
  998. 0125:  GOTO   15C
  999. 0126:  MOVLW  05
  1000. 0127:  SUBWF  20,W
  1001. 0128:  BTFSC  03,2
  1002. 0129:  GOTO   168
  1003. 012A:  MOVLW  06
  1004. 012B:  SUBWF  20,W
  1005. 012C:  BTFSC  03,2
  1006. 012D:  GOTO   173
  1007. 012E:  MOVLW  07
  1008. 012F:  SUBWF  20,W
  1009. 0130:  BTFSC  03,2
  1010. 0131:  GOTO   177
  1011. 0132:  MOVLW  08
  1012. 0133:  SUBWF  20,W
  1013. 0134:  BTFSC  03,2
  1014. 0135:  GOTO   17C
  1015. 0136:  MOVLW  09
  1016. 0137:  SUBWF  20,W
  1017. 0138:  BTFSC  03,2
  1018. 0139:  GOTO   17D
  1019. 013A:  MOVLW  FF
  1020. 013B:  SUBWF  20,W
  1021. 013C:  BTFSC  03,2
  1022. 013D:  GOTO   17E
  1023. 013E:  GOTO   17F
  1024. ....................    { 
  1025. ....................         case    PKT_WAIT_START:  cStart = cRs485RxChar; 
  1026. 013F:  MOVF   30,W
  1027. 0140:  MOVWF  32
  1028. ....................                                  if ( cRs485RxChar == PKT_START ) // Check for the start of packet byte 
  1029. 0141:  MOVF   30,W
  1030. 0142:  SUBLW  02
  1031. 0143:  BTFSC  03,2
  1032. ....................                                  { 
  1033. ....................                                     cRS485State++; 
  1034. 0144:  INCF   31,F
  1035. ....................                                  } 
  1036. ....................                                  break; 
  1037. 0145:  GOTO   181
  1038. ....................  
  1039. ....................         case PKT_WAIT_ADDR_HIGH: cNetAddrHigh = cRs485RxChar; 
  1040. 0146:  MOVF   30,W
  1041. 0147:  MOVWF  33
  1042. ....................                                  cRS485State++; 
  1043. 0148:  INCF   31,F
  1044. ....................                                  break; 
  1045. 0149:  GOTO   181
  1046. ....................  
  1047. ....................         case  PKT_WAIT_ADDR_LOW: cNetAddrLow = cRs485RxChar; 
  1048. 014A:  MOVF   30,W
  1049. 014B:  MOVWF  34
  1050. ....................                                  cRS485State++; 
  1051. 014C:  INCF   31,F
  1052. ....................                                  break; 
  1053. 014D:  GOTO   181
  1054. ....................  
  1055. ....................         case       PKT_WAIT_LEN: cLenExpected = cRs485RxChar; 
  1056. 014E:  MOVF   30,W
  1057. 014F:  MOVWF  35
  1058. ....................                                  if ( cLenExpected > sizeof(c485Buf) ) 
  1059. 0150:  MOVF   35,W
  1060. 0151:  SUBLW  40
  1061. 0152:  BTFSC  03,0
  1062. 0153:  GOTO   159
  1063. ....................                                  { 
  1064. ....................                                     cRS485State = PKT_INVALID; 
  1065. 0154:  MOVLW  FF
  1066. 0155:  MOVWF  31
  1067. ....................                                     cError = BAD_LENGTH; 
  1068. 0156:  MOVLW  01
  1069. 0157:  MOVWF  7C
  1070. ....................                                  } 
  1071. ....................                                  else 
  1072. 0158:  GOTO   15B
  1073. ....................                                  { 
  1074. ....................                                    cBufPtr = 0; 
  1075. 0159:  CLRF   7B
  1076. ....................                                    cRS485State++; 
  1077. 015A:  INCF   31,F
  1078. ....................                                  } 
  1079. ....................                                  break; 
  1080. 015B:  GOTO   181
  1081. ....................  
  1082. ....................         case           PKT_CMD:  cCommand = cRs485RxChar; 
  1083. 015C:  MOVF   30,W
  1084. 015D:  MOVWF  36
  1085. ....................                                  if ( PacketHasPayload() ) cRS485State = PKT_WAIT_DATA; 
  1086. 015E:  CALL   106
  1087. 015F:  MOVF   21,F
  1088. 0160:  BTFSC  03,2
  1089. 0161:  GOTO   165
  1090. 0162:  MOVLW  05
  1091. 0163:  MOVWF  31
  1092. ....................                                  else cRS485State = PKT_WAIT_CRC_HIGH; 
  1093. 0164:  GOTO   167
  1094. 0165:  MOVLW  06
  1095. 0166:  MOVWF  31
  1096. ....................                                  break; 
  1097. 0167:  GOTO   181
  1098. ....................  
  1099. ....................         case     PKT_WAIT_DATA:  c485Buf[cBufPtr] = cRs485RxChar; 
  1100. 0168:  MOVLW  37
  1101. 0169:  ADDWF  7B,W
  1102. 016A:  MOVWF  04
  1103. 016B:  MOVF   30,W
  1104. 016C:  MOVWF  00
  1105. ....................                                  cBufPtr++; 
  1106. 016D:  INCF   7B,F
  1107. ....................                                  if ( cBufPtr == cLenExpected ) // If last byte of data received 
  1108. 016E:  MOVF   35,W
  1109. 016F:  SUBWF  7B,W
  1110. 0170:  BTFSC  03,2
  1111. ....................                                  { 
  1112. ....................                                    cRS485State++;               // next byet is the CRC high byte 
  1113. 0171:  INCF   31,F
  1114. ....................                                  } 
  1115. ....................                                  break; 
  1116. 0172:  GOTO   181
  1117. ....................  
  1118. ....................         case PKT_WAIT_CRC_HIGH:  cRxCrcHigh = cRs485RxChar; 
  1119. 0173:  MOVF   30,W
  1120. 0174:  MOVWF  77
  1121. ....................                                  cRS485State++; 
  1122. 0175:  INCF   31,F
  1123. ....................                                  break; 
  1124. 0176:  GOTO   181
  1125. ....................  
  1126. ....................         case  PKT_WAIT_CRC_LOW:  cRxCrcLow = cRs485RxChar; 
  1127. 0177:  MOVF   30,W
  1128. 0178:  MOVWF  78
  1129. ....................                                  cRS485State = PKT_COMPLETE; 
  1130. 0179:  MOVLW  08
  1131. 017A:  MOVWF  31
  1132. ....................                                  break; 
  1133. 017B:  GOTO   181
  1134. ....................  
  1135. ....................         case      PKT_COMPLETE:  break;       // Idle state 
  1136. 017C:  GOTO   181
  1137. ....................         case         PKT_VALID:  break;       // Idle state 
  1138. 017D:  GOTO   181
  1139. ....................         case       PKT_INVALID:  break;       // Idle state 
  1140. 017E:  GOTO   181
  1141. ....................  
  1142. ....................         default:                 cRS485State = PKT_WAIT_START; 
  1143. 017F:  CLRF   31
  1144. ....................                                  break; 
  1145. 0180:  GOTO   181
  1146. ....................      } 
  1147. ....................  
  1148. ....................  return cRS485State; 
  1149. 0181:  MOVF   31,W
  1150. 0182:  MOVWF  21
  1151. 0183:  BCF    0A,3
  1152. 0184:  GOTO   193
  1153. .................... } 
  1154. ....................  
  1155. ....................  
  1156. .................... //**************************************************************************** 
  1157. .................... // void Rs485SendPacket( char cAddr, char cCmd, char cLen, char *cData ) 
  1158. .................... // 
  1159. .................... // Send a packet over the RS485 link 
  1160. .................... // 
  1161. .................... // Input: NETWORK_ADDRESS, COMMAND, PAYLOAD_LENGTH, optional DATA 
  1162. .................... // 
  1163. .................... //**************************************************************************** 
  1164. .................... void Rs485SendPacket( char cCmd, char cLen, char *cData ) 
  1165. .................... { 
  1166. .................... char c, d; 
  1167. ....................  
  1168. ....................    BIT_CLEAR( PIE1, RCIE );                          // Disable Receive Interrupt 
  1169. *
  1170. 02DB:  BSF    03,5
  1171. 02DC:  BCF    0C,5
  1172. ....................    BIT_SET( RS485_CONTROL, OUTPUTS_ON );             // Enable driver 
  1173. 02DD:  BCF    03,5
  1174. 02DE:  BSF    07,5
  1175. ....................  
  1176. ....................    delay_ms(1);                                      // Line turnarround time 
  1177. 02DF:  MOVLW  01
  1178. 02E0:  BSF    03,5
  1179. 02E1:  MOVWF  3C
  1180. 02E2:  BCF    03,5
  1181. 02E3:  CALL   1A0
  1182. ....................  
  1183. ....................    cCalcCrcHigh = 0xff;                              // Clear CRC 
  1184. 02E4:  MOVLW  FF
  1185. 02E5:  MOVWF  79
  1186. ....................    cCalcCrcLow = 0xff; 
  1187. 02E6:  MOVWF  7A
  1188. ....................                                                      // Send some NULL preamblesfopr receiving UART 
  1189. ....................    for ( c=0; c < NUM_TX_PREAMBLE; c++ ) Rs485SendChar( 0x00 ); 
  1190. 02E7:  BSF    03,5
  1191. 02E8:  CLRF   35
  1192. 02E9:  BCF    03,5
  1193. 02EA:  BSF    03,5
  1194. 02EB:  MOVF   35,W
  1195. 02EC:  SUBLW  02
  1196. 02ED:  BTFSC  03,0
  1197. 02EE:  GOTO   2F1
  1198. 02EF:  BCF    03,5
  1199. 02F0:  GOTO   2FA
  1200. 02F1:  BCF    03,5
  1201. 02F2:  BSF    03,5
  1202. 02F3:  CLRF   37
  1203. 02F4:  BCF    03,5
  1204. 02F5:  CALL   294
  1205. 02F6:  BSF    03,5
  1206. 02F7:  INCF   35,F
  1207. 02F8:  BCF    03,5
  1208. 02F9:  GOTO   2EA
  1209. ....................  
  1210. ....................    Rs485UpdateCrc( PKT_START ); 
  1211. 02FA:  MOVLW  02
  1212. 02FB:  BSF    03,5
  1213. 02FC:  MOVWF  37
  1214. 02FD:  BCF    03,5
  1215. 02FE:  CALL   2CA
  1216. ....................    Rs485SendChar( PKT_START );       // Send packet start character 
  1217. 02FF:  MOVLW  02
  1218. 0300:  BSF    03,5
  1219. 0301:  MOVWF  37
  1220. 0302:  BCF    03,5
  1221. 0303:  CALL   294
  1222. ....................    Rs485UpdateCrc( cOurAddrHigh ); 
  1223. 0304:  MOVF   2E,W
  1224. 0305:  BSF    03,5
  1225. 0306:  MOVWF  37
  1226. 0307:  BCF    03,5
  1227. 0308:  CALL   2CA
  1228. ....................    Rs485SendChar( cOurAddrHigh );    // Send address high 
  1229. 0309:  MOVF   2E,W
  1230. 030A:  BSF    03,5
  1231. 030B:  MOVWF  37
  1232. 030C:  BCF    03,5
  1233. 030D:  CALL   294
  1234. ....................    Rs485UpdateCrc( cOurAddrLow ); 
  1235. 030E:  MOVF   2F,W
  1236. 030F:  BSF    03,5
  1237. 0310:  MOVWF  37
  1238. 0311:  BCF    03,5
  1239. 0312:  CALL   2CA
  1240. ....................    Rs485SendChar( cOurAddrLow );     // Send address low 
  1241. 0313:  MOVF   2F,W
  1242. 0314:  BSF    03,5
  1243. 0315:  MOVWF  37
  1244. 0316:  BCF    03,5
  1245. 0317:  CALL   294
  1246. ....................    Rs485UpdateCrc( cLen ); 
  1247. 0318:  BSF    03,5
  1248. 0319:  MOVF   33,W
  1249. 031A:  MOVWF  37
  1250. 031B:  BCF    03,5
  1251. 031C:  CALL   2CA
  1252. ....................    Rs485SendChar( cLen );            // Send length 
  1253. 031D:  BSF    03,5
  1254. 031E:  MOVF   33,W
  1255. 031F:  MOVWF  37
  1256. 0320:  BCF    03,5
  1257. 0321:  CALL   294
  1258. ....................    Rs485UpdateCrc( cCmd ); 
  1259. 0322:  BSF    03,5
  1260. 0323:  MOVF   32,W
  1261. 0324:  MOVWF  37
  1262. 0325:  BCF    03,5
  1263. 0326:  CALL   2CA
  1264. ....................    Rs485SendChar( cCmd );            // Send command 
  1265. 0327:  BSF    03,5
  1266. 0328:  MOVF   32,W
  1267. 0329:  MOVWF  37
  1268. 032A:  BCF    03,5
  1269. 032B:  CALL   294
  1270. ....................  
  1271. ....................  
  1272. ....................    if ( cLen != 0 )                  // If payload not empty send data 
  1273. 032C:  BSF    03,5
  1274. 032D:  MOVF   33,F
  1275. 032E:  BTFSS  03,2
  1276. 032F:  GOTO   332
  1277. 0330:  BCF    03,5
  1278. 0331:  GOTO   365
  1279. 0332:  BCF    03,5
  1280. ....................    { 
  1281. ....................      for ( c = 0; c < cLen; c++ ) 
  1282. 0333:  BSF    03,5
  1283. 0334:  CLRF   35
  1284. 0335:  BCF    03,5
  1285. 0336:  BSF    03,5
  1286. 0337:  MOVF   33,W
  1287. 0338:  SUBWF  35,W
  1288. 0339:  BTFSS  03,0
  1289. 033A:  GOTO   33D
  1290. 033B:  BCF    03,5
  1291. 033C:  GOTO   34C
  1292. 033D:  BCF    03,5
  1293. ....................      { 
  1294. ....................         d = cData[c]; 
  1295. 033E:  BSF    03,5
  1296. 033F:  MOVF   34,W
  1297. 0340:  ADDWF  35,W
  1298. 0341:  MOVWF  04
  1299. 0342:  MOVF   00,W
  1300. 0343:  MOVWF  36
  1301. ....................         Rs485UpdateCrc( d ); 
  1302. 0344:  MOVF   36,W
  1303. 0345:  MOVWF  37
  1304. 0346:  BCF    03,5
  1305. 0347:  CALL   2CA
  1306. ....................      } 
  1307. 0348:  BSF    03,5
  1308. 0349:  INCF   35,F
  1309. 034A:  BCF    03,5
  1310. 034B:  GOTO   336
  1311. ....................      for ( c = 0; c < cLen; c++ ) 
  1312. 034C:  BSF    03,5
  1313. 034D:  CLRF   35
  1314. 034E:  BCF    03,5
  1315. 034F:  BSF    03,5
  1316. 0350:  MOVF   33,W
  1317. 0351:  SUBWF  35,W
  1318. 0352:  BTFSS  03,0
  1319. 0353:  GOTO   356
  1320. 0354:  BCF    03,5
  1321. 0355:  GOTO   365
  1322. 0356:  BCF    03,5
  1323. ....................      { 
  1324. ....................         d = cData[c]; 
  1325. 0357:  BSF    03,5
  1326. 0358:  MOVF   34,W
  1327. 0359:  ADDWF  35,W
  1328. 035A:  MOVWF  04
  1329. 035B:  MOVF   00,W
  1330. 035C:  MOVWF  36
  1331. ....................         Rs485SendChar( d );          // Send data 
  1332. 035D:  MOVF   36,W
  1333. 035E:  MOVWF  37
  1334. 035F:  BCF    03,5
  1335. 0360:  CALL   294
  1336. ....................      } 
  1337. 0361:  BSF    03,5
  1338. 0362:  INCF   35,F
  1339. 0363:  BCF    03,5
  1340. 0364:  GOTO   34F
  1341. ....................    } 
  1342. ....................  
  1343. ....................    Rs485SendChar(cCalcCrcHigh); 
  1344. 0365:  MOVF   79,W
  1345. 0366:  BSF    03,5
  1346. 0367:  MOVWF  37
  1347. 0368:  BCF    03,5
  1348. 0369:  CALL   294
  1349. ....................    Rs485SendChar(cCalcCrcLow); 
  1350. 036A:  MOVF   7A,W
  1351. 036B:  BSF    03,5
  1352. 036C:  MOVWF  37
  1353. 036D:  BCF    03,5
  1354. 036E:  CALL   294
  1355. ....................  
  1356. ....................    delay_ms(1); 
  1357. 036F:  MOVLW  01
  1358. 0370:  BSF    03,5
  1359. 0371:  MOVWF  3C
  1360. 0372:  BCF    03,5
  1361. 0373:  CALL   1A0
  1362. ....................    BIT_CLEAR( RS485_CONTROL, OUTPUTS_ON );           // Disable driver 
  1363. 0374:  BCF    07,5
  1364. ....................    BIT_SET( PIE1, RCIE );                            // Enable Receive Interrupt 
  1365. 0375:  BSF    03,5
  1366. 0376:  BSF    0C,5
  1367. 0377:  BCF    03,5
  1368. 0378:  RETLW  00
  1369. .................... } 
  1370. ....................  
  1371. ....................  
  1372. .................... //**************************************************************************** 
  1373. .................... // void Rs485GetPacket( char *cCommand, char cLen, char *cData ) 
  1374. .................... // 
  1375. .................... // Pass packet to main application 
  1376. .................... // 
  1377. .................... //**************************************************************************** 
  1378. .................... void Rs485GetPacket( char *cCom, char *cLen, char *cData ) 
  1379. .................... { 
  1380. .................... char c; 
  1381. ....................  
  1382. ....................   *cCom = cCommand; 
  1383. *
  1384. 048D:  BSF    03,5
  1385. 048E:  MOVF   32,W
  1386. 048F:  MOVWF  04
  1387. 0490:  BCF    03,5
  1388. 0491:  MOVF   36,W
  1389. 0492:  MOVWF  00
  1390. ....................   *cLen = cLenExpected; 
  1391. 0493:  BSF    03,5
  1392. 0494:  MOVF   33,W
  1393. 0495:  MOVWF  04
  1394. 0496:  BCF    03,5
  1395. 0497:  MOVF   35,W
  1396. 0498:  MOVWF  00
  1397. ....................   for ( c=0; c < cLenExpected;c++ )  cData[c] = c485Buf[c]; 
  1398. 0499:  BSF    03,5
  1399. 049A:  CLRF   35
  1400. 049B:  BCF    03,5
  1401. 049C:  MOVF   35,W
  1402. 049D:  BSF    03,5
  1403. 049E:  SUBWF  35,W
  1404. 049F:  BTFSS  03,0
  1405. 04A0:  GOTO   4A3
  1406. 04A1:  BCF    03,5
  1407. 04A2:  GOTO   4B6
  1408. 04A3:  BCF    03,5
  1409. 04A4:  BSF    03,5
  1410. 04A5:  MOVF   34,W
  1411. 04A6:  ADDWF  35,W
  1412. 04A7:  MOVWF  36
  1413. 04A8:  MOVLW  37
  1414. 04A9:  ADDWF  35,W
  1415. 04AA:  MOVWF  04
  1416. 04AB:  MOVF   00,W
  1417. 04AC:  MOVWF  37
  1418. 04AD:  MOVF   36,W
  1419. 04AE:  MOVWF  04
  1420. 04AF:  MOVF   37,W
  1421. 04B0:  MOVWF  00
  1422. 04B1:  BCF    03,5
  1423. 04B2:  BSF    03,5
  1424. 04B3:  INCF   35,F
  1425. 04B4:  BCF    03,5
  1426. 04B5:  GOTO   49C
  1427. ....................  
  1428. ....................   cData[cLenExpected] = 0x00; // Termninate 
  1429. 04B6:  BSF    03,5
  1430. 04B7:  MOVF   34,W
  1431. 04B8:  BCF    03,5
  1432. 04B9:  ADDWF  35,W
  1433. 04BA:  MOVWF  04
  1434. 04BB:  CLRF   00
  1435. 04BC:  BCF    0A,3
  1436. 04BD:  GOTO   5E4
  1437. .................... } 
  1438. ....................  
  1439. ....................  
  1440. .................... /************************************************************************* 
  1441. ....................  * Example Table Driven CRC16 Routine using 4-bit message chunks 
  1442. ....................  * 
  1443. ....................  * By Ashley Roll 
  1444. ....................  * Digital Nemesis Pty Ltd 
  1445. ....................  * www.digitalnemesis.com 
  1446. ....................  * ash@digitalnemesis.com 
  1447. ....................  * 
  1448. ....................  * The following is an example of implementing a restricted size CRC16 
  1449. ....................  * table lookup. No optimisation as been done so the code is clear and 
  1450. ....................  * easy to understand. 
  1451. ....................  * 
  1452. ....................  * Test Vector: "123456789" (character string, no quotes) 
  1453. ....................  * Generated CRC: 0x29B1 
  1454. ....................  * 
  1455. ....................  * Modified for CCS compiler by J.Winpenny 
  1456. ....................  *************************************************************************/ 
  1457. ....................  
  1458. .................... /* 
  1459. ....................  * CRC16 Lookup tables (High and Low Byte) for 4 bits per iteration. 
  1460. ....................  */ 
  1461. ....................  
  1462. .................... const char CRC16_LookupHigh[16] = { 
  1463. ....................         0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 
  1464. ....................         0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1 
  1465. .................... }; 
  1466. *
  1467. 0071:  BCF    0A,0
  1468. 0072:  BCF    0A,1
  1469. 0073:  BCF    0A,2
  1470. 0074:  ADDWF  02,F
  1471. 0075:  RETLW  00
  1472. 0076:  RETLW  10
  1473. 0077:  RETLW  20
  1474. 0078:  RETLW  30
  1475. 0079:  RETLW  40
  1476. 007A:  RETLW  50
  1477. 007B:  RETLW  60
  1478. 007C:  RETLW  70
  1479. 007D:  RETLW  81
  1480. 007E:  RETLW  91
  1481. 007F:  RETLW  A1
  1482. 0080:  RETLW  B1
  1483. 0081:  RETLW  C1
  1484. 0082:  RETLW  D1
  1485. 0083:  RETLW  E1
  1486. 0084:  RETLW  F1
  1487. .................... const char CRC16_LookupLow[16] = { 
  1488. ....................         0x00, 0x21, 0x42, 0x63, 0x84, 0xA5, 0xC6, 0xE7, 
  1489. ....................         0x08, 0x29, 0x4A, 0x6B, 0x8C, 0xAD, 0xCE, 0xEF 
  1490. .................... }; 
  1491. 0085:  BCF    0A,0
  1492. 0086:  BCF    0A,1
  1493. 0087:  BCF    0A,2
  1494. 0088:  ADDWF  02,F
  1495. 0089:  RETLW  00
  1496. 008A:  RETLW  21
  1497. 008B:  RETLW  42
  1498. 008C:  RETLW  63
  1499. 008D:  RETLW  84
  1500. 008E:  RETLW  A5
  1501. 008F:  RETLW  C6
  1502. 0090:  RETLW  E7
  1503. 0091:  RETLW  08
  1504. 0092:  RETLW  29
  1505. 0093:  RETLW  4A
  1506. 0094:  RETLW  6B
  1507. 0095:  RETLW  8C
  1508. 0096:  RETLW  AD
  1509. 0097:  RETLW  CE
  1510. 0098:  RETLW  EF
  1511. ....................  
  1512. ....................  
  1513. .................... /* 
  1514. ....................  * Before each message CRC is generated, the CRC register must be 
  1515. ....................  * initialised by calling this function 
  1516. ....................  */ 
  1517. .................... void CRC16_Init( void ) 
  1518. .................... { 
  1519. ....................  // Initialise the CRC to 0xFFFF for the CCITT specification 
  1520. ....................  cCalcCrcHigh = 0xFF; 
  1521. *
  1522. 03C2:  MOVLW  FF
  1523. 03C3:  MOVWF  79
  1524. ....................  cCalcCrcLow = 0xFF; 
  1525. 03C4:  MOVWF  7A
  1526. .................... } 
  1527. ....................  
  1528. .................... /* 
  1529. ....................  * Process 4 bits of the message to update the CRC Value. 
  1530. ....................  * 
  1531. ....................  * Note that the data must be in the low nibble of val. 
  1532. ....................  */ 
  1533. .................... void CRC16_Update4Bits( char val ) 
  1534. .................... { 
  1535. ....................  char t; 
  1536. ....................  
  1537. ....................  // Step one, extract the Most significant 4 bits of the CRC register 
  1538. ....................  t = cCalcCrcHigh >> 4; 
  1539. *
  1540. 02A3:  SWAPF  79,W
  1541. 02A4:  BSF    03,5
  1542. 02A5:  MOVWF  3A
  1543. 02A6:  MOVLW  0F
  1544. 02A7:  ANDWF  3A,F
  1545. ....................  
  1546. ....................  // XOR in the Message Data into the extracted bits 
  1547. ....................  t = t ^ val; 
  1548. 02A8:  MOVF   39,W
  1549. 02A9:  XORWF  3A,F
  1550. ....................  
  1551. ....................  // Shift the CRC Register left 4 bits 
  1552. ....................  cCalcCrcHigh = (cCalcCrcHigh << 4) | (cCalcCrcLow >> 4); 
  1553. 02AA:  BCF    03,5
  1554. 02AB:  SWAPF  79,W
  1555. 02AC:  BSF    03,5
  1556. 02AD:  MOVWF  3B
  1557. 02AE:  MOVLW  F0
  1558. 02AF:  ANDWF  3B,F
  1559. 02B0:  BCF    03,5
  1560. 02B1:  SWAPF  7A,W
  1561. 02B2:  MOVWF  20
  1562. 02B3:  MOVLW  0F
  1563. 02B4:  ANDWF  20,F
  1564. 02B5:  MOVF   20,W
  1565. 02B6:  BSF    03,5
  1566. 02B7:  IORWF  3B,W
  1567. 02B8:  BCF    03,5
  1568. 02B9:  MOVWF  79
  1569. ....................  cCalcCrcLow = cCalcCrcLow << 4; 
  1570. 02BA:  SWAPF  7A,F
  1571. 02BB:  MOVLW  F0
  1572. 02BC:  ANDWF  7A,F
  1573. ....................  
  1574. ....................  // Do the table lookups and XOR the result into the CRC Tables 
  1575. ....................  cCalcCrcHigh = cCalcCrcHigh ^ CRC16_LookupHigh[t]; 
  1576. 02BD:  BSF    03,5
  1577. 02BE:  MOVF   3A,W
  1578. 02BF:  BCF    03,5
  1579. 02C0:  CALL   071
  1580. 02C1:  MOVWF  21
  1581. 02C2:  XORWF  79,F
  1582. ....................  cCalcCrcLow = cCalcCrcLow ^ CRC16_LookupLow[t]; 
  1583. 02C3:  BSF    03,5
  1584. 02C4:  MOVF   3A,W
  1585. 02C5:  BCF    03,5
  1586. 02C6:  CALL   085
  1587. 02C7:  MOVWF  21
  1588. 02C8:  XORWF  7A,F
  1589. 02C9:  RETLW  00
  1590. .................... } 
  1591. ....................  
  1592. .................... /* 
  1593. ....................  * Process one Message Byte to update the current CRC Value 
  1594. ....................  */ 
  1595. .................... void Rs485UpdateCrc( char cVal ) 
  1596. .................... { 
  1597. ....................  CRC16_Update4Bits( cVal >> 4 ); // High nibble first 
  1598. 02CA:  BSF    03,5
  1599. 02CB:  SWAPF  37,W
  1600. 02CC:  MOVWF  38
  1601. 02CD:  MOVLW  0F
  1602. 02CE:  ANDWF  38,F
  1603. 02CF:  MOVF   38,W
  1604. 02D0:  MOVWF  39
  1605. 02D1:  BCF    03,5
  1606. 02D2:  CALL   2A3
  1607. ....................  CRC16_Update4Bits( cVal & 0x0F ); // Low nibble 
  1608. 02D3:  BSF    03,5
  1609. 02D4:  MOVF   37,W
  1610. 02D5:  ANDLW  0F
  1611. 02D6:  MOVWF  38
  1612. 02D7:  MOVWF  39
  1613. 02D8:  BCF    03,5
  1614. 02D9:  CALL   2A3
  1615. 02DA:  RETLW  00
  1616. .................... } 
  1617. ....................  
  1618. .................... //**************************************************************************** 
  1619. .................... // void Rs485SendChar( char c ) 
  1620. .................... // 
  1621. .................... // Driver level of RS485 protocol 
  1622. .................... // Output character on RS485 driver 
  1623. .................... // // Include line turn around time 
  1624. .................... //**************************************************************************** 
  1625. .................... void Rs485SendChar( char c ) 
  1626. .................... { 
  1627. ....................    TXREG = c;                            // Load data to send 
  1628. *
  1629. 0294:  BSF    03,5
  1630. 0295:  MOVF   37,W
  1631. 0296:  BCF    03,5
  1632. 0297:  MOVWF  19
  1633. ....................    while ( !( TXSTA & TRMT_MASK ));       // Wait for TX Empty 
  1634. 0298:  BSF    03,5
  1635. 0299:  MOVF   18,W
  1636. 029A:  ANDLW  02
  1637. 029B:  XORLW  00
  1638. 029C:  BTFSS  03,2
  1639. 029D:  GOTO   2A0
  1640. 029E:  BCF    03,5
  1641. 029F:  GOTO   298
  1642. 02A0:  BCF    03,5
  1643. 02A1:  GOTO   2A2
  1644. 02A2:  RETLW  00
  1645. .................... } 
  1646. ....................  
  1647. ....................  
  1648. .................... //**************************************************************************** 
  1649. .................... // char PostValidatePacket(void) 
  1650. .................... // 
  1651. .................... // Verify the CRC on the last packet received 
  1652. .................... // 
  1653. .................... // Check if the CRC is correct 
  1654. .................... // and return the updated state as the result 
  1655. .................... // 
  1656. .................... //**************************************************************************** 
  1657. .................... char PostValidatePacket(void) 
  1658. .................... { 
  1659. .................... char c, d; 
  1660. ....................  
  1661. ....................   CRC16_Init(); 
  1662. ....................   Rs485UpdateCrc(PKT_START); 
  1663. *
  1664. 03C5:  MOVLW  02
  1665. 03C6:  BSF    03,5
  1666. 03C7:  MOVWF  37
  1667. 03C8:  BCF    03,5
  1668. 03C9:  CALL   2CA
  1669. ....................   Rs485UpdateCrc(cNetAddrHigh); 
  1670. 03CA:  MOVF   33,W
  1671. 03CB:  BSF    03,5
  1672. 03CC:  MOVWF  37
  1673. 03CD:  BCF    03,5
  1674. 03CE:  CALL   2CA
  1675. ....................   Rs485UpdateCrc(cNetAddrLow); 
  1676. 03CF:  MOVF   34,W
  1677. 03D0:  BSF    03,5
  1678. 03D1:  MOVWF  37
  1679. 03D2:  BCF    03,5
  1680. 03D3:  CALL   2CA
  1681. ....................   Rs485UpdateCrc(cLenExpected); 
  1682. 03D4:  MOVF   35,W
  1683. 03D5:  BSF    03,5
  1684. 03D6:  MOVWF  37
  1685. 03D7:  BCF    03,5
  1686. 03D8:  CALL   2CA
  1687. ....................   Rs485UpdateCrc(cCommand); 
  1688. 03D9:  MOVF   36,W
  1689. 03DA:  BSF    03,5
  1690. 03DB:  MOVWF  37
  1691. 03DC:  BCF    03,5
  1692. 03DD:  CALL   2CA
  1693. ....................  
  1694. ....................   if ( PacketHasPayload() )  // If the packet has a payload, 
  1695. 03DE:  CALL   106
  1696. 03DF:  MOVF   21,F
  1697. 03E0:  BTFSC  03,2
  1698. 03E1:  GOTO   3FA
  1699. ....................   {                          // then include the data in the CRC. 
  1700. ....................      for ( c = 0; c < cLenExpected; c++ ) 
  1701. 03E2:  BSF    03,5
  1702. 03E3:  CLRF   34
  1703. 03E4:  BCF    03,5
  1704. 03E5:  MOVF   35,W
  1705. 03E6:  BSF    03,5
  1706. 03E7:  SUBWF  34,W
  1707. 03E8:  BTFSS  03,0
  1708. 03E9:  GOTO   3EC
  1709. 03EA:  BCF    03,5
  1710. 03EB:  GOTO   3FA
  1711. 03EC:  BCF    03,5
  1712. ....................      { 
  1713. ....................         d = c485Buf[c]; 
  1714. 03ED:  MOVLW  37
  1715. 03EE:  BSF    03,5
  1716. 03EF:  ADDWF  34,W
  1717. 03F0:  MOVWF  04
  1718. 03F1:  MOVF   00,W
  1719. 03F2:  MOVWF  35
  1720. ....................         Rs485UpdateCrc( d ); 
  1721. 03F3:  MOVWF  37
  1722. 03F4:  BCF    03,5
  1723. 03F5:  CALL   2CA
  1724. ....................      } 
  1725. 03F6:  BSF    03,5
  1726. 03F7:  INCF   34,F
  1727. 03F8:  BCF    03,5
  1728. 03F9:  GOTO   3E5
  1729. ....................   } 
  1730. ....................                              // Check if the CRC is correct 
  1731. ....................                              // and return the updated state as the result 
  1732. ....................   if ( (cRxCrcHigh == cCalcCrcHigh)&&(cRxCrcLow == cCalcCrcLow) ) 
  1733. 03FA:  MOVF   79,W
  1734. 03FB:  SUBWF  77,W
  1735. 03FC:  BTFSS  03,2
  1736. 03FD:  GOTO   406
  1737. 03FE:  GOTO   3FF
  1738. 03FF:  MOVF   7A,W
  1739. 0400:  SUBWF  78,W
  1740. 0401:  BTFSS  03,2
  1741. 0402:  GOTO   406
  1742. ....................   { 
  1743. ....................      cRS485State = PKT_VALID; 
  1744. 0403:  MOVLW  09
  1745. 0404:  MOVWF  31
  1746. ....................   } 
  1747. ....................   else 
  1748. 0405:  GOTO   438
  1749. ....................   { 
  1750. ....................      cError = BAD_CRC; 
  1751. 0406:  MOVLW  02
  1752. 0407:  MOVWF  7C
  1753. ....................      cRS485State = PKT_INVALID; 
  1754. 0408:  MOVLW  FF
  1755. 0409:  MOVWF  31
  1756. ....................      ClearLine2(); 
  1757. 040A:  CALL   27D
  1758. ....................      BinToHexAscii(cRxCrcHigh ); 
  1759. 040B:  MOVF   77,W
  1760. 040C:  BSF    03,5
  1761. 040D:  MOVWF  36
  1762. 040E:  BCF    03,5
  1763. 040F:  CALL   379
  1764. ....................      BinToHexAscii(cRxCrcLow ); 
  1765. 0410:  MOVF   78,W
  1766. 0411:  BSF    03,5
  1767. 0412:  MOVWF  36
  1768. 0413:  BCF    03,5
  1769. 0414:  CALL   379
  1770. ....................      LcdWrite(' '); 
  1771. 0415:  MOVLW  20
  1772. 0416:  BSF    03,5
  1773. 0417:  MOVWF  3A
  1774. 0418:  BCF    03,5
  1775. 0419:  CALL   1C9
  1776. ....................      BinToHexAscii(cCalcCrcHigh); 
  1777. 041A:  MOVF   79,W
  1778. 041B:  BSF    03,5
  1779. 041C:  MOVWF  36
  1780. 041D:  BCF    03,5
  1781. 041E:  CALL   379
  1782. ....................      BinToHexAscii(cCalcCrcHigh); 
  1783. 041F:  MOVF   79,W
  1784. 0420:  BSF    03,5
  1785. 0421:  MOVWF  36
  1786. 0422:  BCF    03,5
  1787. 0423:  CALL   379
  1788. ....................      delay_ms(255); 
  1789. 0424:  MOVLW  FF
  1790. 0425:  BSF    03,5
  1791. 0426:  MOVWF  3C
  1792. 0427:  BCF    03,5
  1793. 0428:  CALL   1A0
  1794. ....................      delay_ms(255); 
  1795. 0429:  MOVLW  FF
  1796. 042A:  BSF    03,5
  1797. 042B:  MOVWF  3C
  1798. 042C:  BCF    03,5
  1799. 042D:  CALL   1A0
  1800. ....................      delay_ms(255); 
  1801. 042E:  MOVLW  FF
  1802. 042F:  BSF    03,5
  1803. 0430:  MOVWF  3C
  1804. 0431:  BCF    03,5
  1805. 0432:  CALL   1A0
  1806. ....................      delay_ms(255); 
  1807. 0433:  MOVLW  FF
  1808. 0434:  BSF    03,5
  1809. 0435:  MOVWF  3C
  1810. 0436:  BCF    03,5
  1811. 0437:  CALL   1A0
  1812. ....................   } 
  1813. ....................  
  1814. ....................   return cRS485State; 
  1815. 0438:  MOVF   31,W
  1816. 0439:  MOVWF  21
  1817. .................... } 
  1818. ....................  
  1819. .................... //**************************************************************************** 
  1820. .................... // char GetPacketCmdType(void) 
  1821. .................... // 
  1822. .................... // Check packet command type 
  1823. .................... // Return TRUE if packet has a data payload. 
  1824. .................... // 
  1825. .................... //**************************************************************************** 
  1826. .................... char PacketHasPayload(void) 
  1827. .................... { 
  1828. ....................   if ( cCommand == SENSOR_GET_DATA ) return TRUE; 
  1829. *
  1830. 0106:  MOVF   36,W
  1831. 0107:  SUBLW  A4
  1832. 0108:  BTFSS  03,2
  1833. 0109:  GOTO   10E
  1834. 010A:  MOVLW  01
  1835. 010B:  MOVWF  21
  1836. 010C:  GOTO   111
  1837. ....................   else return FALSE; 
  1838. 010D:  GOTO   111
  1839. 010E:  MOVLW  00
  1840. 010F:  MOVWF  21
  1841. 0110:  GOTO   111
  1842. 0111:  RETLW  00
  1843. .................... } 
  1844. ....................  
  1845. .................... //**************************************************************************** 
  1846. .................... // void BinToHexAscii( char c ) 
  1847. .................... // 
  1848. .................... // Contributed by: Nick De Smith 
  1849. .................... // 
  1850. .................... //**************************************************************************** 
  1851. .................... void BinToHexAscii( char c ) 
  1852. .................... { 
  1853. ....................  const char hexMap[17] = "0123456789ABCDEF"; 
  1854. *
  1855. 0099:  BCF    0A,0
  1856. 009A:  BCF    0A,1
  1857. 009B:  BCF    0A,2
  1858. 009C:  ADDWF  02,F
  1859. 009D:  RETLW  30
  1860. 009E:  RETLW  31
  1861. 009F:  RETLW  32
  1862. 00A0:  RETLW  33
  1863. 00A1:  RETLW  34
  1864. 00A2:  RETLW  35
  1865. 00A3:  RETLW  36
  1866. 00A4:  RETLW  37
  1867. 00A5:  RETLW  38
  1868. 00A6:  RETLW  39
  1869. 00A7:  RETLW  41
  1870. 00A8:  RETLW  42
  1871. 00A9:  RETLW  43
  1872. 00AA:  RETLW  44
  1873. 00AB:  RETLW  45
  1874. 00AC:  RETLW  46
  1875. 00AD:  RETLW  00
  1876. ....................  
  1877. ....................     LcdWrite( hexMap[(c >> 4) & 0xF] ); 
  1878. *
  1879. 0379:  BSF    03,5
  1880. 037A:  SWAPF  36,W
  1881. 037B:  BCF    03,5
  1882. 037C:  MOVWF  20
  1883. 037D:  MOVLW  0F
  1884. 037E:  ANDWF  20,F
  1885. 037F:  MOVF   20,W
  1886. 0380:  ANDLW  0F
  1887. 0381:  CALL   099
  1888. 0382:  BSF    03,5
  1889. 0383:  MOVWF  39
  1890. 0384:  MOVWF  3A
  1891. 0385:  BCF    03,5
  1892. 0386:  CALL   1C9
  1893. ....................     LcdWrite( hexMap[(c & 0xF)] ); 
  1894. 0387:  BSF    03,5
  1895. 0388:  MOVF   36,W
  1896. 0389:  ANDLW  0F
  1897. 038A:  BCF    03,5
  1898. 038B:  CALL   099
  1899. 038C:  BSF    03,5
  1900. 038D:  MOVWF  38
  1901. 038E:  MOVWF  3A
  1902. 038F:  BCF    03,5
  1903. 0390:  CALL   1C9
  1904. 0391:  RETLW  00
  1905. .................... } 
  1906. ....................  
  1907. ....................  
  1908. ....................  
  1909. ....................  
  1910. ....................  
  1911. ....................  
  1912. ....................  
  1913. ....................  
  1914. ....................  
  1915. ....................  
  1916. ....................  
  1917. .................... 
  1918. .................... //#include <lcd2.c>   // LCD routine 
  1919. .................... #include <lcd873b.c>  // Keypad example LCD routine 
  1920. ....................  /***************************************************************************/ 
  1921. .................... /*  Lcd.c       LCD interface routines                                     */ 
  1922. .................... /*  Version :   2.1. for PIC16F87x                                         */ 
  1923. .................... /*                                                                         */ 
  1924. .................... /*  J. Winpenny  1/8/2000                                                  */ 
  1925. .................... /*                                                                         */ 
  1926. .................... /*                                                                         */ 
  1927. .................... /*  Mode : HD44780 type LCD displays                                       */ 
  1928. .................... /*                                                                         */ 
  1929. .................... /*                                                                         */ 
  1930. .................... /* Notes : Updated version                                                 */ 
  1931. .................... /*         to allow greater adaptability to different displays             */ 
  1932. .................... /*                                                                         */ 
  1933. .................... /***************************************************************************/ 
  1934. ....................  
  1935. .................... #include "lcd873b.h" 
  1936. ....................  void LCDSetup(void); 
  1937. .................... void FunctionMode(void); 
  1938. .................... void DataMode(void); 
  1939. .................... void Write_8_Bit(char dh ); 
  1940. .................... void LcdWrite(char dl ); 
  1941. .................... void Delaylcd(void); 
  1942. .................... void Clear(void); 
  1943. .................... void SetPos(char Pos); 
  1944. .................... void Line_1(void); 
  1945. .................... void Line_2(void); 
  1946. .................... void ClearLine1(void); 
  1947. .................... void ClearLine2(void); 
  1948. ....................  
  1949. ....................  
  1950. ....................  
  1951. ....................  
  1952. .................... /************************************************************/ 
  1953. .................... /* LCD Commands ( Refer to LCD Data Sheet )                 */ 
  1954. .................... /* Standard command should work with most common devices    */ 
  1955. .................... /************************************************************/ 
  1956. ....................  
  1957. .................... #define clear_lcd         0x01 /* Clear Display                       */ 
  1958. .................... #define return_home       0x02 /* Cursor to Home position             */ 
  1959. .................... #define entry_mode        0x06 /* Normal entry mode                   */ 
  1960. .................... #define entry_mode_shift  0x07 /* - with shift                        */ 
  1961. .................... #define system_set_8_bit  0x38 
  1962. .................... /* 8 bit data mode 2 line ( 5x7 font ) */ 
  1963. .................... #define system_set_4_bit  0x28 
  1964. .................... /* 4 bit data mode 2 line ( 5x7 font ) */ 
  1965. .................... #define display_on        0x0c /* Switch ON Display                   */ 
  1966. .................... #define display_off       0x08 /* Cursor plus blink                   */ 
  1967. .................... #define set_dd_line1      0x80 /* Line 1 position 1                   */ 
  1968. .................... #define set_dd_line2      0xC0 /* Line 2 position 1                   */ 
  1969. .................... #define set_dd_ram        0x80 /* Line 1 position 1                   */ 
  1970. .................... #define write_data        0x00 /* With rs = 1                         */ 
  1971. .................... #define cursor_on         0x0E /* Switch Cursor ON                    */ 
  1972. .................... #define cursor_off        0x0C /* Switch Cursor OFF                   */ 
  1973. ....................  
  1974. .................... 
  1975. ....................  
  1976. .................... /* Definitions for the LCD interface */ 
  1977. ....................  
  1978. .................... #define LCD_SEL 3 /* Port A bit 3 ( Enables LCD ) */ 
  1979. .................... #define LCD_WR  2 /* Port A bit 2 ( Logic 0 = Write ) */ 
  1980. .................... #define LCD_RS  0 /* Port A bit 1 ( Register select ) */ 
  1981. .................... #define LCD_DATA PORTB 
  1982. .................... #define LCD_CONTROL PORTA 
  1983. ....................  
  1984. ....................  
  1985. .................... #define BUSY_BIT 7 
  1986. .................... #define BUSY_MASK 0x80 
  1987. ....................  
  1988. .................... #define LCD_DATA_4 4   /* LCD BIT 0 */ 
  1989. .................... #define LCD_DATA_5 5   /* LCD BIT 1 */ 
  1990. .................... #define LCD_DATA_6 6   /* LCD BIT 2 */ 
  1991. .................... #define LCD_DATA_7 7   /* LCD BIT 3 */ 
  1992. ....................  
  1993. ....................  
  1994. .................... char ModeFlags; 
  1995. .................... char LCD_gp; 
  1996. ....................  
  1997. ....................  
  1998. .................... /***********************************/ 
  1999. .................... /* Setup the lcd device            */ 
  2000. .................... /***********************************/ 
  2001. .................... void LCDSetup(void) 
  2002. .................... { 
  2003. ....................  /* Reset the LCD */ 
  2004. ....................  
  2005. ....................    ModeFlags = 0;           /* Default to Function Mode */ 
  2006. *
  2007. 0211:  BSF    03,5
  2008. 0212:  CLRF   22
  2009. ....................  
  2010. ....................  
  2011. ....................    Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */ 
  2012. 0213:  MOVLW  28
  2013. 0214:  MOVWF  32
  2014. 0215:  BCF    03,5
  2015. 0216:  CALL   1BB
  2016. ....................    delay_ms(5); 
  2017. 0217:  MOVLW  05
  2018. 0218:  BSF    03,5
  2019. 0219:  MOVWF  3C
  2020. 021A:  BCF    03,5
  2021. 021B:  CALL   1A0
  2022. ....................    Write_8_Bit( system_set_4_bit ); 
  2023. 021C:  MOVLW  28
  2024. 021D:  BSF    03,5
  2025. 021E:  MOVWF  32
  2026. 021F:  BCF    03,5
  2027. 0220:  CALL   1BB
  2028. ....................    delay_ms(1); 
  2029. 0221:  MOVLW  01
  2030. 0222:  BSF    03,5
  2031. 0223:  MOVWF  3C
  2032. 0224:  BCF    03,5
  2033. 0225:  CALL   1A0
  2034. ....................    Write_8_Bit( system_set_4_bit ); 
  2035. 0226:  MOVLW  28
  2036. 0227:  BSF    03,5
  2037. 0228:  MOVWF  32
  2038. 0229:  BCF    03,5
  2039. 022A:  CALL   1BB
  2040. ....................    delay_ms(1); 
  2041. 022B:  MOVLW  01
  2042. 022C:  BSF    03,5
  2043. 022D:  MOVWF  3C
  2044. 022E:  BCF    03,5
  2045. 022F:  CALL   1A0
  2046. ....................    LcdWrite( system_set_4_bit ); 
  2047. 0230:  MOVLW  28
  2048. 0231:  BSF    03,5
  2049. 0232:  MOVWF  3A
  2050. 0233:  BCF    03,5
  2051. 0234:  CALL   1C9
  2052. ....................  
  2053. ....................    LcdWrite( display_on ); 
  2054. 0235:  MOVLW  0C
  2055. 0236:  BSF    03,5
  2056. 0237:  MOVWF  3A
  2057. 0238:  BCF    03,5
  2058. 0239:  CALL   1C9
  2059. ....................    LcdWrite( clear_lcd ); 
  2060. 023A:  MOVLW  01
  2061. 023B:  BSF    03,5
  2062. 023C:  MOVWF  3A
  2063. 023D:  BCF    03,5
  2064. 023E:  CALL   1C9
  2065. ....................    LcdWrite( entry_mode ); 
  2066. 023F:  MOVLW  06
  2067. 0240:  BSF    03,5
  2068. 0241:  MOVWF  3A
  2069. 0242:  BCF    03,5
  2070. 0243:  CALL   1C9
  2071. ....................    LcdWrite( set_dd_ram ); 
  2072. 0244:  MOVLW  80
  2073. 0245:  BSF    03,5
  2074. 0246:  MOVWF  3A
  2075. 0247:  BCF    03,5
  2076. 0248:  CALL   1C9
  2077. ....................    ModeFlags = 1; /* Data Mode */ 
  2078. 0249:  MOVLW  01
  2079. 024A:  BSF    03,5
  2080. 024B:  MOVWF  22
  2081. 024C:  BCF    03,5
  2082. ....................  
  2083. .................... } 
  2084. ....................  
  2085. ....................  
  2086. ....................  
  2087. .................... /***********************************/ 
  2088. .................... /* Put LCD in Function Mode        */ 
  2089. .................... /***********************************/ 
  2090. .................... void FunctionMode(void) 
  2091. .................... { 
  2092. ....................    BIT_CLEAR( ModeFlags, 0 ); /* Save Mode */ 
  2093. *
  2094. 026B:  BSF    03,5
  2095. 026C:  BCF    22,0
  2096. ....................    #asm BCF LCD_CONTROL, LCD_RS #endasm 
  2097. ....................    Delaylcd(); 
  2098. 026D:  BCF    03,5
  2099. 026E:  CALL   1B5
  2100. 026F:  RETLW  00
  2101. .................... } 
  2102. ....................  
  2103. .................... /***********************************/ 
  2104. .................... /* Put LCD in Data Mode            */ 
  2105. .................... /***********************************/ 
  2106. ....................  
  2107. .................... void DataMode(void) 
  2108. .................... { 
  2109. ....................    BIT_SET( ModeFlags, 0 ); /* Save Mode */ 
  2110. 0270:  BSF    03,5
  2111. 0271:  BSF    22,0
  2112. ....................    #asm BSF LCD_CONTROL, LCD_RS #endasm 
  2113. ....................    Delaylcd(); 
  2114. 0272:  BCF    03,5
  2115. 0273:  CALL   1B5
  2116. 0274:  RETLW  00
  2117. .................... } 
  2118. ....................  
  2119. .................... /***********************************/ 
  2120. .................... /* Write a single byte to the LCD  */ 
  2121. .................... /* 8 Bit Mode                      */ 
  2122. .................... /***********************************/ 
  2123. .................... void Write_8_Bit( char dh ) 
  2124. .................... { 
  2125. ....................    #asm BCF LCD_CONTROL, LCD_WR #endasm 
  2126. ....................    #asm BCF LCD_CONTROL, LCD_RS #endasm 
  2127. ....................    #asm BCF LCD_CONTROL, LCD_SEL #endasm 
  2128. ....................  
  2129. ....................    //LCD_CONTROL = 0; 
  2130. ....................  
  2131. ....................    delay_ms(1); 
  2132. *
  2133. 01BB:  MOVLW  01
  2134. 01BC:  BSF    03,5
  2135. 01BD:  MOVWF  3C
  2136. 01BE:  BCF    03,5
  2137. 01BF:  CALL   1A0
  2138. ....................    LCD_DATA = dh;                          /* Setup data    */ 
  2139. 01C0:  BSF    03,5
  2140. 01C1:  MOVF   32,W
  2141. 01C2:  BCF    03,5
  2142. 01C3:  MOVWF  06
  2143. ....................    BIT_SET( LCD_CONTROL, LCD_SEL );        /* Select LCD    */ 
  2144. 01C4:  BSF    05,3
  2145. ....................    Delaylcd(); 
  2146. 01C5:  CALL   1B5
  2147. ....................    BIT_CLEAR( LCD_CONTROL, LCD_SEL );     /* de-select LCD */ 
  2148. 01C6:  BCF    05,3
  2149. ....................    Delaylcd(); 
  2150. 01C7:  CALL   1B5
  2151. 01C8:  RETLW  00
  2152. ....................     
  2153. .................... } 
  2154. ....................  
  2155. ....................  
  2156. .................... /***********************************/ 
  2157. .................... /* Write a single byte to the LCD  */ 
  2158. .................... /* 4 Bit Mode                      */ 
  2159. .................... /***********************************/ 
  2160. .................... void LcdWrite(char dl ) 
  2161. .................... { 
  2162. ....................  
  2163. .................... char e; 
  2164. ....................  
  2165. ....................    e = dl;                           /* Save lower 4 bits */ 
  2166. 01C9:  BSF    03,5
  2167. 01CA:  MOVF   3A,W
  2168. 01CB:  MOVWF  3B
  2169. ....................  
  2170. .................... /*********************************** Output Upper 8 bits ******************************/ 
  2171. ....................  
  2172. ....................    BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode */ 
  2173. 01CC:  BCF    03,5
  2174. 01CD:  BCF    05,2
  2175. ....................  
  2176. ....................    if ( ( ModeFlags & 0x01 ) == 0 ) 
  2177. 01CE:  BSF    03,5
  2178. 01CF:  MOVF   22,W
  2179. 01D0:  ANDLW  01
  2180. 01D1:  XORLW  00
  2181. 01D2:  BTFSC  03,2
  2182. 01D3:  GOTO   1D6
  2183. 01D4:  BCF    03,5
  2184. 01D5:  GOTO   1D9
  2185. 01D6:  BCF    03,5
  2186. ....................       BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */ 
  2187. 01D7:  BCF    05,0
  2188. ....................    else 
  2189. 01D8:  GOTO   1DA
  2190. ....................       BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */ 
  2191. 01D9:  BSF    05,0
  2192. ....................  
  2193. ....................    BIT_CLEAR( LCD_CONTROL, LCD_SEL); 
  2194. 01DA:  BCF    05,3
  2195. ....................    LCD_DATA = dl;                           /* Setup data    */ 
  2196. 01DB:  BSF    03,5
  2197. 01DC:  MOVF   3A,W
  2198. 01DD:  BCF    03,5
  2199. 01DE:  MOVWF  06
  2200. ....................  
  2201. ....................    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */ 
  2202. 01DF:  BSF    05,3
  2203. ....................    Delaylcd(); 
  2204. 01E0:  CALL   1B5
  2205. ....................    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */ 
  2206. 01E1:  BCF    05,3
  2207. ....................  
  2208. ....................  
  2209. ....................    dl = e;                                  /* Restore lower 4 bits */ 
  2210. 01E2:  BSF    03,5
  2211. 01E3:  MOVF   3B,W
  2212. 01E4:  MOVWF  3A
  2213. ....................    dl <<= 4; 
  2214. 01E5:  SWAPF  3A,F
  2215. 01E6:  MOVLW  F0
  2216. 01E7:  ANDWF  3A,F
  2217. ....................  
  2218. .................... /*********************************** Output Lower 8 bits ******************************/ 
  2219. ....................  
  2220. ....................    BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode    */ 
  2221. 01E8:  BCF    03,5
  2222. 01E9:  BCF    05,2
  2223. ....................  
  2224. ....................    if ( ( ModeFlags & 0x01 ) == 0 ) 
  2225. 01EA:  BSF    03,5
  2226. 01EB:  MOVF   22,W
  2227. 01EC:  ANDLW  01
  2228. 01ED:  XORLW  00
  2229. 01EE:  BTFSC  03,2
  2230. 01EF:  GOTO   1F2
  2231. 01F0:  BCF    03,5
  2232. 01F1:  GOTO   1F5
  2233. 01F2:  BCF    03,5
  2234. ....................       BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */ 
  2235. 01F3:  BCF    05,0
  2236. ....................    else 
  2237. 01F4:  GOTO   1F6
  2238. ....................       BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */ 
  2239. 01F5:  BSF    05,0
  2240. ....................  
  2241. ....................    BIT_CLEAR( LCD_CONTROL, LCD_SEL); 
  2242. 01F6:  BCF    05,3
  2243. ....................    LCD_DATA = dl;                           /* Setup data    */ 
  2244. 01F7:  BSF    03,5
  2245. 01F8:  MOVF   3A,W
  2246. 01F9:  BCF    03,5
  2247. 01FA:  MOVWF  06
  2248. ....................  
  2249. ....................    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */ 
  2250. 01FB:  BSF    05,3
  2251. ....................    Delaylcd(); 
  2252. 01FC:  CALL   1B5
  2253. ....................    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */ 
  2254. 01FD:  BCF    05,3
  2255. ....................    Delaylcd(); 
  2256. 01FE:  CALL   1B5
  2257. 01FF:  RETLW  00
  2258. .................... } 
  2259. ....................  
  2260. .................... /***********************************/ 
  2261. .................... /* LCD timing delay                */ 
  2262. .................... /* Adjust for your LCD Display     */ 
  2263. .................... /***********************************/ 
  2264. .................... void Delaylcd(void) 
  2265. .................... { 
  2266. ....................    delay_ms(2); 
  2267. *
  2268. 01B5:  MOVLW  02
  2269. 01B6:  BSF    03,5
  2270. 01B7:  MOVWF  3C
  2271. 01B8:  BCF    03,5
  2272. 01B9:  CALL   1A0
  2273. 01BA:  RETLW  00
  2274. .................... } 
  2275. ....................  
  2276. .................... /***********************************/ 
  2277. .................... /* Clear LCD Screen                */ 
  2278. .................... /***********************************/ 
  2279. .................... void Clear(void) 
  2280. .................... { 
  2281. ....................  
  2282. ....................    FunctionMode(); 
  2283. ....................    LcdWrite(clear_lcd); 
  2284. ....................    DataMode(); 
  2285. ....................  
  2286. .................... } 
  2287. ....................  
  2288. .................... /***********************************/ 
  2289. .................... /* Set the cursor position         */ 
  2290. .................... /***********************************/ 
  2291. .................... void SetPos(char Pos) 
  2292. .................... { 
  2293. ....................  
  2294. ....................    FunctionMode(); 
  2295. ....................    LcdWrite( Pos ); 
  2296. ....................    DataMode(); 
  2297. ....................  
  2298. .................... } 
  2299. ....................  
  2300. .................... /***********************************/ 
  2301. .................... /* Set Position to line 1          */ 
  2302. .................... /***********************************/ 
  2303. .................... void Line1(void) 
  2304. .................... { 
  2305. ....................    FunctionMode(); 
  2306. *
  2307. 04BE:  CALL   26B
  2308. ....................    LcdWrite( set_dd_line1 ); 
  2309. 04BF:  MOVLW  80
  2310. 04C0:  BSF    03,5
  2311. 04C1:  MOVWF  3A
  2312. 04C2:  BCF    03,5
  2313. 04C3:  CALL   1C9
  2314. ....................    DataMode(); 
  2315. 04C4:  CALL   270
  2316. 04C5:  RETLW  00
  2317. .................... } 
  2318. ....................  
  2319. .................... /***********************************/ 
  2320. .................... /* Set Position to line 2          */ 
  2321. .................... /***********************************/ 
  2322. .................... void Line2(void) 
  2323. .................... { 
  2324. ....................    FunctionMode(); 
  2325. *
  2326. 0275:  CALL   26B
  2327. ....................    LcdWrite( set_dd_line2 ); 
  2328. 0276:  MOVLW  C0
  2329. 0277:  BSF    03,5
  2330. 0278:  MOVWF  3A
  2331. 0279:  BCF    03,5
  2332. 027A:  CALL   1C9
  2333. ....................    DataMode(); 
  2334. 027B:  CALL   270
  2335. 027C:  RETLW  00
  2336. .................... } 
  2337. ....................  
  2338. .................... /*******************************************/ 
  2339. .................... /* Clear Line 1                            */ 
  2340. .................... /*******************************************/ 
  2341. .................... void ClearLine1(void) 
  2342. .................... { 
  2343. ....................  
  2344. ....................    Line1(); 
  2345. *
  2346. 062C:  CALL   4BE
  2347. ....................  
  2348. ....................    for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ ) 
  2349. 062D:  BSF    03,5
  2350. 062E:  CLRF   23
  2351. 062F:  BCF    03,5
  2352. 0630:  BSF    03,5
  2353. 0631:  MOVF   23,W
  2354. 0632:  SUBLW  0F
  2355. 0633:  BTFSC  03,0
  2356. 0634:  GOTO   637
  2357. 0635:  BCF    03,5
  2358. 0636:  GOTO   641
  2359. 0637:  BCF    03,5
  2360. ....................       { 
  2361. ....................           LcdWrite(' '); 
  2362. 0638:  MOVLW  20
  2363. 0639:  BSF    03,5
  2364. 063A:  MOVWF  3A
  2365. 063B:  BCF    03,5
  2366. 063C:  CALL   1C9
  2367. ....................       } 
  2368. 063D:  BSF    03,5
  2369. 063E:  INCF   23,F
  2370. 063F:  BCF    03,5
  2371. 0640:  GOTO   630
  2372. ....................  
  2373. ....................    Line1(); 
  2374. 0641:  CALL   4BE
  2375. .................... } 
  2376. ....................  
  2377. .................... /*******************************************/ 
  2378. .................... /* Clear Line 2                            */ 
  2379. .................... /*******************************************/ 
  2380. .................... void ClearLine2(void) 
  2381. .................... { 
  2382. ....................  
  2383. ....................   Line2(); 
  2384. *
  2385. 027D:  CALL   275
  2386. ....................  
  2387. ....................   for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ ) 
  2388. 027E:  BSF    03,5
  2389. 027F:  CLRF   23
  2390. 0280:  BCF    03,5
  2391. 0281:  BSF    03,5
  2392. 0282:  MOVF   23,W
  2393. 0283:  SUBLW  0F
  2394. 0284:  BTFSC  03,0
  2395. 0285:  GOTO   288
  2396. 0286:  BCF    03,5
  2397. 0287:  GOTO   292
  2398. 0288:  BCF    03,5
  2399. ....................      { 
  2400. ....................          LcdWrite(' '); 
  2401. 0289:  MOVLW  20
  2402. 028A:  BSF    03,5
  2403. 028B:  MOVWF  3A
  2404. 028C:  BCF    03,5
  2405. 028D:  CALL   1C9
  2406. ....................      } 
  2407. 028E:  BSF    03,5
  2408. 028F:  INCF   23,F
  2409. 0290:  BCF    03,5
  2410. 0291:  GOTO   281
  2411. ....................  
  2412. ....................   Line2(); 
  2413. 0292:  CALL   275
  2414. 0293:  RETLW  00
  2415. .................... } 
  2416. ....................  
  2417. .................... 
  2418. ....................  
  2419. ....................  
  2420. .................... #use fast_io(A) 
  2421. .................... #use fast_io(B) 
  2422. .................... #use fast_io(C) 
  2423. .................... #use fast_io(D) 
  2424. .................... #use fast_io(E) 
  2425. ....................  
  2426. .................... char cTest[10]; 
  2427. ....................  
  2428. .................... //************************************************** 
  2429. .................... // Timer Interrupt service routine 
  2430. .................... //************************************************** 
  2431. .................... #INT_RTCC 
  2432. .................... clock_isr() 
  2433. .................... { 
  2434. ....................      TMR0 = TMR0_RELOAD;        // Reload PICs timer 
  2435. *
  2436. 00FE:  MOVLW  FF
  2437. 00FF:  BSF    03,6
  2438. 0100:  MOVWF  01
  2439. ....................      BIT_CLEAR( INTCON, T0IF ); // Clear interrupt flag 
  2440. 0101:  BCF    03,6
  2441. 0102:  BCF    0B,2
  2442. .................... } 
  2443. ....................  
  2444. .................... //************************************************** 
  2445. .................... // USART interrupt service routine 
  2446. .................... //************************************************** 
  2447. 0103:  BCF    0B,2
  2448. 0104:  BCF    0A,3
  2449. 0105:  GOTO   02E
  2450. .................... #INT_RDA 
  2451. .................... void UsartInterrupt(void) 
  2452. .................... { 
  2453. ....................  
  2454. ....................     while ( BIT_TEST( PIR1, RCIF )  )              // If USART RX Interrupt 
  2455. *
  2456. 0185:  BTFSS  0C,5
  2457. 0186:  GOTO   19D
  2458. ....................     { 
  2459. ....................  
  2460. ....................          TMR0 = TMR0_RELOAD; 
  2461. 0187:  MOVLW  FF
  2462. 0188:  BSF    03,6
  2463. 0189:  MOVWF  01
  2464. ....................  
  2465. ....................          cRs485RxChar = RCREG; 
  2466. 018A:  BCF    03,6
  2467. 018B:  MOVF   1A,W
  2468. 018C:  MOVWF  30
  2469. ....................  
  2470. ....................          if ( !( RCSTA & 6 ) )                 // Then if no errors 
  2471. 018D:  MOVF   18,W
  2472. 018E:  ANDLW  06
  2473. 018F:  XORLW  00
  2474. 0190:  BTFSS  03,2
  2475. 0191:  GOTO   195
  2476. ....................          {                                     // Process received character 
  2477. ....................              Rs485Decode();                    // Decode RS485 network trafic 
  2478. 0192:  GOTO   112
  2479. ....................              bit_set( RCSTA, CREN );           // Enable receiver. 
  2480. 0193:  BSF    18,4
  2481. ....................          } 
  2482. ....................          else 
  2483. 0194:  GOTO   19B
  2484. ....................          { 
  2485. ....................              bit_clear( RCSTA, CREN );         // Clear any errors 
  2486. 0195:  BCF    18,4
  2487. ....................              cRs485RxChar = RCREG; 
  2488. 0196:  MOVF   1A,W
  2489. 0197:  MOVWF  30
  2490. ....................              cRs485RxChar = RCREG; 
  2491. 0198:  MOVF   1A,W
  2492. 0199:  MOVWF  30
  2493. ....................              bit_set( RCSTA, CREN );           // Enable receiver. 
  2494. 019A:  BSF    18,4
  2495. ....................          } 
  2496. ....................  
  2497. ....................         bit_clear( PIR1, RCIF ); 
  2498. 019B:  BCF    0C,5
  2499. ....................  
  2500. ....................     } 
  2501. 019C:  GOTO   185
  2502. ....................  
  2503. 019D:  BCF    0C,5
  2504. 019E:  BCF    0A,3
  2505. 019F:  GOTO   02E
  2506. .................... } 
  2507. ....................  
  2508. .................... void main(void) 
  2509. .................... { 
  2510. .................... char cPacketReady; 
  2511. .................... char cLenOfData; 
  2512. .................... char cCmd, c; 
  2513. *
  2514. 04C6:  CLRF   04
  2515. 04C7:  MOVLW  1F
  2516. 04C8:  ANDWF  03,F
  2517. 04C9:  MOVLW  9F
  2518. 04CA:  MOVWF  04
  2519. 04CB:  MOVLW  07
  2520. 04CC:  MOVWF  00
  2521. 04CD:  CLRF   2E
  2522. 04CE:  CLRF   2F
  2523. 04CF:  CLRF   30
  2524. 04D0:  CLRF   31
  2525. 04D1:  CLRF   32
  2526. 04D2:  CLRF   33
  2527. 04D3:  CLRF   34
  2528. 04D4:  CLRF   35
  2529. 04D5:  CLRF   36
  2530. 04D6:  CLRF   37
  2531. 04D7:  CLRF   38
  2532. 04D8:  CLRF   39
  2533. 04D9:  CLRF   3A
  2534. 04DA:  CLRF   3B
  2535. 04DB:  CLRF   3C
  2536. 04DC:  CLRF   3D
  2537. 04DD:  CLRF   3E
  2538. 04DE:  CLRF   3F
  2539. 04DF:  CLRF   40
  2540. 04E0:  CLRF   41
  2541. 04E1:  CLRF   42
  2542. 04E2:  CLRF   43
  2543. 04E3:  CLRF   44
  2544. 04E4:  CLRF   45
  2545. 04E5:  CLRF   46
  2546. 04E6:  CLRF   47
  2547. 04E7:  CLRF   48
  2548. 04E8:  CLRF   49
  2549. 04E9:  CLRF   4A
  2550. 04EA:  CLRF   4B
  2551. 04EB:  CLRF   4C
  2552. 04EC:  CLRF   4D
  2553. 04ED:  CLRF   4E
  2554. 04EE:  CLRF   4F
  2555. 04EF:  CLRF   50
  2556. 04F0:  CLRF   51
  2557. 04F1:  CLRF   52
  2558. 04F2:  CLRF   53
  2559. 04F3:  CLRF   54
  2560. 04F4:  CLRF   55
  2561. 04F5:  CLRF   56
  2562. 04F6:  CLRF   57
  2563. 04F7:  CLRF   58
  2564. 04F8:  CLRF   59
  2565. 04F9:  CLRF   5A
  2566. 04FA:  CLRF   5B
  2567. 04FB:  CLRF   5C
  2568. 04FC:  CLRF   5D
  2569. 04FD:  CLRF   5E
  2570. 04FE:  CLRF   5F
  2571. 04FF:  CLRF   60
  2572. 0500:  CLRF   61
  2573. 0501:  CLRF   62
  2574. 0502:  CLRF   63
  2575. 0503:  CLRF   64
  2576. 0504:  CLRF   65
  2577. 0505:  CLRF   66
  2578. 0506:  CLRF   67
  2579. 0507:  CLRF   68
  2580. 0508:  CLRF   69
  2581. 0509:  CLRF   6A
  2582. 050A:  CLRF   6B
  2583. 050B:  CLRF   6C
  2584. 050C:  CLRF   6D
  2585. 050D:  CLRF   6E
  2586. 050E:  CLRF   6F
  2587. 050F:  CLRF   70
  2588. 0510:  CLRF   71
  2589. 0511:  CLRF   72
  2590. 0512:  CLRF   73
  2591. 0513:  CLRF   74
  2592. 0514:  CLRF   75
  2593. 0515:  CLRF   76
  2594. 0516:  CLRF   77
  2595. 0517:  CLRF   78
  2596. 0518:  CLRF   79
  2597. 0519:  CLRF   7A
  2598. 051A:  CLRF   7B
  2599. 051B:  CLRF   7C
  2600. 051C:  CLRF   7D
  2601. 051D:  CLRF   7E
  2602. 051E:  CLRF   7F
  2603. 051F:  BSF    03,5
  2604. 0520:  CLRF   20
  2605. 0521:  CLRF   21
  2606. ....................  
  2607. ....................    Setup(); 
  2608. 0522:  BCF    03,5
  2609. 0523:  GOTO   200
  2610. ....................    BIT_CLEAR( INTCON, T0IE ); // Timer interrupts off 
  2611. 0524:  BCF    0B,5
  2612. ....................  
  2613. .................... #ifndef MASTER 
  2614. ....................    LcdWrite("Waiting........"); 
  2615. .................... #else 
  2616. ....................    LcdWrite("Sending message"); 
  2617. *
  2618. 00AE:  BCF    0A,0
  2619. 00AF:  BCF    0A,1
  2620. 00B0:  BCF    0A,2
  2621. 00B1:  ADDWF  02,F
  2622. 00B2:  RETLW  53
  2623. 00B3:  RETLW  65
  2624. 00B4:  RETLW  6E
  2625. 00B5:  RETLW  64
  2626. 00B6:  RETLW  69
  2627. 00B7:  RETLW  6E
  2628. 00B8:  RETLW  67
  2629. 00B9:  RETLW  20
  2630. 00BA:  RETLW  6D
  2631. 00BB:  RETLW  65
  2632. 00BC:  RETLW  73
  2633. 00BD:  RETLW  73
  2634. 00BE:  RETLW  61
  2635. 00BF:  RETLW  67
  2636. 00C0:  RETLW  65
  2637. 00C1:  RETLW  00
  2638. *
  2639. 0525:  BSF    03,5
  2640. 0526:  CLRF   32
  2641. 0527:  BCF    03,5
  2642. 0528:  BSF    03,5
  2643. 0529:  MOVF   32,W
  2644. 052A:  BCF    03,5
  2645. 052B:  CALL   0AE
  2646. 052C:  IORLW  00
  2647. 052D:  BTFSC  03,2
  2648. 052E:  GOTO   535
  2649. 052F:  BSF    03,5
  2650. 0530:  INCF   32,F
  2651. 0531:  MOVWF  3A
  2652. 0532:  BCF    03,5
  2653. 0533:  CALL   1C9
  2654. 0534:  GOTO   528
  2655. .................... #endif 
  2656. ....................  
  2657. ....................      // Just setup the network address 
  2658. ....................      //write_eeprom( NET_ADDRESS_HIGH, 0x10 ); 
  2659. ....................      //write_eeprom( NET_ADDRESS_LOW, 0x10 ); 
  2660. ....................      //cOurAddrHigh = read_eeprom( NET_ADDRESS_HIGH  ); 
  2661. ....................      //cOurAddressLow = read_eeprom( NET_ADDRESS_LOW ); 
  2662. ....................  
  2663. ....................       while ( 1 ) 
  2664. ....................       { 
  2665. ....................  
  2666. ....................         cOurAddrHigh = 0x10; 
  2667. 0535:  MOVLW  10
  2668. 0536:  MOVWF  2E
  2669. ....................         cOurAddrLow = 0x10; 
  2670. 0537:  MOVWF  2F
  2671. ....................         Rs485Initialise( cOurAddrHigh,cOurAddrLow ); 
  2672. 0538:  MOVF   2E,W
  2673. 0539:  BSF    03,5
  2674. 053A:  MOVWF  32
  2675. 053B:  BCF    03,5
  2676. 053C:  MOVF   2F,W
  2677. 053D:  BSF    03,5
  2678. 053E:  MOVWF  33
  2679. 053F:  BCF    03,5
  2680. 0540:  CALL   25D
  2681. ....................  
  2682. ....................         #ifdef MASTER 
  2683. ....................         cTest[0] = 'H'; 
  2684. 0541:  MOVLW  48
  2685. 0542:  BSF    03,5
  2686. 0543:  MOVWF  24
  2687. ....................         cTest[1] = 'e'; 
  2688. 0544:  MOVLW  65
  2689. 0545:  MOVWF  25
  2690. ....................         cTest[2] = 'l'; 
  2691. 0546:  MOVLW  6C
  2692. 0547:  MOVWF  26
  2693. ....................         cTest[3] = 'l'; 
  2694. 0548:  MOVWF  27
  2695. ....................         cTest[4] = 'o'; 
  2696. 0549:  MOVLW  6F
  2697. 054A:  MOVWF  28
  2698. ....................         cTest[5] = 0; 
  2699. 054B:  CLRF   29
  2700. ....................  
  2701. ....................         ClearLine2(); 
  2702. 054C:  BCF    03,5
  2703. 054D:  CALL   27D
  2704. ....................         LcdWrite("GET DATA PKT"); 
  2705. *
  2706. 00C2:  BCF    0A,0
  2707. 00C3:  BCF    0A,1
  2708. 00C4:  BCF    0A,2
  2709. 00C5:  ADDWF  02,F
  2710. 00C6:  RETLW  47
  2711. 00C7:  RETLW  45
  2712. 00C8:  RETLW  54
  2713. 00C9:  RETLW  20
  2714. 00CA:  RETLW  44
  2715. 00CB:  RETLW  41
  2716. 00CC:  RETLW  54
  2717. 00CD:  RETLW  41
  2718. 00CE:  RETLW  20
  2719. 00CF:  RETLW  50
  2720. 00D0:  RETLW  4B
  2721. 00D1:  RETLW  54
  2722. 00D2:  RETLW  00
  2723. *
  2724. 054E:  BSF    03,5
  2725. 054F:  CLRF   32
  2726. 0550:  BCF    03,5
  2727. 0551:  BSF    03,5
  2728. 0552:  MOVF   32,W
  2729. 0553:  BCF    03,5
  2730. 0554:  CALL   0C2
  2731. 0555:  IORLW  00
  2732. 0556:  BTFSC  03,2
  2733. 0557:  GOTO   55E
  2734. 0558:  BSF    03,5
  2735. 0559:  INCF   32,F
  2736. 055A:  MOVWF  3A
  2737. 055B:  BCF    03,5
  2738. 055C:  CALL   1C9
  2739. 055D:  GOTO   551
  2740. ....................         Rs485SendPacket( SENSOR_GET_DATA, 5, &cTest[0] ); 
  2741. 055E:  MOVLW  A4
  2742. 055F:  BSF    03,5
  2743. 0560:  MOVWF  32
  2744. 0561:  MOVLW  05
  2745. 0562:  MOVWF  33
  2746. 0563:  MOVLW  A4
  2747. 0564:  MOVWF  34
  2748. 0565:  BCF    03,5
  2749. 0566:  CALL   2DB
  2750. ....................         delay_ms(250); 
  2751. 0567:  MOVLW  FA
  2752. 0568:  BSF    03,5
  2753. 0569:  MOVWF  3C
  2754. 056A:  BCF    03,5
  2755. 056B:  CALL   1A0
  2756. ....................         delay_ms(250); 
  2757. 056C:  MOVLW  FA
  2758. 056D:  BSF    03,5
  2759. 056E:  MOVWF  3C
  2760. 056F:  BCF    03,5
  2761. 0570:  CALL   1A0
  2762. ....................         delay_ms(250); 
  2763. 0571:  MOVLW  FA
  2764. 0572:  BSF    03,5
  2765. 0573:  MOVWF  3C
  2766. 0574:  BCF    03,5
  2767. 0575:  CALL   1A0
  2768. ....................         delay_ms(250); 
  2769. 0576:  MOVLW  FA
  2770. 0577:  BSF    03,5
  2771. 0578:  MOVWF  3C
  2772. 0579:  BCF    03,5
  2773. 057A:  CALL   1A0
  2774. ....................         ClearLine2(); 
  2775. 057B:  CALL   27D
  2776. ....................         LcdWrite("POLL PKT"); 
  2777. *
  2778. 00D3:  BCF    0A,0
  2779. 00D4:  BCF    0A,1
  2780. 00D5:  BCF    0A,2
  2781. 00D6:  ADDWF  02,F
  2782. 00D7:  RETLW  50
  2783. 00D8:  RETLW  4F
  2784. 00D9:  RETLW  4C
  2785. 00DA:  RETLW  4C
  2786. 00DB:  RETLW  20
  2787. 00DC:  RETLW  50
  2788. 00DD:  RETLW  4B
  2789. 00DE:  RETLW  54
  2790. 00DF:  RETLW  00
  2791. *
  2792. 057C:  BSF    03,5
  2793. 057D:  CLRF   32
  2794. 057E:  BCF    03,5
  2795. 057F:  BSF    03,5
  2796. 0580:  MOVF   32,W
  2797. 0581:  BCF    03,5
  2798. 0582:  CALL   0D3
  2799. 0583:  IORLW  00
  2800. 0584:  BTFSC  03,2
  2801. 0585:  GOTO   58C
  2802. 0586:  BSF    03,5
  2803. 0587:  INCF   32,F
  2804. 0588:  MOVWF  3A
  2805. 0589:  BCF    03,5
  2806. 058A:  CALL   1C9
  2807. 058B:  GOTO   57F
  2808. ....................         Rs485SendPacket( SENSOR_POLL_CMD, 0, &cTest[0] ); 
  2809. 058C:  MOVLW  A1
  2810. 058D:  BSF    03,5
  2811. 058E:  MOVWF  32
  2812. 058F:  CLRF   33
  2813. 0590:  MOVLW  A4
  2814. 0591:  MOVWF  34
  2815. 0592:  BCF    03,5
  2816. 0593:  CALL   2DB
  2817. ....................         delay_ms(250); 
  2818. 0594:  MOVLW  FA
  2819. 0595:  BSF    03,5
  2820. 0596:  MOVWF  3C
  2821. 0597:  BCF    03,5
  2822. 0598:  CALL   1A0
  2823. ....................         delay_ms(250); 
  2824. 0599:  MOVLW  FA
  2825. 059A:  BSF    03,5
  2826. 059B:  MOVWF  3C
  2827. 059C:  BCF    03,5
  2828. 059D:  CALL   1A0
  2829. ....................         delay_ms(250); 
  2830. 059E:  MOVLW  FA
  2831. 059F:  BSF    03,5
  2832. 05A0:  MOVWF  3C
  2833. 05A1:  BCF    03,5
  2834. 05A2:  CALL   1A0
  2835. ....................         delay_ms(250); 
  2836. 05A3:  MOVLW  FA
  2837. 05A4:  BSF    03,5
  2838. 05A5:  MOVWF  3C
  2839. 05A6:  BCF    03,5
  2840. 05A7:  CALL   1A0
  2841. ....................  
  2842. ....................         cOurAddrHigh = 0x10; 
  2843. 05A8:  MOVLW  10
  2844. 05A9:  MOVWF  2E
  2845. ....................         cOurAddrLow = 0x18; 
  2846. 05AA:  MOVLW  18
  2847. 05AB:  MOVWF  2F
  2848. ....................         // Send a packet to another node 
  2849. ....................         Rs485Initialise( cOurAddrHigh,cOurAddrLow ); 
  2850. 05AC:  MOVF   2E,W
  2851. 05AD:  BSF    03,5
  2852. 05AE:  MOVWF  32
  2853. 05AF:  BCF    03,5
  2854. 05B0:  MOVF   2F,W
  2855. 05B1:  BSF    03,5
  2856. 05B2:  MOVWF  33
  2857. 05B3:  BCF    03,5
  2858. 05B4:  CALL   25D
  2859. ....................  
  2860. ....................         Rs485SendPacket( SENSOR_POLL_CMD, 0, &cTest[0] ); 
  2861. 05B5:  MOVLW  A1
  2862. 05B6:  BSF    03,5
  2863. 05B7:  MOVWF  32
  2864. 05B8:  CLRF   33
  2865. 05B9:  MOVLW  A4
  2866. 05BA:  MOVWF  34
  2867. 05BB:  BCF    03,5
  2868. 05BC:  CALL   2DB
  2869. ....................         delay_ms(250); 
  2870. 05BD:  MOVLW  FA
  2871. 05BE:  BSF    03,5
  2872. 05BF:  MOVWF  3C
  2873. 05C0:  BCF    03,5
  2874. 05C1:  CALL   1A0
  2875. ....................         delay_ms(250); 
  2876. 05C2:  MOVLW  FA
  2877. 05C3:  BSF    03,5
  2878. 05C4:  MOVWF  3C
  2879. 05C5:  BCF    03,5
  2880. 05C6:  CALL   1A0
  2881. ....................         delay_ms(250); 
  2882. 05C7:  MOVLW  FA
  2883. 05C8:  BSF    03,5
  2884. 05C9:  MOVWF  3C
  2885. 05CA:  BCF    03,5
  2886. 05CB:  CALL   1A0
  2887. ....................         delay_ms(250); 
  2888. 05CC:  MOVLW  FA
  2889. 05CD:  BSF    03,5
  2890. 05CE:  MOVWF  3C
  2891. 05CF:  BCF    03,5
  2892. 05D0:  CALL   1A0
  2893. ....................  
  2894. ....................         #endif 
  2895. ....................  
  2896. ....................         cPacketReady = Rs485Process(); 
  2897. 05D1:  GOTO   392
  2898. 05D2:  MOVF   21,W
  2899. 05D3:  BSF    03,5
  2900. 05D4:  MOVWF  2E
  2901. ....................  
  2902. ....................         if ( cPacketReady ) 
  2903. 05D5:  MOVF   2E,F
  2904. 05D6:  BTFSS  03,2
  2905. 05D7:  GOTO   5DA
  2906. 05D8:  BCF    03,5
  2907. 05D9:  GOTO   652
  2908. 05DA:  BCF    03,5
  2909. ....................         { 
  2910. ....................            Rs485GetPacket( &cCmd, &cLenOfData, &cTest[0] ); 
  2911. 05DB:  MOVLW  B0
  2912. 05DC:  BSF    03,5
  2913. 05DD:  MOVWF  32
  2914. 05DE:  MOVLW  AF
  2915. 05DF:  MOVWF  33
  2916. 05E0:  MOVLW  A4
  2917. 05E1:  MOVWF  34
  2918. 05E2:  BCF    03,5
  2919. 05E3:  GOTO   48D
  2920. ....................  
  2921. ....................            ClearLine2(); 
  2922. 05E4:  CALL   27D
  2923. ....................            LcdWrite( "CMD: " ); 
  2924. *
  2925. 00E0:  BCF    0A,0
  2926. 00E1:  BCF    0A,1
  2927. 00E2:  BCF    0A,2
  2928. 00E3:  ADDWF  02,F
  2929. 00E4:  RETLW  43
  2930. 00E5:  RETLW  4D
  2931. 00E6:  RETLW  44
  2932. 00E7:  RETLW  3A
  2933. 00E8:  RETLW  20
  2934. 00E9:  RETLW  00
  2935. *
  2936. 05E5:  BSF    03,5
  2937. 05E6:  CLRF   32
  2938. 05E7:  BCF    03,5
  2939. 05E8:  BSF    03,5
  2940. 05E9:  MOVF   32,W
  2941. 05EA:  BCF    03,5
  2942. 05EB:  CALL   0E0
  2943. 05EC:  IORLW  00
  2944. 05ED:  BTFSC  03,2
  2945. 05EE:  GOTO   5F5
  2946. 05EF:  BSF    03,5
  2947. 05F0:  INCF   32,F
  2948. 05F1:  MOVWF  3A
  2949. 05F2:  BCF    03,5
  2950. 05F3:  CALL   1C9
  2951. 05F4:  GOTO   5E8
  2952. ....................            BinToHexAscii( cCmd ); 
  2953. 05F5:  BSF    03,5
  2954. 05F6:  MOVF   30,W
  2955. 05F7:  MOVWF  36
  2956. 05F8:  BCF    03,5
  2957. 05F9:  CALL   379
  2958. ....................            LcdWrite( ' ' ); 
  2959. 05FA:  MOVLW  20
  2960. 05FB:  BSF    03,5
  2961. 05FC:  MOVWF  3A
  2962. 05FD:  BCF    03,5
  2963. 05FE:  CALL   1C9
  2964. ....................  
  2965. ....................            if ( cLenOfData != 0 ) 
  2966. 05FF:  BSF    03,5
  2967. 0600:  MOVF   2F,F
  2968. 0601:  BTFSS  03,2
  2969. 0602:  GOTO   605
  2970. 0603:  BCF    03,5
  2971. 0604:  GOTO   61E
  2972. 0605:  BCF    03,5
  2973. ....................            { 
  2974. ....................              for ( c=0; c<cLenOfData; c++ ) LcdWrite( cTest[c] ); 
  2975. 0606:  BSF    03,5
  2976. 0607:  CLRF   31
  2977. 0608:  BCF    03,5
  2978. 0609:  BSF    03,5
  2979. 060A:  MOVF   2F,W
  2980. 060B:  SUBWF  31,W
  2981. 060C:  BTFSS  03,0
  2982. 060D:  GOTO   610
  2983. 060E:  BCF    03,5
  2984. 060F:  GOTO   61E
  2985. 0610:  BCF    03,5
  2986. 0611:  MOVLW  A4
  2987. 0612:  BSF    03,5
  2988. 0613:  ADDWF  31,W
  2989. 0614:  MOVWF  04
  2990. 0615:  MOVF   00,W
  2991. 0616:  MOVWF  32
  2992. 0617:  MOVWF  3A
  2993. 0618:  BCF    03,5
  2994. 0619:  CALL   1C9
  2995. 061A:  BSF    03,5
  2996. 061B:  INCF   31,F
  2997. 061C:  BCF    03,5
  2998. 061D:  GOTO   609
  2999. ....................            } 
  3000. ....................  
  3001. ....................            //Rs485SendPacket( SENSOR_ACK, 0, NULL ); 
  3002. ....................            delay_ms(255); 
  3003. 061E:  MOVLW  FF
  3004. 061F:  BSF    03,5
  3005. 0620:  MOVWF  3C
  3006. 0621:  BCF    03,5
  3007. 0622:  CALL   1A0
  3008. ....................            Rs485Initialise(cOurAddrHigh,cOurAddrLow); 
  3009. 0623:  MOVF   2E,W
  3010. 0624:  BSF    03,5
  3011. 0625:  MOVWF  32
  3012. 0626:  BCF    03,5
  3013. 0627:  MOVF   2F,W
  3014. 0628:  BSF    03,5
  3015. 0629:  MOVWF  33
  3016. 062A:  BCF    03,5
  3017. 062B:  CALL   25D
  3018. ....................            ClearLine1(); 
  3019. ....................            LcdWrite("Waiting........"); 
  3020. *
  3021. 00EA:  BCF    0A,0
  3022. 00EB:  BCF    0A,1
  3023. 00EC:  BCF    0A,2
  3024. 00ED:  ADDWF  02,F
  3025. 00EE:  RETLW  57
  3026. 00EF:  RETLW  61
  3027. 00F0:  RETLW  69
  3028. 00F1:  RETLW  74
  3029. 00F2:  RETLW  69
  3030. 00F3:  RETLW  6E
  3031. 00F4:  RETLW  67
  3032. 00F5:  RETLW  2E
  3033. 00F6:  RETLW  2E
  3034. 00F7:  RETLW  2E
  3035. 00F8:  RETLW  2E
  3036. 00F9:  RETLW  2E
  3037. 00FA:  RETLW  2E
  3038. 00FB:  RETLW  2E
  3039. 00FC:  RETLW  2E
  3040. 00FD:  RETLW  00
  3041. *
  3042. 0642:  BSF    03,5
  3043. 0643:  CLRF   32
  3044. 0644:  BCF    03,5
  3045. 0645:  BSF    03,5
  3046. 0646:  MOVF   32,W
  3047. 0647:  BCF    03,5
  3048. 0648:  CALL   0EA
  3049. 0649:  IORLW  00
  3050. 064A:  BTFSC  03,2
  3051. 064B:  GOTO   652
  3052. 064C:  BSF    03,5
  3053. 064D:  INCF   32,F
  3054. 064E:  MOVWF  3A
  3055. 064F:  BCF    03,5
  3056. 0650:  CALL   1C9
  3057. 0651:  GOTO   645
  3058. ....................         } 
  3059. ....................  
  3060. ....................    } 
  3061. 0652:  GOTO   535
  3062. ....................  
  3063. .................... } 
  3064. ....................  
  3065. 0653:  SLEEP
  3066. ....................  
  3067. .................... //************************** 
  3068. .................... // Setup  Hardware 
  3069. .................... //************************** 
  3070. .................... void Setup(void) 
  3071. .................... { 
  3072. ....................     OPTIONREG = 0x84;             //  pullups,prescailer = TMR0 , rate = 1:32 
  3073. *
  3074. 0200:  MOVLW  84
  3075. 0201:  BSF    03,5
  3076. 0202:  MOVWF  01
  3077. ....................     INTCON = 0;                   // disable global interupts 
  3078. 0203:  BCF    03,5
  3079. 0204:  CLRF   0B
  3080. ....................     ADCON1 = 0x07;                // Disable ADC 
  3081. 0205:  MOVLW  07
  3082. 0206:  BSF    03,5
  3083. 0207:  MOVWF  1F
  3084. ....................     TRISA = PortAConfig; 
  3085. 0208:  CLRF   05
  3086. ....................     TRISB = PortBConfig; 
  3087. 0209:  CLRF   06
  3088. ....................     TRISC = PortCConfig; 
  3089. 020A:  MOVLW  0F
  3090. 020B:  MOVWF  07
  3091. ....................     TRISD = PortDConfig; 
  3092. 020C:  CLRF   08
  3093. ....................     TRISE = PortEConfig; 
  3094. 020D:  CLRF   09
  3095. ....................     PORTC = 0xFF; 
  3096. 020E:  MOVLW  FF
  3097. 020F:  BCF    03,5
  3098. 0210:  MOVWF  07
  3099. ....................     LCDSetup();                         // Setup the LCD Display 
  3100. ....................     ConfigureComms();                  /* Configure USART for Asyncronous Comms */ 
  3101. ....................     PORTC = 0xF7; 
  3102. *
  3103. 0259:  MOVLW  F7
  3104. 025A:  MOVWF  07
  3105. 025B:  BCF    0A,3
  3106. 025C:  GOTO   524
  3107. .................... } 
  3108. ....................  
  3109. ....................  
  3110. .................... //*******************************************************/ 
  3111. .................... //* Configure PIC16F87x USART for communications        */ 
  3112. .................... //*                                                     */ 
  3113. .................... //* Asynchronous mode                                   */ 
  3114. .................... //* 8 data bits  ( For other rates see PIC16F8XX Data ) */ 
  3115. .................... //* 1 stop bits                                         */ 
  3116. .................... //* No Parity                                           */ 
  3117. .................... //*                                                     */ 
  3118. .................... //*******************************************************/ 
  3119. .................... void ConfigureComms(void) 
  3120. .................... { 
  3121. ....................     BIT_SET( RCSTA, SPEN );    // Enable Serial port 
  3122. *
  3123. 024D:  BSF    18,7
  3124. ....................     BIT_CLEAR( RCSTA, RX9 );   // 8 bit receive mode 
  3125. 024E:  BCF    18,6
  3126. ....................     BIT_CLEAR( TXSTA, TX9 );   // 8 bit transmit mode 
  3127. 024F:  BSF    03,5
  3128. 0250:  BCF    18,6
  3129. ....................  
  3130. ....................     // SPBRG = 0;              // SPBRG = 1  ( Set Baud rate 115,200 ) 
  3131. ....................     // SPBRG = 5;              // SPBRG = 5  ( Set Baud rate 38,400 ) 
  3132. ....................     // SPBRG = 22;             // SPBRG = 22 ( Set Baud rate 9,600 ) 
  3133. ....................     // SPBRG = 11;             // SPBRG = 11 ( Set Baud rate 19,200 ) 
  3134. ....................     // SPBRG = 22;             // SPBRG = 22 ( Set Baud rate 9,600 ) 
  3135. ....................     // SPBRG = 47;             // SPBRG = 47 ( 9600 Baud at 7.3728 Mhx clock ) 
  3136. ....................     // SPBRG = 22;             // SPBRG = 22 ( 9600 Baud at 3.579545Mhz clock ) 
  3137. ....................  
  3138. ....................     SPBRG = 25;                // SPBRG = 25 ( 9600 Baud at 4 Mhx clock ) 
  3139. 0251:  MOVLW  19
  3140. 0252:  MOVWF  19
  3141. ....................  
  3142. ....................     BIT_SET( TXSTA, BRGH );    // BRGH = 1   ( High speed mode ) 
  3143. 0253:  BSF    18,2
  3144. ....................     BIT_CLEAR( TXSTA, SYNC );  // Asyncronous mode; 
  3145. 0254:  BCF    18,4
  3146. ....................     BIT_SET( TXSTA, TXEN );    // Enable Transmitter 
  3147. 0255:  BSF    18,5
  3148. ....................     BIT_SET( RCSTA, CREN );    // Enable continuous receive 
  3149. 0256:  BCF    03,5
  3150. 0257:  BSF    18,4
  3151. ....................     BIT_SET( INTCON, PEIE );   // Enable all Peripheral Interrupts 
  3152. 0258:  BSF    0B,6
  3153. .................... } 
  3154. ....................  
  3155. ....................  
  3156. ....................  
  3157. ....................  
  3158. ....................