?? tstrs485.lst
字號:
.................... // 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 + -