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

📄 uart.lst

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0223)   	uint  tempData = 0;	
    0292 2422      CLR	R2
    0293 2433      CLR	R3
    0294 8239      STD	Y+1,R3
    0295 8228      STD	Y+0,R2
(0224) 	
(0225)     //起始地址 40001 (0x9c41)   
(0226) 	addr = (receBuf[2]<<8) + receBuf[3];
    0296 9020010F  LDS	R2,receBuf+3
    0298 9030010E  LDS	R3,receBuf+2
    029A 2D53      MOV	R21,R3
    029B 2D42      MOV	R20,R2
(0227) 	
(0228) 	//tempAddr = addr & 0xfff;
(0229) 	//addr = receBuf[3];
(0230) 	tempAddr = addr;
    029C 016A      MOVW	R12,R20
(0231) 	
(0232)     readCount = (receBuf[4]<<8) + receBuf[5];	//要读的个数
    029D 90200111  LDS	R2,0x111
    029F 90300110  LDS	R3,0x110
    02A1 2D53      MOV	R21,R3
    02A2 2D42      MOV	R20,R2
(0233) 	//readCount = receBuf[5];
(0234) 	
(0235) 	byteCount = readCount * 2;
    02A3 E082      LDI	R24,2
    02A4 9F84      MUL	R24,R20
    02A5 2CA0      MOV	R10,R0
(0236) 	
(0237) 	for(i=0;i<byteCount;i+=2,tempAddr++)
    02A6 2766      CLR	R22
    02A7 2777      CLR	R23
    02A8 C01B      RJMP	0x02C4
(0238) 	{
(0239) 		getRegisterVal(tempAddr,&tempData);
    02A9 019E      MOVW	R18,R28
    02AA 0186      MOVW	R16,R12
    02AB D048      RCALL	_getRegisterVal
(0240) 		sendBuf[i+3] = tempData >> 8;
    02AC E18C      LDI	R24,0x1C
    02AD E091      LDI	R25,1
    02AE 01FB      MOVW	R30,R22
    02AF 9633      ADIW	R30,3
    02B0 0FE8      ADD	R30,R24
    02B1 1FF9      ADC	R31,R25
    02B2 8028      LDD	R2,Y+0
    02B3 8039      LDD	R3,Y+1
    02B4 2C23      MOV	R2,R3
    02B5 2433      CLR	R3
    02B6 8220      STD	Z+0,R2
(0241) 		sendBuf[i+4] = tempData & 0xff;
    02B7 01FB      MOVW	R30,R22
    02B8 9634      ADIW	R30,4
    02B9 0FE8      ADD	R30,R24
    02BA 1FF9      ADC	R31,R25
    02BB 8188      LDD	R24,Y+0
    02BC 8199      LDD	R25,Y+1
    02BD 7090      ANDI	R25,0
    02BE 8380      STD	Z+0,R24
    02BF 5F6E      SUBI	R22,0xFE
    02C0 4F7F      SBCI	R23,0xFF
    02C1 01C6      MOVW	R24,R12
    02C2 9601      ADIW	R24,1
    02C3 016C      MOVW	R12,R24
    02C4 2C2A      MOV	R2,R10
    02C5 2433      CLR	R3
    02C6 1562      CP	R22,R2
    02C7 0573      CPC	R23,R3
    02C8 F300      BCS	0x02A9
(0242) 	}
(0243) 	
(0244) 	sendBuf[0] = 0xff;
    02C9 EF8F      LDI	R24,0xFF
    02CA 9380011C  STS	sendBuf,R24
(0245) 	sendBuf[1] = 3;
    02CC E083      LDI	R24,3
    02CD 9380011D  STS	sendBuf+1,R24
(0246) 	sendBuf[2] = byteCount;
    02CF 92A0011E  STS	sendBuf+2,R10
(0247) 	byteCount += 3;
    02D1 2D82      MOV	R24,R2
    02D2 5F8D      SUBI	R24,0xFD
    02D3 2EA8      MOV	R10,R24
(0248) 	crcData = CRC16(sendBuf,byteCount);
    02D4 2F28      MOV	R18,R24
    02D5 2733      CLR	R19
    02D6 E10C      LDI	R16,0x1C
    02D7 E011      LDI	R17,1
    02D8 DF7A      RCALL	_CRC16
    02D9 01A8      MOVW	R20,R16
(0249) 	sendBuf[byteCount] = crcData >> 8;
    02DA E18C      LDI	R24,0x1C
    02DB E091      LDI	R25,1
    02DC 2DEA      MOV	R30,R10
    02DD 27FF      CLR	R31
    02DE 0FE8      ADD	R30,R24
    02DF 1FF9      ADC	R31,R25
    02E0 011A      MOVW	R2,R20
    02E1 2C23      MOV	R2,R3
    02E2 2433      CLR	R3
    02E3 8220      STD	Z+0,R2
(0250) 	byteCount++;
    02E4 94A3      INC	R10
(0251) 	sendBuf[byteCount] = crcData & 0xff;
    02E5 2DEA      MOV	R30,R10
    02E6 27FF      CLR	R31
    02E7 0FE8      ADD	R30,R24
    02E8 1FF9      ADC	R31,R25
    02E9 01CA      MOVW	R24,R20
    02EA 7090      ANDI	R25,0
    02EB 8380      STD	Z+0,R24
(0252) //----------
(0253)   	sendCount = byteCount + 1;
    02EC 2D8A      MOV	R24,R10
    02ED 5F8F      SUBI	R24,0xFF
    02EE 93800130  STS	sendCount,R24
(0254) //	sendCount = 7;
(0255) //----------
(0256) 	beginSend();
    02F0 DE93      RCALL	_beginSend
    02F1 9622      ADIW	R28,2
    02F2 D201      RCALL	pop_gset4
    02F3 9508      RET
_getRegisterVal:
  tempAddr             --> Y+1
  result               --> R20
  p_tempData           --> R22
  addr                 --> R10
    02F4 D207      RCALL	push_gset3
    02F5 01B9      MOVW	R22,R18
    02F6 0158      MOVW	R10,R16
(0257) }//void readRegisters(void)
(0258) 
(0259) 
(0260) //取寄存器值 返回0表示成功
(0261) uint getRegisterVal(uint addr,uint *p_tempData)
(0262) {
(0263) 	uint  result = 0;
    02F7 2744      CLR	R20
    02F8 2755      CLR	R21
(0264) 	uint  tempAddr;
(0265) 
(0266) //	tempAddr = addr & 0xfff;
(0267) 	addr = addr - 40000;	
    02F9 01C5      MOVW	R24,R10
    02FA 5480      SUBI	R24,0x40
    02FB 499C      SBCI	R25,0x9C
    02FC 015C      MOVW	R10,R24
(0268) 	switch(addr)                 //(tempAddr)          // & 0xff)
    02FD E180      LDI	R24,0x10
    02FE E090      LDI	R25,0
    02FF 158A      CP	R24,R10
    0300 059B      CPC	R25,R11
    0301 F40C      BGE	0x0303
    0302 C02C      RJMP	0x032F
    0303 E002      LDI	R16,2
    0304 E010      LDI	R17,0
    0305 0195      MOVW	R18,R10
    0306 D1D9      RCALL	empy16s
    0307 01F8      MOVW	R30,R16
    0308 E384      LDI	R24,0x34
    0309 E090      LDI	R25,0
    030A 0FE8      ADD	R30,R24
    030B 1FF9      ADC	R31,R25
    030C 9005      LPM	R0,Z+
    030D 9014      LPM	R1,0(Z)
    030E 01F0      MOVW	R30,R0
    030F 9409      IJMP
(0269) 	{
(0270) 		case 0:
(0271) 				break;
(0272) 		case 1:
(0273) 			 	*p_tempData = testVarAnalog;	// 模拟量当前值.	
    0310 9020010A  LDS	R2,testVarAnalog
    0312 9030010B  LDS	R3,testVarAnalog+1
    0314 01FB      MOVW	R30,R22
    0315 8231      STD	Z+1,R3
    0316 8220      STD	Z+0,R2
(0274) 				break;
    0317 C017      RJMP	0x032F
(0275) 		case 2:		
(0276) 		    	*p_tempData = testVarPoint;   // 小数点位置.
    0318 90200108  LDS	R2,testVarPoint
    031A 90300109  LDS	R3,testVarPoint+1
    031C 01FB      MOVW	R30,R22
    031D 8231      STD	Z+1,R3
    031E 8220      STD	Z+0,R2
(0277) 				break;		
    031F C00F      RJMP	0x032F
(0278) 		case 3:
(0279) 			 	*p_tempData = testVarInputUp; //  上限.
    0320 90200106  LDS	R2,testVarInputUp
    0322 90300107  LDS	R3,testVarInputUp+1
    0324 01FB      MOVW	R30,R22
    0325 8231      STD	Z+1,R3
    0326 8220      STD	Z+0,R2
(0280) 				break;		
    0327 C007      RJMP	0x032F
(0281) 		case 4:
(0282) 	        	*p_tempData = testVarInputDown;// 下限. 
    0328 90200104  LDS	R2,testVarInputDown
    032A 90300105  LDS	R3,testVarInputDown+1
    032C 01FB      MOVW	R30,R22
    032D 8231      STD	Z+1,R3
    032E 8220      STD	Z+0,R2
(0283) 				break;		
(0284) 		case 5:
(0285) 				break;
(0286) 		case 6:
(0287) 				break;			
(0288) 		case 7:
(0289) 				break;		
(0290) 		case 8:
(0291) 				break;		
(0292) 		case 9:
(0293) 				break;  
(0294) 		case 10:
(0295) 				break;
(0296) 		case 11:
(0297) 				break;
(0298) 		case 12:
(0299) 				break;
(0300) 		case 13:
(0301) 				break;
(0302) 		case 14:
(0303) 				break;
(0304) 		case 15:
(0305) 				break;
(0306) 		case 16:
(0307) 				//*tempData = testRegister;
(0308) 				break;
(0309) 		default:
(0310) 				break;
(0311) 	}
(0312) 	return result;
    032F 018A      MOVW	R16,R20
    0330 D1C1      RCALL	pop_gset3
    0331 9508      RET
FILE: D:\ICCTES~1\1128\timer2.c
(0001) // timer2
(0002) #include <iom48v.h>
(0003) #include <macros.h>
(0004) #include "main.h"
(0005) #include "modbus.h"
(0006) #include "timer2.h"
(0007) 
(0008) volatile TIMEBASESTRCUT timeBase;
(0009) volatile LEDCONTROL ledControl;
(0010) //uchar var_a,var_b; 
(0011) 
(0012) //TIMER2 initialize - prescale:64
(0013) // WGM: Normal
(0014) // desired value: 1mSec
(0015) // actual value:  1.000mSec (0.0%)
(0016) void timer2_init(void)
(0017) {
(0018)  TCCR2B = 0x00; //stop
_timer2_init:
    0332 2422      CLR	R2
    0333 922000B1  STS	0xB1,R2
(0019)  ASSR  = 0x00; //set async mode
    0335 922000B6  STS	0xB6,R2
(0020)  TCNT2 = 0x83; //setup
    0337 E883      LDI	R24,0x83
    0338 938000B2  STS	0xB2,R24
(0021)  OCR2A = 0x7D;
    033A E78D      LDI	R24,0x7D
    033B 938000B3  STS	0xB3,R24
(0022)  OCR2B = 0x00;
    033D 922000B4  STS	0xB4,R2
(0023)  TCCR2A = 0x00; 
    033F 922000B0  STS	0xB0,R2
(0024)  TCCR2B = 0x04; //start
    0341 E084      LDI	R24,4
    0342 938000B1  STS	0xB1,R24
    0344 9508      RET
(0025) }
(0026) 
(0027) // timebase module.
(0028) void time_mission (void)       
(0029) {
(0030) 	static uchar Cnt100ms;
(0031) 	static uchar varcou;
(0032) 	static uint cnt500ms;
(0033)  	timeBase.bits.b1ms = 0;
_time_mission:
    0345 91800138  LDS	R24,timeBase
    0347 7F8E      ANDI	R24,0xFE
    0348 93800138  STS	timeBase,R24
(0034) 	timeBase.bits.b10ms = 0;
    034A 91800138  LDS	R24,timeBase
    034C 7F8B      ANDI	R24,0xFB
    034D 93800138  STS	timeBase,R24
(0035)     
(0036) 	if(timeBase.bits.bt1ms) 
    034F 91800138  LDS	R24,timeBase
    0351 9586      LSR	R24
    0352 7081      ANDI	R24,1
    0353 F409      BNE	0x0355
    0354 C044      RJMP	0x0399
(0037) 	{ 
(0038) 	//--------------------
(0039) 	//    PORTC ^= 0x02;
(0040) 	//      subled();	
(0041) 	//-----------------------
(0042) 		timeBase.bits.bt1ms = 0; 
    0355 91800138  LDS	R24,timeBase
    0357 7F8D      ANDI	R24,0xFD
    0358 93800138  STS	timeBase,R24
(0043) 		timeBase.bits.b1ms = 1; 
    035A 91800138  LDS	R24,timeBase
    035C 6081      ORI	R24,1
    035D 93800138  STS	timeBase,R24
(0044) 		if(receTimeOut>0) 
    035F 2422      CLR	R2
    0360 9030012C  LDS	R3,receTimeOut
    0362 1423      CP	R2,R3
    0363 F470      BCC	0x0372
(0045) 		{
(0046) 			receTimeOut--;
    0364 2D83      MOV	R24,R3
    0365 5081      SUBI	R24,1
    0366 9380012C  STS	receTimeOut,R24
(0047) 			if(receTimeOut==0 && receCount>0)
    0368 2388      TST	R24
    0369 F441      BNE	0x0372
    036A 9030012F  LDS	R3,receCount
    036C 1423      CP	R2,R3
    036D F420      BCC	0x0372
(0048) 			{
(0049) 				receCount = 0;
    036E 9220012F  STS	receCount,R2
(0050) 				checkoutError = 0;
    0370 9220012D  STS	checkoutError,R2
(0051) 			} 
(0052) 		} //if(receTimeOut>0) 
(0053) 		
(0054) 		varcou++;
    0372 91800133  LDS	R24,varcou
    0374 5F8F      SUBI	R24,0xFF
    0375 93800133  STS	varcou,R24
(0055)   		if(varcou>=5)
    0377 3085      CPI	R24,5
    0378 F040      BCS	0x0381
(0056)     	{                                              
(0057)             
(0058) 			ledControl.bits.refurbish = 1;  
    0379 91800136  LDS	R24,ledControl
    037B 6082      ORI	R24,2
    037C 93800136  STS	ledControl,R24
(0059)     		varcou = 0;                     
    037E 2422      CLR	R2
    037F 92200133  STS	varcou,R2
(0060)     	}                                   
(0061) 	
(0062) 	    cnt500ms++;
    0381 91800134  LDS	R24,cnt500ms
    0383 91900135  LDS	R25,cnt500ms+1
    0385 9601      ADIW	R24,1
    0386 93900135  STS	cnt500ms+1,R25
    0388 93800134  STS	cnt500ms,R24
(0063) 	    if(cnt500ms>=200)
    038A 3C88      CPI	R24,0xC8
    038B E0E0      LDI	R30,0
    038C 079E      CPC	R25,R30
    038D F058      BCS	0x0399
(0064) 	    {	 
(0065) 		    cnt500ms = 0;
    038E 2422      CLR	R2
    038F 2433      CLR	R3
    0390 92300135  STS	cnt500ms+1,R3
    0392 92200134  STS	cnt500ms,R2
(0066) 		    ledControl.bits.once128ms = 1;
    0394 91800136  LDS	R24,ledControl
    0396 6081      ORI	R24,1
    0397 93800136  STS	ledControl,R24
(0067) 	    }
(0068) 	} //(timeBase.bits.bt1ms)	
    0399 9508      RET
FILE: D:\ICCTES~1\1128\led.c
(0001) //LED device
(0002) #include <iom48v.h>
(0003) #include <macros.h>
(0004) #include "main.h"
(0005) #include "modbus.h"
(0006) #include "timer2.h"   
(0007) 
(0008) static char aloneD[4];
(0009) 
(0010) //led
(0011) void (*pcled[10])(void);  //定义函数指针数组.
(0012) unsigned int LedShowLink;
(0013) 
(0014) // PB0  PB1  PB2  PB3  PB4  PB5  PD6  PD7
(0015) //  A    B    C    D    E    F    G   dp
(0016) void light_0(void)
(0017) {
(0018)      //0000'0011
(0019)  	PORTB &= 0xc0;
_light_0:
    039A B185      IN	R24,0x05
    039B 7C80      ANDI	R24,0xC0
    039C B985      OUT	0x05,R24
(0020) 	PORTD |= 0x40; 
    039D 9A5E      SBI	0x0B,6
    039E 9508      RET
(0021) }
(0022) 
(0023) void light_1(void)
(0024) {    //0010'0101
(0025) 	 PORTB &= 0b11111001;
_light_1:
    039F B185      IN	R24,0x05
    03A0 7F89      ANDI	R24,0xF9
    03A1 B985      OUT	0x05,R24
(0026)  	 PORTB |= 0b00111001;
    03A2 B185      IN	R24,0x05
    03A3 6389      ORI	R24,0x39
    03A4 B985      OUT	0x05,R24
(0027) 	 PORTD |= 0b01000000;
    03A5 9A5E      SBI	0x0B,6
    03A6 9508      RET
(0028) }
(0029) 
(0030) void light_2(void)
(0031) {    //0010'0101
(0032)  	 PORTB &= 0b11100100;
_light_2:
    03A7 B185      IN	R24,0x05
    03A8 7E84      ANDI	R24,0xE4
    03A9 B985      OUT	0x05,R24
(0033) 	 PORTB |= 0b00100100;
    03AA B185      IN	R24,0x05
    03AB 6284      ORI	R24,0x24
    03AC B985      OUT	0x05,R24
(0034) 	 PORTD &= 0b10111111;
    03AD B18B      IN	R24,0x0B
    03AE 7B8F      ANDI	R24,0xBF
    03AF B98B      OUT	0x0B,R24
    03B0 9508      RET
(0035) }
(0036) 
(0037) void light_3(void)
(0038) {    //0000'1101
(0039) 	 PORTB &= 0b11110000;
_light_3:
    03B1 B185      IN	R24,0x05
    03B2 7F80      ANDI	R24,0xF0
    03B3 B985      OUT	0x05,R24
(0040) 	 PORTB |= 0b00110000;
    03B4 B185      IN	R24,0x05
    03B5 6380      ORI	R24,0x30
    03B6 B985      OUT	0x05,R24
(0041) 	 PORTD &= 0b10111111;
    03B7 B18B      IN	R24,0x0B
    03B8 7B8F      ANDI	R24,0xBF
    03B9 B98B      OUT	0x0B,R24
    03BA 9508      RET
(0042) }
(0043) 
(0044) void light_4(void)
(0045) {	 //1001'1001
(0046) 	 PORTB &= 0b11011001;
_light_4:
    03BB B185      IN	R24,0x05
    03BC 7D89      ANDI	R24,0xD9
    03BD B985      OUT	0x05,R24
(0047) 	 PORTB |= 0b00011001;
    03BE B185      IN	R24,0x05
    03BF 6189      ORI	R24,0x19
    03C0 B985      OUT	0x05,R24
(0048) 	 PORTD &= 0b10111111; 	 

⌨️ 快捷键说明

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