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

📄 uart.lst

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0024)  uint testVarPoint;
(0025)  uint testVarInputUp;
(0026)  uint testVarInputDown;
(0027) 				 
(0028) // UART0 initialize
(0029) // desired baud rate: 9600
(0030) // actual: baud rate:9615 (0.2%)
(0031) void uart0_init(void)
(0032) {
(0033)   UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
    0172 2422      CLR	R2
    0173 922000C1  STS	0xC1,R2
(0034)   UCSR0A = 0x02;		// 0x02;
    0175 E082      LDI	R24,2
    0176 938000C0  STS	0xC0,R24
(0035)   UCSR0C = 0x3E; //奇校验 2个停止位. 
    0178 E38E      LDI	R24,0x3E
    0179 938000C2  STS	0xC2,R24
(0036)   UBRR0L = 0x67; //set baud rate lo.
    017B E687      LDI	R24,0x67
    017C 938000C4  STS	0xC4,R24
(0037)   UBRR0H = 0x00; //set baud rate hi.
    017E 922000C5  STS	0xC5,R2
(0038) // UCSR0B = 0xB8; //bit3 send enable.
(0039)   UCSR0B = 0b10010000;             
    0180 E980      LDI	R24,0x90
    0181 938000C1  STS	0xC1,R24
    0183 9508      RET
(0040) // UCSR0B &= ~BIT(TXCIE0); //RXCIE0 清零.
(0041) // UCSR0B &= ~BIT(TXEN0);  //TXEN0 清零.
(0042) }//void uart0_init(void)
(0043) 
(0044) 
(0045) void beginSend(void)
(0046) {
(0047) //sendEnable();    //设为发送.
(0048) 	sendPosi = 0;
_beginSend:
    0184 2422      CLR	R2
    0185 92200131  STS	sendPosi,R2
(0049) 	if(sendCount > 1)
    0187 E081      LDI	R24,1
    0188 90200130  LDS	R2,sendCount
    018A 1582      CP	R24,R2
    018B F428      BCC	0x0191
(0050) 	    sendCount--;
    018C 91800130  LDS	R24,sendCount
    018E 5081      SUBI	R24,1
    018F 93800130  STS	sendCount,R24
(0051) //	TX9D = ParityBit(sendBuf[0]);
(0052) 	UDR0 = sendBuf[0];
    0191 9020011C  LDS	R2,sendBuf
    0193 922000C6  STS	0xC6,R2
(0053) 	//UCSR0B |= BIT(UDRIE0);       //  TXIE = 1;       //使能发送中断. 
(0054) 	UCSR0B |= BIT(TXCIE0);
    0195 918000C1  LDS	R24,0xC1
    0197 6480      ORI	R24,0x40
    0198 938000C1  STS	0xC1,R24
(0055) 	UCSR0B |= BIT(TXEN0);		   //  TXEN = 1;		//使能发送
    019A 918000C1  LDS	R24,0xC1
    019C 6088      ORI	R24,0x8
    019D 938000C1  STS	0xC1,R24
    019F 9508      RET
(0056) //	TXIE = 1;     
(0057) //	CREN = 1;
(0058) //	RCIE = 1;
(0059) //	CREN = 0;
(0060) //	RCIE = 0;
(0061) }//void beginSend(void)
(0062) 
(0063) /*
(0064) void singleKeyTranmit(void)
(0065) {
(0066) 	sendBuf[0] = 0x12;	 
(0067) 	sendBuf[1] = 0x34;	 
(0068) 	sendBuf[2] = 0x56; 
(0069) 	sendBuf[3] = 0x78; 
(0070) 	sendBuf[4] = 0x90; 
(0071) 	sendCount = 5;   //发送字节长 
(0072) 	beginSend(); 
(0073) } 
(0074) */
(0075) 
(0076) 
(0077) //单键值处理 
(0078) void singleKeyTranmit(void) 
(0079) { 
(0080) 	sendBuf[0] = 0xff;	
_singleKeyTranmit:
    01A0 EF8F      LDI	R24,0xFF
    01A1 9380011C  STS	sendBuf,R24
(0081) 	sendBuf[1] = 0xaa;	
    01A3 EA8A      LDI	R24,0xAA
    01A4 9380011D  STS	sendBuf+1,R24
(0082) 	sendBuf[2] = 0x55;	                //0x55 校验确认回复. 
    01A6 E585      LDI	R24,0x55
    01A7 9380011E  STS	sendBuf+2,R24
(0083)    	crc_result = CRC16(sendBuf,3);	
    01A9 E023      LDI	R18,3
    01AA E030      LDI	R19,0
    01AB E10C      LDI	R16,0x1C
    01AC E011      LDI	R17,1
    01AD D0A5      RCALL	_CRC16
    01AE 93100103  STS	crc_result+1,R17
    01B0 93000102  STS	crc_result,R16
(0084)     sendBuf[3] = (uchar)(crc_result&0x00ff);      // Lo byte. 
    01B2 01C8      MOVW	R24,R16
    01B3 7090      ANDI	R25,0
    01B4 9380011F  STS	sendBuf+3,R24
(0085) 	sendBuf[4] = (uchar)((crc_result&0xff00)>>8); // Hi byte. 
    01B6 01C8      MOVW	R24,R16
    01B7 7080      ANDI	R24,0
    01B8 2F89      MOV	R24,R25
    01B9 2799      CLR	R25
    01BA 93800120  STS	0x120,R24
(0086) //--------
(0087) 	sendCount = 5;   
    01BC E085      LDI	R24,5
    01BD 93800130  STS	sendCount,R24
(0088) //----------
(0089) 	beginSend();   
    01BF DFC4      RCALL	_beginSend
    01C0 9508      RET
_ReceiveFrameDisFun:
    01C1 D33E      RCALL	push_gset1
(0090) }  
(0091)  
(0092)  
(0093) // 从站接受信息帧处理 
(0094) void ReceiveFrameDisFun(void) 
(0095) {
(0096)  	if(receCount>4)
    01C2 E084      LDI	R24,4
    01C3 9020012F  LDS	R2,receCount
    01C5 1582      CP	R24,R2
    01C6 F008      BCS	0x01C8
    01C7 C065      RJMP	0x022D
(0097) 	{	 
(0098) 		 		switch(receBuf[1])     	    //byte 2: Command byte.
    01C8 9140010D  LDS	R20,receBuf+1
    01CA 2755      CLR	R21
    01CB 3040      CPI	R20,0
    01CC 0745      CPC	R20,R21
    01CD F409      BNE	0x01CF
    01CE C05E      RJMP	0x022D
    01CF 3041      CPI	R20,1
    01D0 E0E0      LDI	R30,0
    01D1 075E      CPC	R21,R30
    01D2 F409      BNE	0x01D4
    01D3 C059      RJMP	0x022D
    01D4 3043      CPI	R20,3
    01D5 E0E0      LDI	R30,0
    01D6 075E      CPC	R21,R30
    01D7 F079      BEQ	0x01E7
    01D8 3045      CPI	R20,5
    01D9 E0E0      LDI	R30,0
    01DA 075E      CPC	R21,R30
    01DB F409      BNE	0x01DD
    01DC C050      RJMP	0x022D
    01DD 3040      CPI	R20,0
    01DE E0E0      LDI	R30,0
    01DF 075E      CPC	R21,R30
    01E0 F40C      BGE	0x01E2
    01E1 C04B      RJMP	0x022D
    01E2 3A4A      CPI	R20,0xAA
    01E3 E0E0      LDI	R30,0
    01E4 075E      CPC	R21,R30
    01E5 F121      BEQ	0x020A
    01E6 C046      RJMP	0x022D
(0099) 				{	
(0100) 					case 0:	
(0101) 				 		  	break;
(0102) 					case 1:	
(0103) 							break;
(0104) 					case 3: //请求变量
(0105) 					 
(0106) 					    if(receCount >= 8)
    01E7 9180012F  LDS	R24,receCount
    01E9 3088      CPI	R24,0x8
    01EA F408      BCC	0x01EC
    01EB C041      RJMP	0x022D
(0107) 						{	
(0108) 						  //PORTC ^= 0x02;    
(0109) 						
(0110)      						if(receBuf[0]==LocalAddr && checkoutError==0) 
    01EC 9180010C  LDS	R24,receBuf
    01EE 3081      CPI	R24,1
    01EF F4A1      BNE	0x0204
    01F0 9020012D  LDS	R2,checkoutError
    01F2 2022      TST	R2
    01F3 F481      BNE	0x0204
(0111) 							{
(0112) 								if(RecFrameCheck(&receBuf[0],receCount))
    01F4 9120012F  LDS	R18,receCount
    01F6 2733      CLR	R19
    01F7 E00C      LDI	R16,0xC
    01F8 E011      LDI	R17,1
    01F9 D036      RCALL	_RecFrameCheck
    01FA 3000      CPI	R16,0
    01FB 0701      CPC	R16,R17
    01FC F039      BEQ	0x0204
(0113) 								{ //校验正确
(0114) 				                     readRegisters();
    01FD D092      RCALL	_readRegisters
(0115) 									 LedShowLink = 1717;
    01FE EB85      LDI	R24,0xB5
    01FF E096      LDI	R25,6
    0200 9390013D  STS	LedShowLink+1,R25
    0202 9380013C  STS	LedShowLink,R24
(0116) 								}  
(0117) 							}
(0118) 		    				receCount = 0;	
    0204 2422      CLR	R2
    0205 9220012F  STS	receCount,R2
(0119) 			    			checkoutError = 0;	
    0207 9220012D  STS	checkoutError,R2
(0120) 						}
(0121) 				 
(0122) 							break;
    0209 C023      RJMP	0x022D
(0123) 					
(0124) 					case 5:
(0125) 							break;
(0126) 					
(0127) 					case 0xaa:
(0128) 						// PORTC ^= 0x02;        
(0129) 						if(receCount >= 5)         
    020A 9180012F  LDS	R24,receCount
    020C 3085      CPI	R24,5
    020D F0F8      BCS	0x022D
(0130) 						{              
(0131) 						//   PORTC ^= 0x02;       
(0132) 							if(receBuf[0]==LocalAddr && checkoutError==0) 
    020E 9180010C  LDS	R24,receBuf
    0210 3081      CPI	R24,1
    0211 F4B1      BNE	0x0228
    0212 9020012D  LDS	R2,checkoutError
    0214 2022      TST	R2
    0215 F491      BNE	0x0228
(0133) 							{
(0134) 							 //  PORTC ^= 0x02;
(0135) 								if( RecFrameCheck(receBuf,5) )     
    0216 E025      LDI	R18,5
    0217 E030      LDI	R19,0
    0218 E00C      LDI	R16,0xC
    0219 E011      LDI	R17,1
    021A D015      RCALL	_RecFrameCheck
    021B 3000      CPI	R16,0
    021C 0701      CPC	R16,R17
    021D F051      BEQ	0x0228
(0136) 								{//校验正确							
(0137) 								//	PORTC ^= 0x02;												
(0138) 					 				GetKeyValue = receBuf[2]; 
    021E 9020010E  LDS	R2,receBuf+2
    0220 92200101  STS	GetKeyValue,R2
(0139) 					  	     		LedShowLink = GetKeyValue;	
    0222 2433      CLR	R3
    0223 9230013D  STS	LedShowLink+1,R3
    0225 9220013C  STS	LedShowLink,R2
(0140) 					   			singleKeyTranmit(); 
    0227 DF78      RCALL	_singleKeyTranmit
(0141) 						 		}	                        
(0142) 							} //if(receBuf[0]==LocalAddr && checkoutError==0) 
(0143) 						receCount = 0;	
    0228 2422      CLR	R2
    0229 9220012F  STS	receCount,R2
(0144) 						checkoutError = 0;	
    022B 9220012D  STS	checkoutError,R2
(0145) 					    } 
(0146) 							break;
(0147)                                  
(0148) 					default:
(0149) 					    	break;	 	// 错误功能码处理.
(0150) 				}	//switch(receBuf[1]) 
(0151) 	}	//	if(receCount>4)
(0152) 	NOP();	
    022D 0000      NOP
    022E D2D4      RCALL	pop_gset1
    022F 9508      RET
_RecFrameCheck:
  CRCWord              --> R20
  GetCntTempBuf        --> R10
  p_CheckData          --> R22
    0230 D2CB      RCALL	push_gset3
    0231 2EA2      MOV	R10,R18
    0232 01B8      MOVW	R22,R16
(0153) }  //void ReceiveFrameDisFun(void)
(0154) 
(0155) 
(0156) uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
(0157) {	
(0158) 	uint CRCWord;	
(0159) 	CRCWord = *(p_CheckData+(GetCntTempBuf-1)) + 
    0233 2DEA      MOV	R30,R10
    0234 27FF      CLR	R31
    0235 9732      SBIW	R30,2
    0236 0FE6      ADD	R30,R22
    0237 1FF7      ADC	R31,R23
    0238 8020      LDD	R2,Z+0
    0239 2433      CLR	R3
    023A 2C32      MOV	R3,R2
    023B 2422      CLR	R2
    023C 2DEA      MOV	R30,R10
    023D 27FF      CLR	R31
    023E 9731      SBIW	R30,1
    023F 0FE6      ADD	R30,R22
    0240 1FF7      ADC	R31,R23
    0241 8140      LDD	R20,Z+0
    0242 2755      CLR	R21
    0243 0D42      ADD	R20,R2
    0244 1D53      ADC	R21,R3
(0160) 					(*(p_CheckData+(GetCntTempBuf-2))<<8); 
(0161) //	CRCWord = *(p_CheckData+(GetCntTempBuf-2)) + 
(0162) //				(*(p_CheckData+(GetCntTempBuf-1))<<8); 				
(0163) 	if(CRCWord == CRC16(p_CheckData,GetCntTempBuf-2))	 
    0245 2D2A      MOV	R18,R10
    0246 2733      CLR	R19
    0247 5022      SUBI	R18,2
    0248 4030      SBCI	R19,0
    0249 018B      MOVW	R16,R22
    024A D008      RCALL	_CRC16
    024B 1740      CP	R20,R16
    024C 0751      CPC	R21,R17
    024D F411      BNE	0x0250
(0164) 	{
(0165) 		return TRUE;
    024E E001      LDI	R16,1
    024F C001      RJMP	0x0251
(0166) 	}
(0167) 	else
(0168) 	{
(0169) 		return FLASE;
    0250 2700      CLR	R16
    0251 D2A0      RCALL	pop_gset3
    0252 9508      RET
_CRC16:
  i                    --> R20
  CH                   --> R22
  CL                   --> R10
  SaveLo               --> R14
  SaveHi               --> Y+2
  Flag                 --> Y+0
  CRC16Hi              --> R12
  CRC16Lo              --> R6
  iLength              --> R8
  data                 --> R4
    0253 D2A4      RCALL	push_gset5
    0254 0149      MOVW	R8,R18
    0255 0128      MOVW	R4,R16
    0256 9723      SBIW	R28,3
(0170) 	}
(0171) }//uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)	
(0172) 
(0173) 
(0174) 
(0175) 
(0176) //
(0177) MyWord CRC16(MyByte *data,int iLength)
(0178) {   
(0179)  	MyByte CRC16Lo,CRC16Hi;
(0180)     MyByte CL,CH;
(0181)  	MyByte SaveHi,SaveLo;
(0182) 	int i,Flag;
(0183)     
(0184) 	CRC16Lo = 0xff;
    0257 EF8F      LDI	R24,0xFF
    0258 2E68      MOV	R6,R24
(0185) 	CRC16Hi = 0xff;
    0259 2EC8      MOV	R12,R24
(0186) 	CL = 0x01;
    025A 24AA      CLR	R10
    025B 94A3      INC	R10
(0187) 	CH = 0xa0;
    025C EA60      LDI	R22,0xA0
(0188) 	for(i=0; i<iLength; i++)
    025D 2744      CLR	R20
    025E 2755      CLR	R21
    025F C028      RJMP	0x0288
(0189) 	{
(0190) 		CRC16Lo = CRC16Lo ^ data[i];
    0260 01FA      MOVW	R30,R20
    0261 0DE4      ADD	R30,R4
    0262 1DF5      ADC	R31,R5
    0263 8020      LDD	R2,Z+0
    0264 2462      EOR	R6,R2
(0191) 		for( Flag=0; Flag<=7; Flag++)
    0265 2400      CLR	R0
    0266 2411      CLR	R1
    0267 8219      STD	Y+1,R1
    0268 8208      STD	Y+0,R0
(0192) 		{
(0193) 			SaveHi = CRC16Hi;
    0269 82CA      STD	Y+2,R12
(0194) 			SaveLo = CRC16Lo;
    026A 2CE6      MOV	R14,R6
(0195) 			CRC16Hi = CRC16Hi>>1;
    026B 94C6      LSR	R12
(0196) 			CRC16Lo = CRC16Lo>>1;
    026C 9466      LSR	R6
(0197) 
(0198) 			if((SaveHi&0x01) == 0x01)
    026D 818A      LDD	R24,Y+2
    026E 7081      ANDI	R24,1
    026F 3081      CPI	R24,1
    0270 F419      BNE	0x0274
(0199) 			   CRC16Lo = CRC16Lo|0x80;
    0271 2D86      MOV	R24,R6
    0272 6880      ORI	R24,0x80
    0273 2E68      MOV	R6,R24
(0200) 
(0201) 			if((SaveLo&0x01) == 0x01)
    0274 2D8E      MOV	R24,R14
    0275 7081      ANDI	R24,1
    0276 3081      CPI	R24,1
    0277 F411      BNE	0x027A
(0202) 			{
(0203) 				CRC16Hi = CRC16Hi ^ CH; //
    0278 26C6      EOR	R12,R22
(0204) 				CRC16Lo = CRC16Lo ^ CL; //
    0279 246A      EOR	R6,R10
    027A 8188      LDD	R24,Y+0
    027B 8199      LDD	R25,Y+1
    027C 9601      ADIW	R24,1
    027D 8399      STD	Y+1,R25
    027E 8388      STD	Y+0,R24
    027F E087      LDI	R24,7
    0280 E090      LDI	R25,0
    0281 8008      LDD	R0,Y+0
    0282 8019      LDD	R1,Y+1
    0283 1580      CP	R24,R0
    0284 0591      CPC	R25,R1
    0285 F71C      BGE	0x0269
    0286 5F4F      SUBI	R20,0xFF
    0287 4F5F      SBCI	R21,0xFF
    0288 1548      CP	R20,R8
    0289 0559      CPC	R21,R9
    028A F2AC      BLT	0x0260
(0205) 			}
(0206) 		}
(0207) 	}
(0208) 	return(CRC16Hi<<8 | CRC16Lo);
    028B 2D1C      MOV	R17,R12
    028C 2D06      MOV	R16,R6
    028D 9623      ADIW	R28,3
    028E D267      RCALL	pop_gset5
    028F 9508      RET
_readRegisters:
  finsh                --> Y+1
  result               --> Y+1
  readCount            --> R20
  addr                 --> R20
  crcData              --> R20
  byteCount            --> R10
  tempAddr             --> R12
  tempData             --> Y+0
  i                    --> R22
    0290 D269      RCALL	push_gset4
    0291 9722      SBIW	R28,2
(0209) }//MyWord CRC16(MyByte *data,int iLength).
(0210) 
(0211) 
(0212) //读寄存器
(0213) void readRegisters(void)
(0214) {
(0215) 	uint addr;
(0216) 	uint  tempAddr;
(0217) 	uint  result;
(0218) 	uint  crcData;
(0219) 	uchar readCount;
(0220) 	uchar byteCount;
(0221) 	uchar finsh;	//1完成  0出错
(0222) 	uint  i;

⌨️ 快捷键说明

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