📄 modbusm16.lst
字号:
03D6 E083 LDI R24,3
03D7 93800092 STS _sendBuf+1,R24
(0193) sendBuf[2] = byteCount;
03D9 92A00093 STS _sendBuf+2,R10
(0194) byteCount += 3;
03DB 2D8A MOV R24,R10
03DC 5F8D SUBI R24,0xFD
03DD 2EA8 MOV R10,R24
(0195) crcData = crc16(sendBuf,byteCount);
03DE 2F28 MOV R18,R24
03DF 2733 CLR R19
03E0 E901 LDI R16,0x91
03E1 E010 LDI R17,0
03E2 DEEA RCALL _crc16
03E3 01A8 MOVW R20,R16
(0196) sendBuf[byteCount] = crcData >> 8;
03E4 E981 LDI R24,0x91
03E5 E090 LDI R25,0
03E6 2DEA MOV R30,R10
03E7 27FF CLR R31
03E8 0FE8 ADD R30,R24
03E9 1FF9 ADC R31,R25
03EA 011A MOVW R2,R20
03EB 2C23 MOV R2,R3
03EC 2433 CLR R3
03ED 8220 STD R2,0+Z
(0197) byteCount++;
03EE 94A3 INC R10
(0198) sendBuf[byteCount] = crcData & 0xff;
03EF 2DEA MOV R30,R10
03F0 27FF CLR R31
03F1 0FE8 ADD R30,R24
03F2 1FF9 ADC R31,R25
03F3 01CA MOVW R24,R20
03F4 7090 ANDI R25,0
03F5 8380 STD R24,0+Z
(0199)
(0200) sendCount = byteCount + 1;
03F6 2D8A MOV R24,R10
03F7 5F8F SUBI R24,0xFF
03F8 938000B3 STS _sendCount,R24
(0201) beginSend();
03FA DF16 RCALL _beginSend
(0202) }//void readRegisters(void)
03FB 9622 ADIW R28,2
03FC 940E062D CALL pop_gset4
03FE 9508 RET
_forceSingleCoil:
tempData --> R22
tempAddr --> R20
addr --> R22
onOff --> R10
i --> R20
03FF 940E064E CALL push_gset3
(0203)
(0204)
(0205) //强制单个线圈
(0206) void forceSingleCoil(void)
(0207) {
(0208) uint8 addr;
(0209) uint8 tempAddr;
(0210) uint16 tempData;
(0211) uint8 onOff;
(0212) uint8 i;
(0213)
(0214) //addr = (receBuf[2]<<8) + receBuf[3];
(0215) //tempAddr = addr & 0xfff;
(0216) addr = receBuf[3];
0401 91600074 LDS R22,_receBuf+3
(0217) tempAddr = addr;
0403 2F46 MOV R20,R22
(0218)
(0219) //onOff = (receBuf[4]<<8) + receBuf[5];
(0220) onOff = receBuf[4];
0404 90A00075 LDS R10,0x75
(0221)
(0222) //if(onOff == 0xff00)
(0223) if(onOff == 0xff)
0406 2D8A MOV R24,R10
0407 3F8F CPI R24,0xFF
0408 F419 BNE 0x040C
(0224) { //设为ON
(0225) tempData = 1;
0409 E061 LDI R22,1
040A E070 LDI R23,0
(0226) }
040B C004 RJMP 0x0410
(0227) //else if(onOff == 0x0000)
(0228) else if(onOff == 0x00)
040C 20AA TST R10
040D F411 BNE 0x0410
(0229) { //设为OFF
(0230) tempData = 0;
040E 2766 CLR R22
040F 2777 CLR R23
(0231) }
(0232)
(0233) setCoilVal(tempAddr,tempData);
0410 019B MOVW R18,R22
0411 2F04 MOV R16,R20
0412 2711 CLR R17
0413 D17F RCALL _setCoilVal
(0234)
(0235) for(i=0;i<receCount;i++)
0414 2744 CLR R20
0415 C00F RJMP 0x0425
(0236) {
(0237) sendBuf[i] = receBuf[i];
0416 E781 LDI R24,0x71
0417 E090 LDI R25,0
0418 2FE4 MOV R30,R20
0419 27FF CLR R31
041A 0FE8 ADD R30,R24
041B 1FF9 ADC R31,R25
041C 8020 LDD R2,0+Z
041D E981 LDI R24,0x91
041E E090 LDI R25,0
041F 2FE4 MOV R30,R20
0420 27FF CLR R31
0421 0FE8 ADD R30,R24
0422 1FF9 ADC R31,R25
0423 8220 STD R2,0+Z
0424 9543 INC R20
0425 902000B2 LDS R2,_receCount
0427 1542 CP R20,R2
0428 F368 BCS 0x0416
(0238) }
(0239) sendCount = receCount;
0429 922000B3 STS _sendCount,R2
(0240) beginSend();
042B DEE5 RCALL _beginSend
(0241) }//void forceSingleCoil(void)
042C 940E062A CALL pop_gset3
042E 9508 RET
_presetMultipleRegisters:
finsh --> Y+1
byteCount --> R22
crcData --> R22
addr --> Y+0
setCount --> R20
tempData --> R14
tempAddr --> R10
i --> R12
042F 940E0656 CALL push_gset5
0431 9721 SBIW R28,1
(0242)
(0243)
(0244) //设置多个寄存器
(0245) void presetMultipleRegisters(void)
(0246) {
(0247) uint8 addr;
(0248) uint8 tempAddr;
(0249) uint8 byteCount;
(0250) uint8 setCount;
(0251) uint16 crcData;
(0252) uint16 tempData;
(0253) uint8 finsh; //为1时完成 为0时出错
(0254) uint8 i;
(0255)
(0256) //addr = (receBuf[2]<<8) + receBuf[3];
(0257) //tempAddr = addr & 0xfff;
(0258) addr = receBuf[3];
0432 90200074 LDS R2,_receBuf+3
0434 8228 STD R2,0+Y
(0259) tempAddr = addr;
0435 2CA2 MOV R10,R2
(0260)
(0261) //setCount = (receBuf[4]<<8) + receBuf[5];
(0262) setCount = receBuf[5];
0436 91400076 LDS R20,0x76
(0263) byteCount = receBuf[6];
0438 91600077 LDS R22,0x77
(0264)
(0265) for(i=0;i<setCount;i++,tempAddr++)
043A 24CC CLR R12
043B C016 RJMP 0x0452
(0266) {
(0267) tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];
043C E082 LDI R24,2
043D 9D8C MUL R24,R12
043E E789 LDI R24,0x79
043F E090 LDI R25,0
0440 01F0 MOVW R30,R0
0441 0FE8 ADD R30,R24
0442 1FF9 ADC R31,R25
0443 8020 LDD R2,0+Z
0444 E788 LDI R24,0x78
0445 E090 LDI R25,0
0446 01F0 MOVW R30,R0
0447 0FE8 ADD R30,R24
0448 1FF9 ADC R31,R25
0449 8030 LDD R3,0+Z
044A 2CE2 MOV R14,R2
044B 2CF3 MOV R15,R3
(0268)
(0269) setRegisterVal(tempAddr,tempData);
044C 0197 MOVW R18,R14
044D 2D0A MOV R16,R10
044E 2711 CLR R17
044F D18E RCALL _setRegisterVal
0450 94C3 INC R12
0451 94A3 INC R10
0452 16C4 CP R12,R20
0453 F340 BCS 0x043C
(0270) }
(0271)
(0272) sendBuf[0] = localAddr;
0454 90200060 LDS R2,0x60
0456 92200091 STS _sendBuf,R2
(0273) sendBuf[1] = 16;
0458 E180 LDI R24,0x10
0459 93800092 STS _sendBuf+1,R24
(0274) sendBuf[2] = addr >> 8;
045B 8028 LDD R2,0+Y
045C 2433 CLR R3
045D 2C23 MOV R2,R3
045E 2433 CLR R3
045F FC27 SBRC R2,7
0460 9430 COM R3
0461 92200093 STS _sendBuf+2,R2
(0275) sendBuf[3] = addr & 0xff;
0463 8188 LDD R24,0+Y
0464 7F8F ANDI R24,0xFF
0465 93800094 STS _sendBuf+3,R24
(0276) sendBuf[4] = setCount >> 8;
0467 2E24 MOV R2,R20
0468 2433 CLR R3
0469 2C23 MOV R2,R3
046A 2433 CLR R3
046B FC27 SBRC R2,7
046C 9430 COM R3
046D 92200095 STS 0x95,R2
(0277) sendBuf[5] = setCount & 0xff;
046F 2F84 MOV R24,R20
0470 7F8F ANDI R24,0xFF
0471 93800096 STS 0x96,R24
(0278) crcData = crc16(sendBuf,6);
0473 E026 LDI R18,6
0474 E030 LDI R19,0
0475 E901 LDI R16,0x91
0476 E010 LDI R17,0
0477 DE55 RCALL _crc16
0478 01B8 MOVW R22,R16
(0279) sendBuf[6] = crcData >> 8;
0479 011B MOVW R2,R22
047A 2C23 MOV R2,R3
047B 2433 CLR R3
047C 92200097 STS 0x97,R2
(0280) sendBuf[7] = crcData & 0xff;
047E 01CB MOVW R24,R22
047F 7090 ANDI R25,0
0480 93800098 STS 0x98,R24
(0281) sendCount = 8;
0482 E088 LDI R24,0x8
0483 938000B3 STS _sendCount,R24
(0282) beginSend();
0485 DE8B RCALL _beginSend
(0283) }//void presetMultipleRegisters(void)
0486 9621 ADIW R28,1
0487 940E0630 CALL pop_gset5
0489 9508 RET
_checkComm0Modbus:
crcData --> R20
tempData --> R22
048A 940E064A CALL push_gset2
(0284)
(0285)
(0286)
(0287) //检查uart0数据
(0288) void checkComm0Modbus(void)
(0289) {
(0290) uint16 crcData;
(0291) uint16 tempData;
(0292)
(0293) if(receCount > 4)
048C E084 LDI R24,4
048D 902000B2 LDS R2,_receCount
048F 1582 CP R24,R2
0490 F008 BCS 0x0492
0491 C0D7 RJMP 0x0569
(0294) {
(0295) switch(receBuf[1])
0492 91400072 LDS R20,_receBuf+1
0494 2755 CLR R21
0495 3041 CPI R20,1
0496 E0E0 LDI R30,0
0497 075E CPC R21,R30
0498 F0E1 BEQ 0x04B5
0499 3043 CPI R20,3
049A E0E0 LDI R30,0
049B 075E CPC R21,R30
049C F0C1 BEQ 0x04B5
049D 3045 CPI R20,5
049E E0E0 LDI R30,0
049F 075E CPC R21,R30
04A0 F0A1 BEQ 0x04B5
04A1 3046 CPI R20,6
04A2 E0E0 LDI R30,0
04A3 075E CPC R21,R30
04A4 F081 BEQ 0x04B5
04A5 3041 CPI R20,1
04A6 E0E0 LDI R30,0
04A7 075E CPC R21,R30
04A8 F40C BGE 0x04AA
04A9 C0BF RJMP 0x0569
04AA 304F CPI R20,0xF
04AB E0E0 LDI R30,0
04AC 075E CPC R21,R30
04AD F409 BNE 0x04AF
04AE C046 RJMP 0x04F5
04AF 3140 CPI R20,0x10
04B0 E0E0 LDI R30,0
04B1 075E CPC R21,R30
04B2 F409 BNE 0x04B4
04B3 C077 RJMP 0x052B
04B4 C0B4 RJMP 0x0569
(0296) {
(0297) case 1://读取线圈状态(读取点 16位以内)
(0298) case 3://读取保持寄存器(一个或多个)
(0299) case 5://强制单个线圈
(0300) case 6://设置单个寄存器
(0301) if(receCount >= 8)
04B5 918000B2 LDS R24,_receCount
04B7 3088 CPI R24,0x8
04B8 F408 BCC 0x04BA
04B9 C0AF RJMP 0x0569
(0302) {//接收完成一组数据
(0303) //应该关闭接收中断
(0304) UCSRB &= ~BIT(7);
04BA 9857 CBI P0A,7
(0305) if(receBuf[0]==localAddr && checkoutError==0)
04BB 90200060 LDS R2,0x60
04BD 90300071 LDS R3,_receBuf
04BF 1432 CP R3,R2
04C0 F569 BNE 0x04EE
04C1 90200070 LDS R2,_checkoutError
04C3 2022 TST R2
04C4 F549 BNE 0x04EE
(0306) {
(0307) crcData = crc16(receBuf,6);
04C5 E026 LDI R18,6
04C6 E030 LDI R19,0
04C7 E701 LDI R16,0x71
04C8 E010 LDI R17,0
04C9 DE03 RCALL _crc16
04CA 01A8 MOVW R20,R16
(0308) if(crcData == receBuf[7]+(receBuf[6]<<8))
04CB 90200077 LDS R2,0x77
04CD 2433 CLR R3
04CE 2C32 MOV R3,R2
04CF 2422 CLR R2
04D0 90400078 LDS R4,0x78
04D2 2455 CLR R5
04D3 0C42 ADD R4,R2
04D4 1C53 ADC R5,R3
04D5 1504 CP R16,R4
04D6 0515 CPC R17,R5
04D7 F4B1 BNE 0x04EE
(0309) {//校验正确
(0310) if(receBuf[1] == 1)
04D8 91800072 LDS R24,_receBuf+1
04DA 3081 CPI R24,1
04DB F411 BNE 0x04DE
(0311) {//读取线圈状态(读取点 16位以内)
(0312) readCoil();
04DC DE45 RCALL _readCoil
(0313) }
04DD C010 RJMP 0x04EE
(0314) else if(receBuf[1] == 3)
04DE 91800072 LDS R24,_receBuf+1
04E0 3083 CPI R24,3
04E1 F411 BNE 0x04E4
(0315) {//读取保持寄存器(一个或多个)
(0316) readRegisters();
04E2 DEBE RCALL _readRegisters
(0317) }
04E3 C00A RJMP 0x04EE
(0318) else if(receBuf[1] == 5)
04E4 91800072 LDS R24,_receBuf+1
04E6 3085 CPI R24,5
04E7 F411 BNE 0x04EA
(0319) {//强制单个线圈
(0320) forceSingleCoil();
04E8 DF16 RCALL _forceSingleCoil
(0321) }
04E9 C004 RJMP 0x04EE
(0322) else if(receBuf[1] == 6)
04EA 91800072 LDS R24,_receBuf+1
04EC 3086 CPI R24,6
04ED F401 BNE 0x04EE
(0323) {
(0324) //presetSingleRegister();
(0325) }
(0326)
(0327) }
(0328) }
(0329) receCount = 0;
04EE 2422 CLR R2
04EF 922000B2 STS _receCount,R2
(0330) checkoutError = 0;
04F1 92200070 STS _checkoutError,R2
(0331) UCSRB |= BIT(7);
04F3 9A57 SBI P0A,7
(0332) }
(0333) break;
04F4 C074 RJMP 0x0569
(0334)
(0335) case 15://设置多个线圈
(0336) tempData = receBuf[6];
04F5 91600077 LDS R22,0x77
04F7 2777 CLR R23
(0337) tempData += 9; //数据个数
04F8 5F67 SUBI R22,0xF7
04F9 4F7F SBCI R23,0xFF
(0338) if(receCount >= tempData)
04FA 902000B2 LDS R2,_receCount
04FC 2433 CLR R3
04FD 1626 CP R2,R22
04FE 0637 CPC R3,R23
04FF F408 BCC 0x0501
0500 C068 RJMP 0x0569
(0339) {//应该关闭接收中断
(0340) UCSRB &= ~BIT(7);
0501 9857 CBI P0A,7
(0341) if(receBuf[0]==localAddr && checkoutError==0)
0502 90200060 LDS R2,0x60
0504 90300071 LDS R3,_receBuf
0506 1432 CP R3,R2
0507 F4E1 BNE 0x0524
0508 90200070 LDS R2,_checkoutError
050A 2022 TST R2
050B F4C1 BNE 0x0524
(0342) {
(0343) crcData = crc16(receBuf,tempData-2);
050C 019B MOVW R18,R22
050D 5022 SUBI R18,2
050E 4030 SBCI R19,0
050F E701 LDI R16,0x71
0510 E010 LDI R17,0
0511 DDBB RCALL _crc16
0512 01A8 MOVW R20,R16
(0344) if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
0513 E781 LDI R24,0x71
0514 E090 LDI R25,0
0515 01FB MOVW R30,R22
0516 9731 SBIW R30,1
0517 0FE8 ADD R30,R24
0518 1FF9 ADC R31,R25
0519 8020 LDD R2,0+Z
051A 01FB MOVW R30,R22
051B 9732 SBIW R30,2
051C 0FE8 ADD R30,R24
051D 1FF9 ADC R31,R25
051E 8030 LDD R3,0+Z
051F 2C42 MOV R4,R2
0520 2C53 MOV R5,R3
0521 1504 CP R16,R4
0522 0515 CPC R17,R5
0523 F401 BNE 0x0524
(0345) {
(0346) //forceMultipleCoils();
(0347) }
(0348) }
(0349) receCount = 0;
0524 2422 CLR R2
0525 922000B2 STS _receCount,R2
(0350) checkoutError = 0;
0527 92200070 STS _checkoutError,R2
(0351) UCSRB |= BIT(7);
0529 9A57 SBI P0A,7
(0352) }
(0353) break;
052A C03E RJMP 0x0569
(0354)
(0355) case 16://设置多个寄存器
(0356) tempData = (receBuf[4]<<8) + receBuf[5];
052B 90200076 LDS R2,0x76
052D 90300075 LDS R3,0x75
052F 2D62 MOV R22,R2
0530 2D73 MOV R23,R3
(0357) tempData = tempData * 2; //数据个数
0531 E002 LDI R16,2
0532 E010 LDI R17,0
0533 019B MOVW R18,R22
0534 940E0617 CALL empy16s
0536 01B8 MOVW R22,R16
(0358) tempData += 9;
0537 5F67 SUBI R22,0xF7
0538 4F7F SBCI R23,0xFF
(0359) if(receCount >= tempData)
0539 902000B2 LDS R2,_receCount
053B 2433 CLR R3
053C 1626 CP R2,R22
053D 0637 CPC R3,R23
053E F150 BCS 0x0569
(0360) {//应该关闭接收中断
(0361) UCSRB &= ~BIT(7);
053F 9857 CBI P0A,7
(0362) if(receBuf[0]==localAddr && checkoutError==0)
0540 90200060 LDS R2,0x60
0542 90300071 LDS R3,_receBuf
0544 1432 CP R3,R2
0545 F4E9 BNE 0x0563
0546 90200070 LDS R2,_checkoutError
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -