📄 modbus.lis
字号:
0148 25E0 ldi R18,5
014A 30E0 ldi R19,0
014C 00E0 ldi R16,<_receBuf
014E 10E0 ldi R17,>_receBuf
0150 15D0 rcall _RecFrameCheck
0152 0030 cpi R16,0
0154 0107 cpc R16,R17
0156 51F0 breq L36
0158 X4:
0158 .dbline 136
0158 ; {//校验正确
0158 .dbline 138
0158 ; // PORTC ^= 0x02;
0158 ; GetKeyValue = receBuf[2];
0158 20900D00 lds R2,_receBuf+2
015C 20920000 sts _GetKeyValue,R2
0160 .dbline 139
0160 ; LedShowLink = GetKeyValue;
0160 3324 clr R3
0162 30920100 sts _LedShowLink+1,R3
0166 20920000 sts _LedShowLink,R2
016A .dbline 140
016A ; singleKeyTranmit();
016A 78DF rcall _singleKeyTranmit
016C .dbline 141
016C ; }
016C L36:
016C .dbline 142
016C ; } //if(receBuf[0]==LocalAddr && checkoutError==0)
016C L34:
016C .dbline 143
016C ; receCount = 0;
016C 2224 clr R2
016E 20922E00 sts _receCount,R2
0172 .dbline 144
0172 ; checkoutError = 0;
0172 20922C00 sts _checkoutError,R2
0176 .dbline 145
0176 ; }
0176 .dbline 146
0176 ; break;
0176 .dbline 149
0176 ;
0176 ; default:
0176 ; break; // 错误功能码处理.
0176 L18:
0176 .dbline 151
0176 ; } //switch(receBuf[1])
0176 ; } // if(receCount>4)
0176 L15:
0176 .dbline 152
0176 ; NOP();
0176 0000 nop
0178 .dbline -2
0178 L14:
0178 00D0 rcall pop_gset1
017A .dbline 0 ; func end
017A 0895 ret
017C .dbend
017C .dbfunc e RecFrameCheck _RecFrameCheck fc
017C ; CRCWord -> R20,R21
017C ; GetCntTempBuf -> R10
017C ; p_CheckData -> R22,R23
.even
017C _RecFrameCheck::
017C 00D0 rcall push_gset3
017E A22E mov R10,R18
0180 B801 movw R22,R16
0182 .dbline -1
0182 .dbline 157
0182 ; } //void ReceiveFrameDisFun(void)
0182 ;
0182 ;
0182 ; uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
0182 ; {
0182 .dbline 159
0182 ; uint CRCWord;
0182 ; CRCWord = *(p_CheckData+(GetCntTempBuf-1)) +
0182 EA2D mov R30,R10
0184 FF27 clr R31
0186 3297 sbiw R30,2
0188 E60F add R30,R22
018A F71F adc R31,R23
018C 2080 ldd R2,z+0
018E 3324 clr R3
0190 322C mov R3,R2
0192 2224 clr R2
0194 EA2D mov R30,R10
0196 FF27 clr R31
0198 3197 sbiw R30,1
019A E60F add R30,R22
019C F71F adc R31,R23
019E 4081 ldd R20,z+0
01A0 5527 clr R21
01A2 420D add R20,R2
01A4 531D adc R21,R3
01A6 .dbline 163
01A6 ; (*(p_CheckData+(GetCntTempBuf-2))<<8);
01A6 ; // CRCWord = *(p_CheckData+(GetCntTempBuf-2)) +
01A6 ; // (*(p_CheckData+(GetCntTempBuf-1))<<8);
01A6 ; if(CRCWord == CRC16(p_CheckData,GetCntTempBuf-2))
01A6 2A2D mov R18,R10
01A8 3327 clr R19
01AA 2250 subi R18,2
01AC 3040 sbci R19,0
01AE 8B01 movw R16,R22
01B0 08D0 rcall _CRC16
01B2 4017 cp R20,R16
01B4 5107 cpc R21,R17
01B6 11F4 brne L41
01B8 .dbline 164
01B8 ; {
01B8 .dbline 165
01B8 ; return TRUE;
01B8 01E0 ldi R16,1
01BA 01C0 rjmp L40
01BC L41:
01BC .dbline 168
01BC ; }
01BC ; else
01BC ; {
01BC .dbline 169
01BC ; return FLASE;
01BC 0027 clr R16
01BE .dbline -2
01BE L40:
01BE 00D0 rcall pop_gset3
01C0 .dbline 0 ; func end
01C0 0895 ret
01C2 .dbsym r CRCWord 20 i
01C2 .dbsym r GetCntTempBuf 10 c
01C2 .dbsym r p_CheckData 22 pc
01C2 .dbend
01C2 .dbfunc e CRC16 _CRC16 fI
01C2 ; i -> R20,R21
01C2 ; CH -> R22
01C2 ; CL -> R10
01C2 ; SaveLo -> R14
01C2 ; SaveHi -> y+2
01C2 ; Flag -> y+0
01C2 ; CRC16Hi -> R12
01C2 ; CRC16Lo -> R6
01C2 ; iLength -> R8,R9
01C2 ; data -> R4,R5
.even
01C2 _CRC16::
01C2 00D0 rcall push_gset5
01C4 4901 movw R8,R18
01C6 2801 movw R4,R16
01C8 2397 sbiw R28,3
01CA .dbline -1
01CA .dbline 178
01CA ; }
01CA ; }//uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
01CA ;
01CA ;
01CA ;
01CA ;
01CA ; //
01CA ; MyWord CRC16(MyByte *data,int iLength)
01CA ; {
01CA .dbline 184
01CA ; MyByte CRC16Lo,CRC16Hi;
01CA ; MyByte CL,CH;
01CA ; MyByte SaveHi,SaveLo;
01CA ; int i,Flag;
01CA ;
01CA ; CRC16Lo = 0xff;
01CA 8FEF ldi R24,255
01CC 682E mov R6,R24
01CE .dbline 185
01CE ; CRC16Hi = 0xff;
01CE C82E mov R12,R24
01D0 .dbline 186
01D0 ; CL = 0x01;
01D0 AA24 clr R10
01D2 A394 inc R10
01D4 .dbline 187
01D4 ; CH = 0xa0;
01D4 60EA ldi R22,160
01D6 .dbline 188
01D6 ; for(i=0; i<iLength; i++)
01D6 4427 clr R20
01D8 5527 clr R21
01DA 28C0 rjmp L47
01DC L44:
01DC .dbline 189
01DC ; {
01DC .dbline 190
01DC ; CRC16Lo = CRC16Lo ^ data[i];
01DC FA01 movw R30,R20
01DE E40D add R30,R4
01E0 F51D adc R31,R5
01E2 2080 ldd R2,z+0
01E4 6224 eor R6,R2
01E6 .dbline 191
01E6 ; for( Flag=0; Flag<=7; Flag++)
01E6 0024 clr R0
01E8 1124 clr R1
01EA 1982 std y+1,R1
01EC 0882 std y+0,R0
01EE L48:
01EE .dbline 192
01EE ; {
01EE .dbline 193
01EE ; SaveHi = CRC16Hi;
01EE CA82 std y+2,R12
01F0 .dbline 194
01F0 ; SaveLo = CRC16Lo;
01F0 E62C mov R14,R6
01F2 .dbline 195
01F2 ; CRC16Hi = CRC16Hi>>1;
01F2 C694 lsr R12
01F4 .dbline 196
01F4 ; CRC16Lo = CRC16Lo>>1;
01F4 6694 lsr R6
01F6 .dbline 198
01F6 ;
01F6 ; if((SaveHi&0x01) == 0x01)
01F6 8A81 ldd R24,y+2
01F8 8170 andi R24,1
01FA 8130 cpi R24,1
01FC 19F4 brne L52
01FE .dbline 199
01FE ; CRC16Lo = CRC16Lo|0x80;
01FE 862D mov R24,R6
0200 8068 ori R24,128
0202 682E mov R6,R24
0204 L52:
0204 .dbline 201
0204 ;
0204 ; if((SaveLo&0x01) == 0x01)
0204 8E2D mov R24,R14
0206 8170 andi R24,1
0208 8130 cpi R24,1
020A 11F4 brne L54
020C .dbline 202
020C ; {
020C .dbline 203
020C ; CRC16Hi = CRC16Hi ^ CH; //
020C C626 eor R12,R22
020E .dbline 204
020E ; CRC16Lo = CRC16Lo ^ CL; //
020E 6A24 eor R6,R10
0210 .dbline 205
0210 ; }
0210 L54:
0210 .dbline 206
0210 L49:
0210 .dbline 191
0210 8881 ldd R24,y+0
0212 9981 ldd R25,y+1
0214 0196 adiw R24,1
0216 9983 std y+1,R25
0218 8883 std y+0,R24
021A .dbline 191
021A 87E0 ldi R24,7
021C 90E0 ldi R25,0
021E 0880 ldd R0,y+0
0220 1980 ldd R1,y+1
0222 8015 cp R24,R0
0224 9105 cpc R25,R1
0226 1CF7 brge L48
0228 .dbline 207
0228 L45:
0228 .dbline 188
0228 4F5F subi R20,255 ; offset = 1
022A 5F4F sbci R21,255
022C L47:
022C .dbline 188
022C 4815 cp R20,R8
022E 5905 cpc R21,R9
0230 ACF2 brlt L44
0232 .dbline 208
0232 ; }
0232 ; }
0232 ; return(CRC16Hi<<8 | CRC16Lo);
0232 1C2D mov R17,R12
0234 062D mov R16,R6
0236 .dbline -2
0236 L43:
0236 2396 adiw R28,3
0238 00D0 rcall pop_gset5
023A .dbline 0 ; func end
023A 0895 ret
023C .dbsym r i 20 I
023C .dbsym r CH 22 c
023C .dbsym r CL 10 c
023C .dbsym r SaveLo 14 c
023C .dbsym l SaveHi 2 c
023C .dbsym l Flag 0 I
023C .dbsym r CRC16Hi 12 c
023C .dbsym r CRC16Lo 6 c
023C .dbsym r iLength 8 I
023C .dbsym r data 4 pc
023C .dbend
023C .dbfunc e readRegisters _readRegisters fV
023C ; finsh -> <dead>
023C ; result -> <dead>
023C ; readCount -> R20
023C ; addr -> R20,R21
023C ; crcData -> R20,R21
023C ; byteCount -> R10
023C ; tempAddr -> R12,R13
023C ; tempData -> y+0
023C ; i -> R22,R23
.even
023C _readRegisters::
023C 00D0 rcall push_gset4
023E 2297 sbiw R28,2
0240 .dbline -1
0240 .dbline 214
0240 ; }//MyWord CRC16(MyByte *data,int iLength).
0240 ;
0240 ;
0240 ; //读寄存器
0240 ; void readRegisters(void)
0240 ; {
0240 .dbline 223
0240 ; uint addr;
0240 ; uint tempAddr;
0240 ; uint result;
0240 ; uint crcData;
0240 ; uchar readCount;
0240 ; uchar byteCount;
0240 ; uchar finsh; //1完成 0出错
0240 ; uint i;
0240 ; uint tempData = 0;
0240 2224 clr R2
0242 3324 clr R3
0244 3982 std y+1,R3
0246 2882 std y+0,R2
0248 .dbline 226
0248 ;
0248 ; //起始地址 40001 (0x9c41)
0248 ; addr = (receBuf[2]<<8) + receBuf[3];
0248 20900E00 lds R2,_receBuf+3
024C 30900D00 lds R3,_receBuf+2
0250 532D mov R21,R3
0252 422D mov R20,R2
0254 .dbline 230
0254 ;
0254 ; //tempAddr = addr & 0xfff;
0254 ; //addr = receBuf[3];
0254 ; tempAddr = addr;
0254 6A01 movw R12,R20
0256 .dbline 232
0256 ;
0256 ; readCount = (receBuf[4]<<8) + receBuf[5]; //要读的个数
0256 20901000 lds R2,_receBuf+5
025A 30900F00 lds R3,_receBuf+4
025E 532D mov R21,R3
0260 422D mov R20,R2
0262 .dbline 235
0262 ; //readCount = receBuf[5];
0262 ;
0262 ; byteCount = readCount * 2;
0262 82E0 ldi R24,2
0264 849F mul R24,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -