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

📄 modbusm16.lst

📁 一个16位单片机modbus通信例程
💻 LST
📖 第 1 页 / 共 4 页
字号:
    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 + -