⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tstrs485.lst

📁 基于PIC16F873构成485接口的C源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
.................... // Send a packet over the RS485 link 
.................... // 
.................... // Input: NETWORK_ADDRESS, COMMAND, PAYLOAD_LENGTH, optional DATA 
.................... // 
.................... //**************************************************************************** 
.................... void Rs485SendPacket( char cCmd, char cLen, char *cData ) 
.................... { 
.................... char c, d; 
....................  
....................    BIT_CLEAR( PIE1, RCIE );                          // Disable Receive Interrupt 
*
02DB:  BSF    03,5
02DC:  BCF    0C,5
....................    BIT_SET( RS485_CONTROL, OUTPUTS_ON );             // Enable driver 
02DD:  BCF    03,5
02DE:  BSF    07,5
....................  
....................    delay_ms(1);                                      // Line turnarround time 
02DF:  MOVLW  01
02E0:  BSF    03,5
02E1:  MOVWF  3C
02E2:  BCF    03,5
02E3:  CALL   1A0
....................  
....................    cCalcCrcHigh = 0xff;                              // Clear CRC 
02E4:  MOVLW  FF
02E5:  MOVWF  79
....................    cCalcCrcLow = 0xff; 
02E6:  MOVWF  7A
....................                                                      // Send some NULL preamblesfopr receiving UART 
....................    for ( c=0; c < NUM_TX_PREAMBLE; c++ ) Rs485SendChar( 0x00 ); 
02E7:  BSF    03,5
02E8:  CLRF   35
02E9:  BCF    03,5
02EA:  BSF    03,5
02EB:  MOVF   35,W
02EC:  SUBLW  02
02ED:  BTFSC  03,0
02EE:  GOTO   2F1
02EF:  BCF    03,5
02F0:  GOTO   2FA
02F1:  BCF    03,5
02F2:  BSF    03,5
02F3:  CLRF   37
02F4:  BCF    03,5
02F5:  CALL   294
02F6:  BSF    03,5
02F7:  INCF   35,F
02F8:  BCF    03,5
02F9:  GOTO   2EA
....................  
....................    Rs485UpdateCrc( PKT_START ); 
02FA:  MOVLW  02
02FB:  BSF    03,5
02FC:  MOVWF  37
02FD:  BCF    03,5
02FE:  CALL   2CA
....................    Rs485SendChar( PKT_START );       // Send packet start character 
02FF:  MOVLW  02
0300:  BSF    03,5
0301:  MOVWF  37
0302:  BCF    03,5
0303:  CALL   294
....................    Rs485UpdateCrc( cOurAddrHigh ); 
0304:  MOVF   2E,W
0305:  BSF    03,5
0306:  MOVWF  37
0307:  BCF    03,5
0308:  CALL   2CA
....................    Rs485SendChar( cOurAddrHigh );    // Send address high 
0309:  MOVF   2E,W
030A:  BSF    03,5
030B:  MOVWF  37
030C:  BCF    03,5
030D:  CALL   294
....................    Rs485UpdateCrc( cOurAddrLow ); 
030E:  MOVF   2F,W
030F:  BSF    03,5
0310:  MOVWF  37
0311:  BCF    03,5
0312:  CALL   2CA
....................    Rs485SendChar( cOurAddrLow );     // Send address low 
0313:  MOVF   2F,W
0314:  BSF    03,5
0315:  MOVWF  37
0316:  BCF    03,5
0317:  CALL   294
....................    Rs485UpdateCrc( cLen ); 
0318:  BSF    03,5
0319:  MOVF   33,W
031A:  MOVWF  37
031B:  BCF    03,5
031C:  CALL   2CA
....................    Rs485SendChar( cLen );            // Send length 
031D:  BSF    03,5
031E:  MOVF   33,W
031F:  MOVWF  37
0320:  BCF    03,5
0321:  CALL   294
....................    Rs485UpdateCrc( cCmd ); 
0322:  BSF    03,5
0323:  MOVF   32,W
0324:  MOVWF  37
0325:  BCF    03,5
0326:  CALL   2CA
....................    Rs485SendChar( cCmd );            // Send command 
0327:  BSF    03,5
0328:  MOVF   32,W
0329:  MOVWF  37
032A:  BCF    03,5
032B:  CALL   294
....................  
....................  
....................    if ( cLen != 0 )                  // If payload not empty send data 
032C:  BSF    03,5
032D:  MOVF   33,F
032E:  BTFSS  03,2
032F:  GOTO   332
0330:  BCF    03,5
0331:  GOTO   365
0332:  BCF    03,5
....................    { 
....................      for ( c = 0; c < cLen; c++ ) 
0333:  BSF    03,5
0334:  CLRF   35
0335:  BCF    03,5
0336:  BSF    03,5
0337:  MOVF   33,W
0338:  SUBWF  35,W
0339:  BTFSS  03,0
033A:  GOTO   33D
033B:  BCF    03,5
033C:  GOTO   34C
033D:  BCF    03,5
....................      { 
....................         d = cData[c]; 
033E:  BSF    03,5
033F:  MOVF   34,W
0340:  ADDWF  35,W
0341:  MOVWF  04
0342:  MOVF   00,W
0343:  MOVWF  36
....................         Rs485UpdateCrc( d ); 
0344:  MOVF   36,W
0345:  MOVWF  37
0346:  BCF    03,5
0347:  CALL   2CA
....................      } 
0348:  BSF    03,5
0349:  INCF   35,F
034A:  BCF    03,5
034B:  GOTO   336
....................      for ( c = 0; c < cLen; c++ ) 
034C:  BSF    03,5
034D:  CLRF   35
034E:  BCF    03,5
034F:  BSF    03,5
0350:  MOVF   33,W
0351:  SUBWF  35,W
0352:  BTFSS  03,0
0353:  GOTO   356
0354:  BCF    03,5
0355:  GOTO   365
0356:  BCF    03,5
....................      { 
....................         d = cData[c]; 
0357:  BSF    03,5
0358:  MOVF   34,W
0359:  ADDWF  35,W
035A:  MOVWF  04
035B:  MOVF   00,W
035C:  MOVWF  36
....................         Rs485SendChar( d );          // Send data 
035D:  MOVF   36,W
035E:  MOVWF  37
035F:  BCF    03,5
0360:  CALL   294
....................      } 
0361:  BSF    03,5
0362:  INCF   35,F
0363:  BCF    03,5
0364:  GOTO   34F
....................    } 
....................  
....................    Rs485SendChar(cCalcCrcHigh); 
0365:  MOVF   79,W
0366:  BSF    03,5
0367:  MOVWF  37
0368:  BCF    03,5
0369:  CALL   294
....................    Rs485SendChar(cCalcCrcLow); 
036A:  MOVF   7A,W
036B:  BSF    03,5
036C:  MOVWF  37
036D:  BCF    03,5
036E:  CALL   294
....................  
....................    delay_ms(1); 
036F:  MOVLW  01
0370:  BSF    03,5
0371:  MOVWF  3C
0372:  BCF    03,5
0373:  CALL   1A0
....................    BIT_CLEAR( RS485_CONTROL, OUTPUTS_ON );           // Disable driver 
0374:  BCF    07,5
....................    BIT_SET( PIE1, RCIE );                            // Enable Receive Interrupt 
0375:  BSF    03,5
0376:  BSF    0C,5
0377:  BCF    03,5
0378:  RETLW  00
.................... } 
....................  
....................  
.................... //**************************************************************************** 
.................... // void Rs485GetPacket( char *cCommand, char cLen, char *cData ) 
.................... // 
.................... // Pass packet to main application 
.................... // 
.................... //**************************************************************************** 
.................... void Rs485GetPacket( char *cCom, char *cLen, char *cData ) 
.................... { 
.................... char c; 
....................  
....................   *cCom = cCommand; 
*
048D:  BSF    03,5
048E:  MOVF   32,W
048F:  MOVWF  04
0490:  BCF    03,5
0491:  MOVF   36,W
0492:  MOVWF  00
....................   *cLen = cLenExpected; 
0493:  BSF    03,5
0494:  MOVF   33,W
0495:  MOVWF  04
0496:  BCF    03,5
0497:  MOVF   35,W
0498:  MOVWF  00
....................   for ( c=0; c < cLenExpected;c++ )  cData[c] = c485Buf[c]; 
0499:  BSF    03,5
049A:  CLRF   35
049B:  BCF    03,5
049C:  MOVF   35,W
049D:  BSF    03,5
049E:  SUBWF  35,W
049F:  BTFSS  03,0
04A0:  GOTO   4A3
04A1:  BCF    03,5
04A2:  GOTO   4B6
04A3:  BCF    03,5
04A4:  BSF    03,5
04A5:  MOVF   34,W
04A6:  ADDWF  35,W
04A7:  MOVWF  36
04A8:  MOVLW  37
04A9:  ADDWF  35,W
04AA:  MOVWF  04
04AB:  MOVF   00,W
04AC:  MOVWF  37
04AD:  MOVF   36,W
04AE:  MOVWF  04
04AF:  MOVF   37,W
04B0:  MOVWF  00
04B1:  BCF    03,5
04B2:  BSF    03,5
04B3:  INCF   35,F
04B4:  BCF    03,5
04B5:  GOTO   49C
....................  
....................   cData[cLenExpected] = 0x00; // Termninate 
04B6:  BSF    03,5
04B7:  MOVF   34,W
04B8:  BCF    03,5
04B9:  ADDWF  35,W
04BA:  MOVWF  04
04BB:  CLRF   00
04BC:  BCF    0A,3
04BD:  GOTO   5E4
.................... } 
....................  
....................  
.................... /************************************************************************* 
....................  * Example Table Driven CRC16 Routine using 4-bit message chunks 
....................  * 
....................  * By Ashley Roll 
....................  * Digital Nemesis Pty Ltd 
....................  * www.digitalnemesis.com 
....................  * ash@digitalnemesis.com 
....................  * 
....................  * The following is an example of implementing a restricted size CRC16 
....................  * table lookup. No optimisation as been done so the code is clear and 
....................  * easy to understand. 
....................  * 
....................  * Test Vector: "123456789" (character string, no quotes) 
....................  * Generated CRC: 0x29B1 
....................  * 
....................  * Modified for CCS compiler by J.Winpenny 
....................  *************************************************************************/ 
....................  
.................... /* 
....................  * CRC16 Lookup tables (High and Low Byte) for 4 bits per iteration. 
....................  */ 
....................  
.................... const char CRC16_LookupHigh[16] = { 
....................         0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 
....................         0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1 
.................... }; 
*
0071:  BCF    0A,0
0072:  BCF    0A,1
0073:  BCF    0A,2
0074:  ADDWF  02,F
0075:  RETLW  00
0076:  RETLW  10
0077:  RETLW  20
0078:  RETLW  30
0079:  RETLW  40
007A:  RETLW  50
007B:  RETLW  60
007C:  RETLW  70
007D:  RETLW  81
007E:  RETLW  91
007F:  RETLW  A1
0080:  RETLW  B1
0081:  RETLW  C1
0082:  RETLW  D1
0083:  RETLW  E1
0084:  RETLW  F1
.................... const char CRC16_LookupLow[16] = { 
....................         0x00, 0x21, 0x42, 0x63, 0x84, 0xA5, 0xC6, 0xE7, 
....................         0x08, 0x29, 0x4A, 0x6B, 0x8C, 0xAD, 0xCE, 0xEF 
.................... }; 
0085:  BCF    0A,0
0086:  BCF    0A,1
0087:  BCF    0A,2
0088:  ADDWF  02,F
0089:  RETLW  00
008A:  RETLW  21
008B:  RETLW  42
008C:  RETLW  63
008D:  RETLW  84
008E:  RETLW  A5
008F:  RETLW  C6
0090:  RETLW  E7
0091:  RETLW  08
0092:  RETLW  29
0093:  RETLW  4A
0094:  RETLW  6B
0095:  RETLW  8C
0096:  RETLW  AD
0097:  RETLW  CE
0098:  RETLW  EF
....................  
....................  
.................... /* 
....................  * Before each message CRC is generated, the CRC register must be 
....................  * initialised by calling this function 
....................  */ 
.................... void CRC16_Init( void ) 
.................... { 
.................... 	// Initialise the CRC to 0xFFFF for the CCITT specification 
.................... 	cCalcCrcHigh = 0xFF; 
*
03C2:  MOVLW  FF
03C3:  MOVWF  79
.................... 	cCalcCrcLow = 0xFF; 
03C4:  MOVWF  7A
.................... } 
....................  
.................... /* 
....................  * Process 4 bits of the message to update the CRC Value. 
....................  * 
....................  * Note that the data must be in the low nibble of val. 
....................  */ 
.................... void CRC16_Update4Bits( char val ) 
.................... { 
.................... 	char	t; 
....................  
.................... 	// Step one, extract the Most significant 4 bits of the CRC register 
.................... 	t = cCalcCrcHigh >> 4; 
*
02A3:  SWAPF  79,W
02A4:  BSF    03,5
02A5:  MOVWF  3A
02A6:  MOVLW  0F
02A7:  ANDWF  3A,F
....................  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -