📄 modbus16.lis
字号:
0006 ; 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0006 ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0006 ; 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0006 ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0006 ; 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0006 ; 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0006 ; 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0006 ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
0006 ; } ;
0006 ; /* CRC低位字节值表*/
0006 ; const uint8 auchCRCLo[] = {
0006 ; 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0006 ; 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0006 ; 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0006 ; 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0006 ; 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0006 ; 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0006 ; 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0006 ; 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0006 ; 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0006 ; 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0006 ; 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0006 ; 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0006 ; 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0006 ; 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0006 ; 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0006 ; 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0006 ; 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0006 ; 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0006 ; 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0006 ; 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0006 ; 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0006 ; 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0006 ; 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0006 ; 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0006 ; 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0006 ; 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
0006 ; } ;
0006 ;
0006 ; uint8 testCoil; //用于测试 位地址1
0006 ; uint16 testRegister; //用于测试 字地址0
0006 ;
0006 ; uint8 localAddr = 1; //地址
0006 ; uint8 sendCount; //发送字节个数
0006 ; uint8 receCount; //接收字节个数
0006 ; uint8 sendPosi; //发送位置
0006 ; uint8 sendBuf[32],receBuf[32]; //发送,接收缓冲区
0006 ; uint8 checkoutError; //校验结果
0006 ; uint8 receTimeOut; //接收超时
0006 ;
0006 ; uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
0006 ; {
0006 .dbline 78
0006 ; uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
0006 6FEF ldi R22,255
0008 .dbline 79
0008 ; uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
0008 4FEF ldi R20,255
000A 2FC0 xjmp L3
000C L2:
000C .dbline 82
000C .dbline 83
000C F801 movw R30,R16
000E 2190 ld R2,Z+
0010 8F01 movw R16,R30
0012 3324 clr R3
0014 462E mov R4,R22
0016 5524 clr R5
0018 4224 eor R4,R2
001A 5324 eor R5,R3
001C 1201 movw R2,R4
001E 4424 clr R4
0020 37FC sbrc R3,7
0022 4094 com R4
0024 5524 clr R5
0026 47FC sbrc R4,7
0028 5094 com R5
002A FE01 movw R30,R28
002C 2082 std z+0,R2
002E 3182 std z+1,R3
0030 4282 std z+2,R4
0032 5382 std z+3,R5
0034 .dbline 84
0034 80E0 ldi R24,<_auchCRCHi
0036 90E0 ldi R25,>_auchCRCHi
0038 AF93 push R26
003A BF93 push R27
003C A081 ldd R26,z+0
003E B181 ldd R27,z+1
0040 FD01 movw R30,R26
0042 BF91 pop R27
0044 AF91 pop R26
0046 E80F add R30,R24
0048 F91F adc R31,R25
004A E491 lpm R30,Z
004C 642F mov R22,R20
004E 6E27 eor R22,R30
0050 .dbline 85
0050 80E0 ldi R24,<_auchCRCLo
0052 90E0 ldi R25,>_auchCRCLo
0054 FE01 movw R30,R28
0056 AF93 push R26
0058 BF93 push R27
005A A081 ldd R26,z+0
005C B181 ldd R27,z+1
005E FD01 movw R30,R26
0060 BF91 pop R27
0062 AF91 pop R26
0064 E80F add R30,R24
0066 F91F adc R31,R25
0068 4491 lpm R20,Z
006A .dbline 86
006A L3:
006A .dbline 81
006A ; uint32 uIndex ; /* CRC循环中的索引 */
006A ; while (usDataLen--) /* 传输消息缓冲区 */
006A 1901 movw R2,R18
006C 2150 subi R18,1
006E 3040 sbci R19,0
0070 2220 tst R2
0072 09F0 breq X1
0074 CBCF xjmp L2
0076 X1:
0076 3320 tst R3
0078 09F0 breq X2
007A C8CF xjmp L2
007C X2:
007C X0:
007C .dbline 87
007C ; {
007C ; uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
007C ; uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
007C ; uchCRCLo = auchCRCLo[uIndex] ;
007C ; }
007C ; return (uchCRCHi << 8 | uchCRCLo) ;
007C 042F mov R16,R20
007E 162F mov R17,R22
0080 .dbline -2
0080 L1:
0080 2496 adiw R28,4
0082 0E940000 xcall pop_gset2
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r uchCRCLo 20 c
0088 .dbsym r uchCRCHi 22 c
0088 .dbsym l uIndex 0 l
0088 .dbsym r usDataLen 18 i
0088 .dbsym r puchMsg 16 pc
0088 .dbend
0088 .dbfunc e beginSend _beginSend fV
.even
0088 _beginSend::
0088 .dbline -1
0088 .dbline 92
0088 ; }//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
0088 ;
0088 ; //开始发送
0088 ; void beginSend(void)
0088 ; {
0088 .dbline 93
0088 ; sendEnable(); //设为发送
0088 C79A sbi 0x18,7
008A .dbline 95
008A ;
008A ; sendPosi = 0;
008A 2224 clr R2
008C 20924300 sts _sendPosi,R2
0090 .dbline 96
0090 ; if(sendCount > 1)
0090 81E0 ldi R24,1
0092 20904500 lds R2,_sendCount
0096 8215 cp R24,R2
0098 20F4 brsh L6
009A .dbline 97
009A ; sendCount--;
009A 822D mov R24,R2
009C 8150 subi R24,1
009E 80934500 sts _sendCount,R24
00A2 L6:
00A2 .dbline 98
00A2 ; UDR = sendBuf[0];
00A2 20902300 lds R2,_sendBuf
00A6 2CB8 out 0xc,R2
00A8 .dbline -2
00A8 .dbline 99
00A8 ; }//void beginSend(void)
00A8 L5:
00A8 .dbline 0 ; func end
00A8 0895 ret
00AA .dbend
00AA .dbfunc e readCoil _readCoil fV
00AA ; result -> <dead>
00AA ; crcData -> R22,R23
00AA ; byteCount -> R20
00AA ; k -> R22
00AA ; exit -> y+4
00AA ; addr -> y+3
00AA ; bitCount -> R10
00AA ; position -> R12
00AA ; tempData -> y+0
00AA ; tempAddr -> y+2
00AA ; i -> R14
.even
00AA _readCoil::
00AA 0E940000 xcall push_gset5
00AE 2597 sbiw R28,5
00B0 .dbline -1
00B0 .dbline 104
00B0 ;
00B0 ;
00B0 ; //读线圈状态
00B0 ; void readCoil(void)
00B0 ; {
00B0 .dbline 114
00B0 ; uint8 addr;
00B0 ; uint8 tempAddr;
00B0 ; uint8 byteCount;
00B0 ; uint8 bitCount;
00B0 ; uint16 crcData;
00B0 ; uint8 position;
00B0 ; uint8 i,k;
00B0 ; uint8 result;
00B0 ; uint16 tempData;
00B0 ; uint8 exit = 0;
00B0 0024 clr R0
00B2 0C82 std y+4,R0
00B4 .dbline 118
00B4 ;
00B4 ; //addr = (receBuf[2]<<8) + receBuf[3];
00B4 ; //tempAddr = addr & 0xfff;
00B4 ; addr = receBuf[3];
00B4 20900600 lds R2,_receBuf+3
00B8 2B82 std y+3,R2
00BA .dbline 119
00BA ; tempAddr = addr;
00BA 022C mov R0,R2
00BC 0A82 std y+2,R0
00BE .dbline 122
00BE ;
00BE ; //bitCount = (receBuf[4]<<8) + receBuf[5]; //读取的位个数
00BE ; bitCount = receBuf[5];
00BE A0900800 lds R10,_receBuf+5
00C2 .dbline 124
00C2 ;
00C2 ; byteCount = bitCount / 8; //字节个数
00C2 18E0 ldi R17,8
00C4 0A2D mov R16,R10
00C6 0E940000 xcall div8u
00CA 402F mov R20,R16
00CC .dbline 125
00CC ; if(bitCount%8 != 0)
00CC 18E0 ldi R17,8
00CE 0A2D mov R16,R10
00D0 0E940000 xcall mod8u
00D4 0023 tst R16
00D6 09F0 breq L11
00D8 .dbline 126
00D8 ; byteCount++;
00D8 4395 inc R20
00DA L11:
00DA .dbline 128
00DA ;
00DA ; for(k=0;k<byteCount;k++)
00DA 6627 clr R22
00DC 37C0 xjmp L16
00DE L13:
00DE .dbline 129
00DE ; {//字节位置
00DE .dbline 130
00DE ; position = k + 3;
00DE 862F mov R24,R22
00E0 8D5F subi R24,253 ; addi 3
00E2 C82E mov R12,R24
00E4 .dbline 131
00E4 ; sendBuf[position] = 0;
00E4 80E0 ldi R24,<_sendBuf
00E6 90E0 ldi R25,>_sendBuf
00E8 EC2D mov R30,R12
00EA FF27 clr R31
00EC E80F add R30,R24
00EE F91F adc R31,R25
00F0 2224 clr R2
00F2 2082 std z+0,R2
00F4 .dbline 132
00F4 ; for(i=0;i<8;i++)
00F4 EE24 clr R14
00F6 22C0 xjmp L20
00F8 L17:
00F8 .dbline 133
00F8 ; {
00F8 .dbline 134
00F8 ; getCoilVal(tempAddr,&tempData);
00F8 9E01 movw R18,R28
00FA 0A81 ldd R16,y+2
00FC 1127 clr R17
00FE 1FD2 xcall _getCoilVal
0100 .dbline 136
0100 ;
0100 ; sendBuf[position] |= tempData << i;
0100 80E0 ldi R24,<_sendBuf
0102 90E0 ldi R25,>_sendBuf
0104 2C2C mov R2,R12
0106 3324 clr R3
0108 280E add R2,R24
010A 391E adc R3,R25
010C 2E2D mov R18,R14
010E 3327 clr R19
0110 0881 ldd R16,y+0
0112 1981 ldd R17,y+1
0114 0E940000 xcall lsl16
0118 F101 movw R30,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -