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

📄 modbus.s

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldi R22,160
	.dbline 188
; 	for(i=0; i<iLength; i++)
	clr R20
	clr R21
	rjmp L47
L44:
	.dbline 189
; 	{
	.dbline 190
; 		CRC16Lo = CRC16Lo ^ data[i];
	movw R30,R20
	add R30,R4
	adc R31,R5
	ldd R2,z+0
	eor R6,R2
	.dbline 191
; 		for( Flag=0; Flag<=7; Flag++)
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
L48:
	.dbline 192
; 		{
	.dbline 193
; 			SaveHi = CRC16Hi;
	std y+2,R12
	.dbline 194
; 			SaveLo = CRC16Lo;
	mov R14,R6
	.dbline 195
; 			CRC16Hi = CRC16Hi>>1;
	lsr R12
	.dbline 196
; 			CRC16Lo = CRC16Lo>>1;
	lsr R6
	.dbline 198
; 
; 			if((SaveHi&0x01) == 0x01)
	ldd R24,y+2
	andi R24,1
	cpi R24,1
	brne L52
	.dbline 199
; 			   CRC16Lo = CRC16Lo|0x80;
	mov R24,R6
	ori R24,128
	mov R6,R24
L52:
	.dbline 201
; 
; 			if((SaveLo&0x01) == 0x01)
	mov R24,R14
	andi R24,1
	cpi R24,1
	brne L54
	.dbline 202
; 			{
	.dbline 203
; 				CRC16Hi = CRC16Hi ^ CH; //
	eor R12,R22
	.dbline 204
; 				CRC16Lo = CRC16Lo ^ CL; //
	eor R6,R10
	.dbline 205
; 			}
L54:
	.dbline 206
L49:
	.dbline 191
	ldd R24,y+0
	ldd R25,y+1
	adiw R24,1
	std y+1,R25
	std y+0,R24
	.dbline 191
	ldi R24,7
	ldi R25,0
	ldd R0,y+0
	ldd R1,y+1
	cp R24,R0
	cpc R25,R1
	brge L48
	.dbline 207
L45:
	.dbline 188
	subi R20,255  ; offset = 1
	sbci R21,255
L47:
	.dbline 188
	cp R20,R8
	cpc R21,R9
	brlt L44
	.dbline 208
; 		}
; 	}
; 	return(CRC16Hi<<8 | CRC16Lo);
	mov R17,R12
	mov R16,R6
	.dbline -2
L43:
	adiw R28,3
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbsym r CH 22 c
	.dbsym r CL 10 c
	.dbsym r SaveLo 14 c
	.dbsym l SaveHi 2 c
	.dbsym l Flag 0 I
	.dbsym r CRC16Hi 12 c
	.dbsym r CRC16Lo 6 c
	.dbsym r iLength 8 I
	.dbsym r data 4 pc
	.dbend
	.dbfunc e readRegisters _readRegisters fV
;          finsh -> <dead>
;         result -> <dead>
;      readCount -> R20
;           addr -> R20,R21
;        crcData -> R20,R21
;      byteCount -> R10
;       tempAddr -> R12,R13
;       tempData -> y+0
;              i -> R22,R23
	.even
_readRegisters::
	rcall push_gset4
	sbiw R28,2
	.dbline -1
	.dbline 214
; }//MyWord CRC16(MyByte *data,int iLength).
; 
; 
; //读寄存器
; void readRegisters(void)
; {
	.dbline 223
; 	uint addr;
; 	uint  tempAddr;
; 	uint  result;
; 	uint  crcData;
; 	uchar readCount;
; 	uchar byteCount;
; 	uchar finsh;	//1完成  0出错
; 	uint  i;
;   	uint  tempData = 0;	
	clr R2
	clr R3
	std y+1,R3
	std y+0,R2
	.dbline 226
; 	
;     //起始地址 40001 (0x9c41)   
; 	addr = (receBuf[2]<<8) + receBuf[3];
	lds R2,_receBuf+3
	lds R3,_receBuf+2
	mov R21,R3
	mov R20,R2
	.dbline 230
; 	
; 	//tempAddr = addr & 0xfff;
; 	//addr = receBuf[3];
; 	tempAddr = addr;
	movw R12,R20
	.dbline 232
; 	
;     readCount = (receBuf[4]<<8) + receBuf[5];	//要读的个数
	lds R2,_receBuf+5
	lds R3,_receBuf+4
	mov R21,R3
	mov R20,R2
	.dbline 235
; 	//readCount = receBuf[5];
; 	
; 	byteCount = readCount * 2;
	ldi R24,2
	mul R24,R20
	mov R10,R0
	.dbline 237
; 	
; 	for(i=0;i<byteCount;i+=2,tempAddr++)
	clr R22
	clr R23
	rjmp L64
L61:
	.dbline 238
	.dbline 239
	movw R18,R28
	movw R16,R12
	rcall _getRegisterVal
	.dbline 240
	ldi R24,<_sendBuf
	ldi R25,>_sendBuf
	movw R30,R22
	adiw R30,3
	add R30,R24
	adc R31,R25
	ldd R2,y+0
	ldd R3,y+1
	mov R2,R3
	clr R3
	std z+0,R2
	.dbline 241
	movw R30,R22
	adiw R30,4
	add R30,R24
	adc R31,R25
	ldd R24,y+0
	ldd R25,y+1
	andi R25,0
	std z+0,R24
	.dbline 242
L62:
	.dbline 237
	subi R22,254  ; offset = 2
	sbci R23,255
	movw R24,R12
	adiw R24,1
	movw R12,R24
L64:
	.dbline 237
	mov R2,R10
	clr R3
	cp R22,R2
	cpc R23,R3
	brlo L61
	.dbline 244
; 	{
; 		getRegisterVal(tempAddr,&tempData);
; 		sendBuf[i+3] = tempData >> 8;
; 		sendBuf[i+4] = tempData & 0xff;
; 	}
; 	
; 	sendBuf[0] = 0xff;
	ldi R24,255
	sts _sendBuf,R24
	.dbline 245
; 	sendBuf[1] = 3;
	ldi R24,3
	sts _sendBuf+1,R24
	.dbline 246
; 	sendBuf[2] = byteCount;
	sts _sendBuf+2,R10
	.dbline 247
; 	byteCount += 3;
	mov R24,R2
	subi R24,253    ; addi 3
	mov R10,R24
	.dbline 248
; 	crcData = CRC16(sendBuf,byteCount);
	mov R18,R24
	clr R19
	ldi R16,<_sendBuf
	ldi R17,>_sendBuf
	rcall _CRC16
	movw R20,R16
	.dbline 249
; 	sendBuf[byteCount] = crcData >> 8;
	ldi R24,<_sendBuf
	ldi R25,>_sendBuf
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	movw R2,R20
	mov R2,R3
	clr R3
	std z+0,R2
	.dbline 250
; 	byteCount++;
	inc R10
	.dbline 251
; 	sendBuf[byteCount] = crcData & 0xff;
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	movw R24,R20
	andi R25,0
	std z+0,R24
	.dbline 253
; //----------
;   	sendCount = byteCount + 1;
	mov R24,R10
	subi R24,255    ; addi 1
	sts _sendCount,R24
	.dbline 256
; //	sendCount = 7;
; //----------
; 	beginSend();
	rcall _beginSend
	.dbline -2
L56:
	adiw R28,2
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l finsh 1 c
	.dbsym l result 1 i
	.dbsym r readCount 20 c
	.dbsym r addr 20 i
	.dbsym r crcData 20 i
	.dbsym r byteCount 10 c
	.dbsym r tempAddr 12 i
	.dbsym l tempData 0 i
	.dbsym r i 22 i
	.dbend
	.dbfunc e getRegisterVal _getRegisterVal fi
	.area func_lit(rom, con, rel)
L87:
	.word `L69
	.word `L71
	.word `L72
	.word `L73
	.word `L74
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.word `L69
	.area text(rom, con, rel)
	.dbfile D:\ICCTES~1\1128\modbus.c
;       tempAddr -> <dead>
;         result -> R20,R21
;     p_tempData -> R22,R23
;           addr -> R10,R11
	.even
_getRegisterVal::
	rcall push_gset3
	movw R22,R18
	movw R10,R16
	.dbline -1
	.dbline 262
; }//void readRegisters(void)
; 
; 
; //取寄存器值 返回0表示成功
; uint getRegisterVal(uint addr,uint *p_tempData)
; {
	.dbline 263
; 	uint  result = 0;
	clr R20
	clr R21
	.dbline 267
; 	uint  tempAddr;
; 
; //	tempAddr = addr & 0xfff;
; 	addr = addr - 40000;	
	movw R24,R10
	subi R24,64
	sbci R25,156
	movw R10,R24
	.dbline 268
; 	switch(addr)                 //(tempAddr)          // & 0xff)
	ldi R24,16
	ldi R25,0
	cp R24,R10
	cpc R25,R11
	brge X12
	rjmp L69
X12:
	ldi R16,2
	ldi R17,0
	movw R18,R10
	rcall empy16s
	movw R30,R16
	ldi R24,<L87
	ldi R25,>L87
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	ijmp
X11:
	.dbline 269
; 	{
	.dbline 271
; 		case 0:
; 				break;
L71:
	.dbline 273
; 		case 1:
; 			 	*p_tempData = testVarAnalog;	// 模拟量当前值.	
	lds R2,_testVarAnalog
	lds R3,_testVarAnalog+1
	movw R30,R22
	std z+1,R3
	std z+0,R2
	.dbline 274
; 				break;
	rjmp L69
L72:
	.dbline 276
; 		case 2:		
; 		    	*p_tempData = testVarPoint;   // 小数点位置.
	lds R2,_testVarPoint
	lds R3,_testVarPoint+1
	movw R30,R22
	std z+1,R3
	std z+0,R2
	.dbline 277
; 				break;		
	rjmp L69
L73:
	.dbline 279
; 		case 3:
; 			 	*p_tempData = testVarInputUp; //  上限.
	lds R2,_testVarInputUp
	lds R3,_testVarInputUp+1
	movw R30,R22
	std z+1,R3
	std z+0,R2
	.dbline 280
; 				break;		
	rjmp L69
L74:
	.dbline 282
; 		case 4:
; 	        	*p_tempData = testVarInputDown;// 下限. 
	lds R2,_testVarInputDown
	lds R3,_testVarInputDown+1
	movw R30,R22
	std z+1,R3
	std z+0,R2
	.dbline 283
; 				break;		
	.dbline 285
; 		case 5:
; 				break;
	.dbline 287
; 		case 6:
; 				break;			
	.dbline 289
; 		case 7:
; 				break;		
	.dbline 291
; 		case 8:
; 				break;		
	.dbline 293
; 		case 9:
; 				break;  
	.dbline 295
; 		case 10:
; 				break;
	.dbline 297
; 		case 11:
; 				break;
	.dbline 299
; 		case 12:
; 				break;
	.dbline 301
; 		case 13:
; 				break;
	.dbline 303
; 		case 14:
; 				break;
	.dbline 305
; 		case 15:
; 				break;
	.dbline 308
; 		case 16:
; 				//*tempData = testRegister;
; 				break;
	.dbline 310
; 		default:
; 				break;
L69:
	.dbline 312
; 	}
; 	return result;
	movw R16,R20
	.dbline -2
L67:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l tempAddr 1 i
	.dbsym r result 20 i
	.dbsym r p_tempData 22 pi
	.dbsym r addr 10 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\ICCTES~1\1128\modbus.c
_GetKeyValue::
	.blkb 1
	.dbsym e GetKeyValue _GetKeyValue c
_crc_result::
	.blkb 2
	.dbsym e crc_result _crc_result i
_testVarInputDown::
	.blkb 2
	.dbsym e testVarInputDown _testVarInputDown i
_testVarInputUp::
	.blkb 2
	.dbsym e testVarInputUp _testVarInputUp i
_testVarPoint::
	.blkb 2
	.dbsym e testVarPoint _testVarPoint i
_testVarAnalog::
	.blkb 2
	.dbsym e testVarAnalog _testVarAnalog i
_receBuf::
	.blkb 16
	.dbsym e receBuf _receBuf A[16:16]c
_sendBuf::
	.blkb 16
	.dbsym e sendBuf _sendBuf A[16:16]c
_receTimeOut::
	.blkb 1
	.dbsym e receTimeOut _receTimeOut c
_checkoutError::
	.blkb 1
	.dbsym e checkoutError _checkoutError c
_GetCntTemp::
	.blkb 1
	.dbsym e GetCntTemp _GetCntTemp c
_receCount::
	.blkb 1
	.dbsym e receCount _receCount c
_sendCount::
	.blkb 1
	.dbsym e sendCount _sendCount c
_sendPosi::
	.blkb 1
	.dbsym e sendPosi _sendPosi c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -