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

📄 uart.lst

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0036 EFCF      LDI	R28,0xFF
    0037 E0D2      LDI	R29,2
    0038 BFCD      OUT	0x3D,R28
    0039 BFDE      OUT	0x3E,R29
    003A 51C0      SUBI	R28,0x10
    003B 40D0      SBCI	R29,0
    003C EA0A      LDI	R16,0xAA
    003D 8308      STD	Y+0,R16
    003E 2400      CLR	R0
    003F E0E1      LDI	R30,1
    0040 E0F1      LDI	R31,1
    0041 E011      LDI	R17,1
    0042 35E6      CPI	R30,0x56
    0043 07F1      CPC	R31,R17
    0044 F011      BEQ	0x0047
    0045 9201      ST	R0,Z+
    0046 CFFB      RJMP	0x0042
    0047 8300      STD	Z+0,R16
    0048 E6EA      LDI	R30,0x6A
    0049 E0F0      LDI	R31,0
    004A E0A0      LDI	R26,0
    004B E0B1      LDI	R27,1
    004C E010      LDI	R17,0
    004D 36EB      CPI	R30,0x6B
    004E 07F1      CPC	R31,R17
    004F F021      BEQ	0x0054
    0050 95C8      LPM
    0051 9631      ADIW	R30,1
    0052 920D      ST	R0,X+
    0053 CFF9      RJMP	0x004D
    0054 D0F5      RCALL	_main
_exit:
    0055 CFFF      RJMP	_exit
FILE: D:\ICCTES~1\1128\uart_main.c
(0001) // ICC-AVR application builder : 2007-11-28 8:53:26
(0002) // Target : M48
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom48v.h>
(0006) #include <macros.h>
(0007) #include "main.h"
(0008) #include "modbus.h"
(0009) #include "timer2.h"   
(0010) #include "led.h"
(0011) 
(0012) void test(void)
(0013) {
(0014)     // LedShowLink = 5678;
(0015) 	testVarAnalog = 0x0102;
_test:
    0056 E082      LDI	R24,2
    0057 E091      LDI	R25,1
    0058 9390010B  STS	testVarAnalog+1,R25
    005A 9380010A  STS	testVarAnalog,R24
(0016)     testVarPoint = 0x0304;
    005C E084      LDI	R24,4
    005D E093      LDI	R25,3
    005E 93900109  STS	testVarPoint+1,R25
    0060 93800108  STS	testVarPoint,R24
(0017)     testVarInputUp = 0x0506;
    0062 E086      LDI	R24,6
    0063 E095      LDI	R25,5
    0064 93900107  STS	testVarInputUp+1,R25
    0066 93800106  STS	testVarInputUp,R24
(0018)     testVarInputDown = 0x0708;
    0068 E088      LDI	R24,0x8
    0069 E097      LDI	R25,7
    006A 93900105  STS	testVarInputDown+1,R25
    006C 93800104  STS	testVarInputDown,R24
    006E 9508      RET
(0019) }
(0020) 
(0021) void delay(uint num)
(0022) {
(0023)  	 while(num-->0)       
_delay:
  num                  --> R16
    006F 0118      MOVW	R2,R16
    0070 5001      SUBI	R16,1
    0071 4010      SBCI	R17,0
    0072 2022      TST	R2
    0073 F7D9      BNE	0x006F
    0074 2033      TST	R3
    0075 F7C9      BNE	0x006F
    0076 9508      RET
(0024) 	      ;         
(0025) }
(0026) 
(0027) void port_init(void)
(0028) {
(0029)  PORTB = 0x00;
_port_init:
    0077 2422      CLR	R2
    0078 B825      OUT	0x05,R2
(0030)  DDRB  = 0x00;
    0079 B824      OUT	0x04,R2
(0031)  PORTC = 0x00; //m103 output only
    007A B828      OUT	0x08,R2
(0032)  DDRC  = 0x00;
    007B B827      OUT	0x07,R2
(0033)  PORTD = 0x00;
    007C B82B      OUT	0x0B,R2
(0034)  DDRD  = 0x00;
    007D B82A      OUT	0x0A,R2
    007E 9508      RET
_timer2_ovf_isr:
    007F 938A      ST	R24,-Y
    0080 B78F      IN	R24,0x3F
    0081 938A      ST	R24,-Y
(0035) }
(0036) 
(0037) #pragma interrupt_handler timer2_ovf_isr:10
(0038) void timer2_ovf_isr(void)
(0039) {
(0040)  TCNT2 = 0x83; //reload counter value
    0082 E883      LDI	R24,0x83
    0083 938000B2  STS	0xB2,R24
(0041) 	
(0042)  timeBase.bits.bt1ms = 1;
    0085 91800138  LDS	R24,timeBase
    0087 6082      ORI	R24,2
    0088 93800138  STS	timeBase,R24
    008A 9189      LD	R24,Y+
    008B BF8F      OUT	0x3F,R24
    008C 9189      LD	R24,Y+
    008D 9518      RETI
_uart0_rx_isr:
  tmp                  --> R16
    008E 922A      ST	R2,-Y
    008F 930A      ST	R16,-Y
    0090 938A      ST	R24,-Y
    0091 939A      ST	R25,-Y
    0092 93EA      ST	R30,-Y
    0093 93FA      ST	R31,-Y
    0094 B62F      IN	R2,0x3F
    0095 922A      ST	R2,-Y
(0043) }
(0044) 
(0045) #pragma interrupt_handler uart0_rx_isr:19
(0046) void uart0_rx_isr(void)
(0047) {    
(0048)  	uint8 tmp;
(0049) 	receTimeOut = 10;    //通讯超时值
    0096 E08A      LDI	R24,0xA
    0097 9380012C  STS	receTimeOut,R24
(0050) 	//PORTC ^= 0x02;
(0051) 	
(0052) 	
(0053) 	if(UCSR0A&BIT(FE0) != 0)  //帧错.			  //if(FERR==1)	
    0099 902000C0  LDS	R2,0xC0
    009B FE20      SBRS	R2,0
    009C C012      RJMP	0x00AF
(0054) 	{	
(0055) 		UCSR0B &= ~BIT(RXEN0);  //CREN = 0;
    009D 918000C1  LDS	R24,0xC1
    009F 7E8F      ANDI	R24,0xEF
    00A0 938000C1  STS	0xC1,R24
(0056) 		UCSR0A &= ~BIT(FE0);    //FERR = 0;
    00A2 918000C0  LDS	R24,0xC0
    00A4 7E8F      ANDI	R24,0xEF
    00A5 938000C0  STS	0xC0,R24
(0057) 		UCSR0B |= BIT(RXEN0);   //CREN = 1; 
    00A7 918000C1  LDS	R24,0xC1
    00A9 6180      ORI	R24,0x10
    00AA 938000C1  STS	0xC1,R24
(0058) 		tmp = UDR0;
    00AC 910000C6  LDS	R16,0xC6
(0059) 		//PORTC ^= 0x02;
(0060) 	}	
    00AE C034      RJMP	0x00E3
(0061) 	//else if(OERR==1)	
(0062) 	else if(UCSR0A&BIT(DOR0))  //溢出错.
    00AF 902000C0  LDS	R2,0xC0
    00B1 FE23      SBRS	R2,3
    00B2 C012      RJMP	0x00C5
(0063) 	{ 
(0064) 		UCSR0B &= ~BIT(RXEN0);  //CREN = 0; 
    00B3 918000C1  LDS	R24,0xC1
    00B5 7E8F      ANDI	R24,0xEF
    00B6 938000C1  STS	0xC1,R24
(0065) 		UCSR0A &= ~BIT(DOR0);   //OERR = 0;
    00B8 918000C0  LDS	R24,0xC0
    00BA 7F87      ANDI	R24,0xF7
    00BB 938000C0  STS	0xC0,R24
(0066) 		UCSR0B |= BIT(RXEN0);   //CREN = 1; 
    00BD 918000C1  LDS	R24,0xC1
    00BF 6180      ORI	R24,0x10
    00C0 938000C1  STS	0xC1,R24
(0067) 		tmp = UDR0;
    00C2 910000C6  LDS	R16,0xC6
(0068) 		//PORTC ^= 0x02;
(0069) 	}	
    00C4 C01E      RJMP	0x00E3
(0070) 	else //奇偶校验的问题.
(0071) 	{ 	
(0072) 		//	RX9DBuf = RX9D; 
(0073) 		// 读取接受寄存器中的数据.
(0074) 		receBuf[receCount] = UDR0;     // RCREG; 
    00C5 E08C      LDI	R24,0xC
    00C6 E091      LDI	R25,1
    00C7 91E0012F  LDS	R30,receCount
    00C9 27FF      CLR	R31
    00CA 0FE8      ADD	R30,R24
    00CB 1FF9      ADC	R31,R25
    00CC 902000C6  LDS	R2,0xC6
    00CE 8220      STD	Z+0,R2
(0075) 		// 奇校验判断.
(0076) 			//if(RX9DBuf != ParityBit(&receBuf[receCount]))
(0077) 	    if(UCSR0A&BIT(UPE0)!=0)  //奇校验硬件完成.
    00CF 902000C0  LDS	R2,0xC0
    00D1 FE20      SBRS	R2,0
    00D2 C008      RJMP	0x00DB
(0078) 		{
(0079) 		 	//PORTC ^= 0x02;					 
(0080) 		 	UCSR0A |= BIT(UPE0);				   
    00D3 918000C0  LDS	R24,0xC0
    00D5 6084      ORI	R24,4
    00D6 938000C0  STS	0xC0,R24
(0081) 			checkoutError = 1; 
    00D8 E081      LDI	R24,1
    00D9 9380012D  STS	checkoutError,R24
(0082) 		}			
(0083) 		receCount++;				   // 接收地址偏移寄存器加1. 
    00DB 9180012F  LDS	R24,receCount
    00DD 5F8F      SUBI	R24,0xFF
    00DE 9380012F  STS	receCount,R24
(0084) 		receCount &= 0x0f;             // 最多接受16个字节. 
    00E0 708F      ANDI	R24,0xF
    00E1 9380012F  STS	receCount,R24
(0085) 	//	PORTC ^= 0x02;
(0086) 	}   //
    00E3 9029      LD	R2,Y+
    00E4 BE2F      OUT	0x3F,R2
    00E5 91F9      LD	R31,Y+
    00E6 91E9      LD	R30,Y+
    00E7 9199      LD	R25,Y+
    00E8 9189      LD	R24,Y+
    00E9 9109      LD	R16,Y+
    00EA 9029      LD	R2,Y+
    00EB 9518      RETI
_uart0_udre_isr:
    00EC 922A      ST	R2,-Y
    00ED 923A      ST	R3,-Y
    00EE 938A      ST	R24,-Y
    00EF 939A      ST	R25,-Y
    00F0 93EA      ST	R30,-Y
    00F1 93FA      ST	R31,-Y
    00F2 B62F      IN	R2,0x3F
    00F3 922A      ST	R2,-Y
(0087) }	//void uart0_rx_isr(void)  				   
(0088) 
(0089) 
(0090) #pragma interrupt_handler uart0_udre_isr:21
(0091) void uart0_udre_isr(void)
(0092) {
(0093) //character transferred to shift register so UDR is now empty
(0094) //	 UDR0 = 0x01;
(0095) 	  if(sendPosi<sendCount)  
    00F4 90200130  LDS	R2,sendCount
    00F6 90300131  LDS	R3,sendPosi
    00F8 1432      CP	R3,R2
    00F9 F480      BCC	0x010A
(0096) 	  {	
(0097) 		  sendPosi++;   
    00FA 91800131  LDS	R24,sendPosi
    00FC 5F8F      SUBI	R24,0xFF
    00FD 93800131  STS	sendPosi,R24
(0098) 		//	TX9D = ParityBit(sendBuf[sendPosi]);  
(0099) 			UDR0 = sendBuf[sendPosi];  
    00FF E18C      LDI	R24,0x1C
    0100 E091      LDI	R25,1
    0101 91E00131  LDS	R30,sendPosi
    0103 27FF      CLR	R31
    0104 0FE8      ADD	R30,R24
    0105 1FF9      ADC	R31,R25
    0106 8020      LDD	R2,Z+0
    0107 922000C6  STS	0xC6,R2
(0100) 	   }	 
    0109 C015      RJMP	0x011F
(0101) 	   else	
(0102) 	   {	
(0103) //	receEnable();	 		//485芯片
(0104) 	 	    if(UCSR0A&BIT(TXC0) != 0)                //if(TRMT)
    010A 902000C0  LDS	R2,0xC0
    010C FE20      SBRS	R2,0
    010D C011      RJMP	0x011F
(0105) 		 	{
(0106) 			 	receCount = 0;	
    010E 2422      CLR	R2
    010F 9220012F  STS	receCount,R2
(0107) 				checkoutError = 0;	
    0111 9220012D  STS	checkoutError,R2
(0108) //--------------------------
(0109) 				//UCSR0B &= ~BIT(UDRIE0);   //RXCIE0 清零. TXIE = 0;//在一组数据发送完成后关闭
(0110) 				  UCSR0B &= ~BIT(TXCIE0);         
    0113 918000C1  LDS	R24,0xC1
    0115 7B8F      ANDI	R24,0xBF
    0116 938000C1  STS	0xC1,R24
(0111) 			    //TXEN = 0;           
(0112) 				UCSR0B &= ~BIT(TXEN0);			  
    0118 918000C1  LDS	R24,0xC1
    011A 7F87      ANDI	R24,0xF7
    011B 938000C1  STS	0xC1,R24
(0113) 				sendCount = 0;          
    011D 92200130  STS	sendCount,R2
(0114) //--------------------------
(0115) 				//  flag_bit = 0;        //&&&&&&&&
(0116) 			}       
(0117) 	    }           
    011F 9029      LD	R2,Y+
    0120 BE2F      OUT	0x3F,R2
    0121 91F9      LD	R31,Y+
    0122 91E9      LD	R30,Y+
    0123 9199      LD	R25,Y+
    0124 9189      LD	R24,Y+
    0125 9039      LD	R3,Y+
    0126 9029      LD	R2,Y+
    0127 9518      RETI
(0118) }                   
(0119) 
(0120) void test_pin(void)
(0121) {
(0122)  DDRC |= 0x02;
_test_pin:
    0128 9A39      SBI	0x07,1
(0123)  PORTC |= 0x02;	
    0129 9A41      SBI	0x08,1
    012A 9508      RET
(0124) }
(0125) 
(0126) //call this routine to initialize all peripherals
(0127) void init_devices(void)
(0128) {
(0129)  //stop errant interrupts until set up
(0130)  CLI(); //disable all interrupts
_init_devices:
    012B 94F8      BCLR	7
(0131)  port_init();
    012C DF4A      RCALL	_port_init
(0132)  uart0_init();
    012D D044      RCALL	_uart0_init
(0133)  timer2_init();
    012E D203      RCALL	_timer2_init
(0134)  led_init();
    012F D2BE      RCALL	_led_init
(0135)  
(0136)  test_pin();
    0130 DFF7      RCALL	_test_pin
(0137)  
(0138)  MCUCR = 0x00;
    0131 2422      CLR	R2
    0132 BE25      OUT	0x35,R2
(0139)  EICRA = 0x00; //extended ext ints
    0133 92200069  STS	0x69,R2
(0140)  EIMSK = 0x00;
    0135 BA2D      OUT	0x1D,R2
(0141)  
(0142)  TIMSK0 = 0x00; //timer 0 interrupt sources
    0136 9220006E  STS	0x6E,R2
(0143)  TIMSK1 = 0x00; //timer 1 interrupt sources
    0138 9220006F  STS	0x6F,R2
(0144)  TIMSK2 = 0x01; //timer 2 interrupt sources
    013A E081      LDI	R24,1
    013B 93800070  STS	0x70,R24
(0145)  
(0146)  PCMSK0 = 0x00; //pin change mask 0 
    013D 9220006B  STS	0x6B,R2
(0147)  PCMSK1 = 0x00; //pin change mask 1 
    013F 9220006C  STS	0x6C,R2
(0148)  PCMSK2 = 0x00; //pin change mask 2
    0141 9220006D  STS	0x6D,R2
(0149)  PCICR = 0x00; //pin change enable 
    0143 92200068  STS	0x68,R2
(0150)  PRR = 0x84; //power controller
    0145 E884      LDI	R24,0x84
    0146 93800064  STS	0x64,R24
(0151)  SEI(); //re-enable interrupts
    0148 9478      BSET	7
    0149 9508      RET
(0152)  //all peripherals are now initialized
(0153) }
(0154) 
(0155) //
(0156) void main(void)
(0157) {
(0158)  	NOP();
_main:
    014A 0000      NOP
(0159) 	 init_devices();
    014B DFDF      RCALL	_init_devices
(0160) 	NOP(); 
    014C 0000      NOP
(0161) 	 singleKeyTranmit();
    014D D052      RCALL	_singleKeyTranmit
(0162) 	delay(50000);
    014E E500      LDI	R16,0x50
    014F EC13      LDI	R17,0xC3
    0150 DF1E      RCALL	_delay
(0163)      singleKeyTranmit();	 
    0151 D04E      RCALL	_singleKeyTranmit
(0164) 	test();	 
    0152 DF03      RCALL	_test
    0153 C01C      RJMP	0x0170
(0165) 	
(0166) 	
(0167) 	 while(1)
(0168) 	 {     
(0169) 	 
(0170) 	 	ReceiveFrameDisFun();   	 
    0154 D06C      RCALL	_ReceiveFrameDisFun
(0171) 	 
(0172) 	    //UDR0 = 0x01;
(0173) 		if(timeBase.bits.bt1ms) 
    0155 91800138  LDS	R24,timeBase
    0157 9586      LSR	R24
    0158 7081      ANDI	R24,1
    0159 F009      BEQ	0x015B
(0174) 			  time_mission();
    015A D1EA      RCALL	_time_mission
(0175) 	    if(ledControl.bits.once128ms) // if(var_a == 1)		 	    // 
    015B 91800136  LDS	R24,ledControl
    015D 7081      ANDI	R24,1
    015E F031      BEQ	0x0165
(0176) 		{
(0177) 		//PORTC ^= 0x02;				
(0178) 		 	ledControl.bits.once128ms=0;	//var_a = 0; 				//						 
    015F 91800136  LDS	R24,ledControl
    0161 7F8E      ANDI	R24,0xFE
    0162 93800136  STS	ledControl,R24
(0179) 		   sub2();		
    0164 D307      RCALL	_sub2
(0180) 	    } 
(0181) 		if(ledControl.bits.refurbish)  //if(var_b == 1)				//
    0165 91800136  LDS	R24,ledControl
    0167 9586      LSR	R24
    0168 7081      ANDI	R24,1
    0169 F031      BEQ	0x0170
(0182) 		{
(0183) 		//PORTC ^= 0x02;				
(0184) 			ledControl.bits.refurbish=0;//var_b = 0;  		  	//  		
    016A 91800136  LDS	R24,ledControl
    016C 7F8D      ANDI	R24,0xFD
    016D 93800136  STS	ledControl,R24
(0185) 		 	 subled();	 
    016F D30E      RCALL	_subled
    0170 CFE3      RJMP	0x0154
    0171 9508      RET
FILE: D:\ICCTES~1\1128\modbus.c
(0001) //modbus.c         
(0002) #include <iom48v.h>        
(0003) #include <macros.h>            
(0004) #include "main.h"            
(0005) #include "modbus.h"         
(0006) #include "timer2.h"  
(0007) #include "led.h"
(0008) 
(0009) #define LocalAddr 0x01          
(0010) #define TRUE 1                                   
(0011) #define FLASE 0                               
(0012) volatile uchar sendPosi,sendCount;             
(0013) uchar receCount;                    
(0014) volatile uchar GetCntTemp;                  
(0015)  uchar sendBuf[16];                          
(0016)  uchar receBuf[16];                           
(0017) volatile uchar checkoutError;	//校验结果     
(0018)  uchar receTimeOut;				//接收超时     
(0019)                  
(0020) uchar GetKeyValue;
(0021) uint crc_result;
(0022) 
(0023)  uint testVarAnalog;

⌨️ 快捷键说明

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