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

📄 modbusm16.lst

📁 modbus协议实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    016F E5CF      LDI	R28,0x5F
    0170 E0D4      LDI	R29,4
    0171 BFCD      OUT	P3D,R28
    0172 BFDE      OUT	P3E,R29
    0173 58C0      SUBI	R28,0x80
    0174 40D0      SBCI	R29,0
    0175 EA0A      LDI	R16,0xAA
    0176 8308      STD	R16,0+Y
    0177 2400      CLR	R0
    0178 E6E1      LDI	R30,0x61
    0179 E0F0      LDI	R31,0
    017A E010      LDI	R17,0
    017B 3BE6      CPI	R30,0xB6
    017C 07F1      CPC	R31,R17
    017D F011      BEQ	0x0180
    017E 9201      ST	R0,Z+
    017F CFFB      RJMP	0x017B
    0180 8300      STD	R16,0+Z
    0181 EDEC      LDI	R30,0xDC
    0182 E0F2      LDI	R31,2
    0183 E6A0      LDI	R26,0x60
    0184 E0B0      LDI	R27,0
    0185 E012      LDI	R17,2
    0186 3DED      CPI	R30,0xDD
    0187 07F1      CPC	R31,R17
    0188 F021      BEQ	0x018D
    0189 95C8      LPM
    018A 9631      ADIW	R30,1
    018B 920D      ST	R0,X+
    018C CFF9      RJMP	0x0186
    018D 940E02B8  CALL	_main
_exit:
    018F CFFF      RJMP	_exit
FILE: E:\我的网页\mcuc\download\M16-23板程序模板\新建文件夹\init.c
(0001) //ICC-AVR application builder : 2004-10-27 10:06:29
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include "main.h"
(0006) 
(0007) //初始化变量
(0008) void varInit(void)
(0009) {
(0010) 
(0011) }//void valInit(void)
_varInit:
    0190 9508      RET
(0012) 
(0013) void port_init(void)
(0014) {
(0015)  	 				// 
(0016)  PORTA = 0xF0;		//		
_port_init:
    0191 EF80      LDI	R24,0xF0
    0192 BB8B      OUT	P1B,R24
(0017)  DDRA  = 0x00;		//
    0193 2422      CLR	R2
    0194 BA2A      OUT	P1A,R2
(0018)  PORTB = 0xFF;		//
    0195 EF8F      LDI	R24,0xFF
    0196 BB88      OUT	P18,R24
(0019)  DDRB  = 0xFD;		//
    0197 EF8D      LDI	R24,0xFD
    0198 BB87      OUT	P17,R24
(0020)  PORTC = 0xFF; 		//
    0199 EF8F      LDI	R24,0xFF
    019A BB85      OUT	P15,R24
(0021)  DDRC  = 0x00;		//
    019B BA24      OUT	P14,R2
(0022)  PORTD = 0xFF;		//
    019C BB82      OUT	P12,R24
(0023)  DDRD  = 0xFA;		//
    019D EF8A      LDI	R24,0xFA
    019E BB81      OUT	P11,R24
(0024) }//void port_init(void)
    019F 9508      RET
(0025) 
(0026) 
(0027) //Watchdog initialisation
(0028) // prescale: 2048K cycles
(0029) void watchdog_init(void)
(0030) {
(0031)  WDR(); //this prevents a timout on enabling
_watchdog_init:
    01A0 95A8      WDR
(0032)  WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
    01A1 E08F      LDI	R24,0xF
    01A2 BD81      OUT	P21,R24
(0033) }//void watchdog_init(void)
    01A3 9508      RET
(0034) 
(0035) void timer0_init(void)
(0036) {
(0037)  //初始化1ms 定时中断
(0038)  TCCR0 = 0x00;
_timer0_init:
    01A4 2422      CLR	R2
    01A5 BE23      OUT	P33,R2
(0039)  TIFR  = 0x00;  
    01A6 BE28      OUT	P38,R2
(0040)  TCNT0 = 0x83;
    01A7 E883      LDI	R24,0x83
    01A8 BF82      OUT	P32,R24
(0041)  TCCR0 = 0x03;
    01A9 E083      LDI	R24,3
    01AA BF83      OUT	P33,R24
(0042) }//void timer0_init(void)
    01AB 9508      RET
(0043) 
(0044) //ADC initialisation
(0045) // Conversion time: 52uS
(0046) void adc_init(void)
(0047) {
(0048)  uint8 adcMux = 0;
_adc_init:
  adcMux               --> R16
    01AC 2700      CLR	R16
(0049)  
(0050)  ADCSR = 0x00; //disable adc
    01AD 2422      CLR	R2
    01AE B826      OUT	P06,R2
(0051)  ADMUX = 0xc0 |(adcMux&0x0f); //select adc input 0   2.56V参考源
    01AF 2F80      MOV	R24,R16
    01B0 708F      ANDI	R24,0xF
    01B1 6C80      ORI	R24,0xC0
    01B2 B987      OUT	P07,R24
(0052)  ACSR  = 0x80;
    01B3 E880      LDI	R24,0x80
    01B4 B988      OUT	P08,R24
(0053)  ADCSR = 0x85; //使能ADC 32分频
    01B5 E885      LDI	R24,0x85
    01B6 B986      OUT	P06,R24
(0054) }//void adc_init(void)
    01B7 9508      RET
(0055) 
(0056) //UART0 initialisation
(0057) // desired baud rate: 9600
(0058) // actual: baud rate:9615 (0.2%)
(0059) // char size: 8 bit
(0060) // parity: Even
(0061) void uart0_init(void)
(0062) {
(0063)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    01B8 2422      CLR	R2
    01B9 B82A      OUT	P0A,R2
(0064)  UCSRA = 0x00;
    01BA B82B      OUT	P0B,R2
(0065)  UCSRC = 0xA6;
    01BB EA86      LDI	R24,0xA6
    01BC BD80      OUT	P20,R24
(0066)  UBRRL = 51; //set baud rate lo
    01BD E383      LDI	R24,0x33
    01BE B989      OUT	P09,R24
(0067)  UBRRH = 0x00; //set baud rate hi
    01BF BC20      OUT	P20,R2
(0068)  UCSRB = 0xD8;
    01C0 ED88      LDI	R24,0xD8
    01C1 B98A      OUT	P0A,R24
(0069)  
(0070)  receEnable();
    01C2 98C7      CBI	P18,7
(0071) }
    01C3 9508      RET
_uart0_rx_isr:
  status               --> R16
    01C4 922A      ST	R2,-Y
    01C5 930A      ST	R16,-Y
    01C6 938A      ST	R24,-Y
    01C7 939A      ST	R25,-Y
    01C8 93EA      ST	R30,-Y
    01C9 93FA      ST	R31,-Y
    01CA B62F      IN	R2,P3F
    01CB 922A      ST	R2,-Y
(0072) 
(0073) #pragma interrupt_handler uart0_rx_isr:12
(0074) void uart0_rx_isr(void)
(0075) {
(0076)  	uint8 status;
(0077) 	
(0078)  //uart has received a character in UDR
(0079) 	status = UCSRA;
    01CC B10B      IN	R16,P0B
(0080)     receBuf[receCount] = UDR;
    01CD E781      LDI	R24,0x71
    01CE E090      LDI	R25,0
    01CF 91E000B2  LDS	R30,_receCount
    01D1 27FF      CLR	R31
    01D2 0FE8      ADD	R30,R24
    01D3 1FF9      ADC	R31,R25
    01D4 B02C      IN	R2,P0C
    01D5 8220      STD	R2,0+Z
(0081) 	
(0082)     if(status & 0x1c)  //通信出错
    01D6 2F80      MOV	R24,R16
    01D7 718C      ANDI	R24,0x1C
    01D8 F019      BEQ	0x01DC
(0083)     	 checkoutError = 2;	//偶校验出错
    01D9 E082      LDI	R24,2
    01DA 93800070  STS	_checkoutError,R24
(0084) 
(0085)   	//testRegister = status;		 
(0086)     receCount++;          //接收地址偏移寄存器加1
    01DC 918000B2  LDS	R24,_receCount
    01DE 5F8F      SUBI	R24,0xFF
    01DF 938000B2  STS	_receCount,R24
(0087)     receCount &= 0x1f;    //最多一次只能接收32个字节 
    01E1 718F      ANDI	R24,0x1F
    01E2 938000B2  STS	_receCount,R24
(0088)     receTimeOut = 10;    //通讯超时值	
    01E4 E08A      LDI	R24,0xA
    01E5 9380006F  STS	_receTimeOut,R24
(0089) }
    01E7 9029      LD	R2,Y+
    01E8 BE2F      OUT	P3F,R2
    01E9 91F9      LD	R31,Y+
    01EA 91E9      LD	R30,Y+
    01EB 9199      LD	R25,Y+
    01EC 9189      LD	R24,Y+
    01ED 9109      LD	R16,Y+
    01EE 9029      LD	R2,Y+
    01EF 9518      RETI
_uart0_tx_isr:
    01F0 922A      ST	R2,-Y
    01F1 923A      ST	R3,-Y
    01F2 938A      ST	R24,-Y
    01F3 939A      ST	R25,-Y
    01F4 93EA      ST	R30,-Y
    01F5 93FA      ST	R31,-Y
    01F6 B62F      IN	R2,P3F
    01F7 922A      ST	R2,-Y
(0090) 
(0091) #pragma interrupt_handler uart0_tx_isr:14
(0092) void uart0_tx_isr(void)
(0093) {
(0094)  //character has been transmitted
(0095)     if(sendPosi < sendCount) 
    01F8 902000B3  LDS	R2,_sendCount
    01FA 903000B1  LDS	R3,_sendPosi
    01FC 1432      CP	R3,R2
    01FD F470      BCC	0x020C
(0096)     {
(0097)         sendPosi++;
    01FE 2D83      MOV	R24,R3
    01FF 5F8F      SUBI	R24,0xFF
    0200 938000B1  STS	_sendPosi,R24
(0098)         UDR = sendBuf[sendPosi];
    0202 E981      LDI	R24,0x91
    0203 E090      LDI	R25,0
    0204 91E000B1  LDS	R30,_sendPosi
    0206 27FF      CLR	R31
    0207 0FE8      ADD	R30,R24
    0208 1FF9      ADC	R31,R25
    0209 8020      LDD	R2,0+Z
    020A B82C      OUT	P0C,R2
(0099)     }
    020B C006      RJMP	0x0212
(0100)     else
(0101)     {
(0102)         receEnable();    //发送完后将485置于接收状态
    020C 98C7      CBI	P18,7
(0103)         receCount = 0;   //清接收地址偏移寄存器
    020D 2422      CLR	R2
    020E 922000B2  STS	_receCount,R2
(0104)         checkoutError = 0;
    0210 92200070  STS	_checkoutError,R2
(0105)     } 
(0106) }
    0212 9029      LD	R2,Y+
    0213 BE2F      OUT	P3F,R2
    0214 91F9      LD	R31,Y+
    0215 91E9      LD	R30,Y+
    0216 9199      LD	R25,Y+
    0217 9189      LD	R24,Y+
    0218 9039      LD	R3,Y+
    0219 9029      LD	R2,Y+
    021A 9518      RETI
(0107) 
(0108) //call this routine to initialise all peripherals
(0109) void init_devices(void)
(0110) {
(0111)  //stop errant interrupts until set up
(0112)  CLI(); //disable all interrupts
_init_devices:
    021B 94F8      BCLR	7
(0113)  port_init();
    021C DF74      RCALL	_port_init
(0114)  watchdog_init(); 
    021D DF82      RCALL	_watchdog_init
(0115)  timer0_init();
    021E DF85      RCALL	_timer0_init
(0116)  adc_init();
    021F DF8C      RCALL	_adc_init
(0117)  uart0_init(); 
    0220 DF97      RCALL	_uart0_init
(0118) 
(0119)  MCUCR = 0x00;
    0221 2422      CLR	R2
    0222 BE25      OUT	P35,R2
(0120)  GICR  = 0x00;
    0223 BE2B      OUT	P3B,R2
(0121)  TIMSK = 0x01; //timer interrupt sources
    0224 E081      LDI	R24,1
    0225 BF89      OUT	P39,R24
(0122)  SEI(); //re-enable interrupts
    0226 9478      BSET	7
(0123)  //all peripherals are now initialised
(0124) }//void init_devices(void)
    0227 9508      RET
_timer0_ovf_isr:
    0228 922A      ST	R2,-Y
    0229 923A      ST	R3,-Y
    022A 924A      ST	R4,-Y
    022B 925A      ST	R5,-Y
    022C 938A      ST	R24,-Y
    022D 939A      ST	R25,-Y
    022E 93AA      ST	R26,-Y
    022F 93BA      ST	R27,-Y
    0230 93EA      ST	R30,-Y
    0231 B62F      IN	R2,P3F
    0232 922A      ST	R2,-Y
    0233 940E064A  CALL	push_gset2
FILE: E:\我的网页\mcuc\download\M16-23板程序模板\新建文件夹\main.c
(0001) //ICC-AVR application builder : 2004-10-27 10:06:29
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) /*****************************************************
(0006) 微控电子 www.mcuc.cn
(0007) modbus RTU 的mega16程序,使用ICCAVR编译
(0008) 单片机mega16
(0009) 通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
(0010) 单片机控制板地址 localAddr(变量)
(0011) 通信可设置数据的地址:
(0012) 字地址 0 - 255 (只取16位的低8位)
(0013) 位地址 0 - 255 (只取16位的低8位)
(0014) ******************************************************/
(0015) 
(0016) 
(0017) #include "main.h"
(0018) 
(0019) uint32 tickCount,intTickCount;
(0020) uint8 flag1ms,c200ms;
(0021) 
(0022) #pragma interrupt_handler timer0_ovf_isr:10
(0023) //定时器0 1ms定时中断
(0024) void timer0_ovf_isr(void)
(0025) {
(0026)  TCNT0 = 0x83;
    0235 E883      LDI	R24,0x83
    0236 BF82      OUT	P32,R24
(0027)  intTickCount++;
    0237 E041      LDI	R20,1
    0238 E050      LDI	R21,0
    0239 E060      LDI	R22,0
    023A E070      LDI	R23,0
    023B 90400068  LDS	R4,_intTickCount+2
    023D 90500069  LDS	R5,_intTickCount+3
    023F 90200066  LDS	R2,_intTickCount
    0241 90300067  LDS	R3,_intTickCount+1
    0243 0E24      ADD	R2,R20
    0244 1E35      ADC	R3,R21
    0245 1E46      ADC	R4,R22
    0246 1E57      ADC	R5,R23
    0247 92300067  STS	_intTickCount+1,R3
    0249 92200066  STS	_intTickCount,R2
    024B 92500069  STS	_intTickCount+3,R5
    024D 92400068  STS	_intTickCount+2,R4
(0028)  flag1ms = 1;	//1ms 时间到
    024F E081      LDI	R24,1
    0250 93800065  STS	_flag1ms,R24
(0029)  
(0030) /*
(0031)  if(adcCount<=SAMPLECOUNT-1 && adcCount>=0)
(0032)  	adcData[adcCount] = ADC & 0x3ff; //读取AD数据
(0033)  if(adcCount >= 0)
(0034)  {
(0035)     ADMUX = 0xc0 |(adcMux&0x0f); 
(0036)   	ADCSR |= 1 << ADSC; //启动ADC 
(0037)  	adcCount--;
(0038)  }
(0039) */  
(0040) }//void timer0_ovf_isr(void)
    0252 940E0627  CALL	pop_gset2
    0254 9029      LD	R2,Y+
    0255 BE2F      OUT	P3F,R2
    0256 91E9      LD	R30,Y+
    0257 91B9      LD	R27,Y+
    0258 91A9      LD	R26,Y+
    0259 9199      LD	R25,Y+
    025A 9189      LD	R24,Y+
    025B 9059      LD	R5,Y+
    025C 9049      LD	R4,Y+
    025D 9039      LD	R3,Y+
    025E 9029      LD	R2,Y+
    025F 9518      RETI
(0041) 
(0042) void timeProc(void)
(0043) {
(0044)  static uint16 second;
(0045)  static uint8 i;
(0046)  
(0047)  if(flag1ms == 1)
_timeProc:
    0260 91800065  LDS	R24,_flag1ms
    0262 3081      CPI	R24,1
    0263 F009      BEQ	0x0265
    0264 C052      RJMP	0x02B7
(0048)  {
(0049)   flag1ms = 0; 
    0265 2422      CLR	R2
    0266 92200065  STS	_flag1ms,R2
(0050)   CLI();
    0268 94F8      BCLR	7
(0051)   tickCount = intTickCount;
    0269 90400068  LDS	R4,_intTickCount+2
    026B 90500069  LDS	R5,_intTickCount+3
    026D 90200066  LDS	R2,_intTickCount
    026F 90300067  LDS	R3,_intTickCount+1
    0271 9230006B  STS	_tickCount+1,R3
    0273 9220006A  STS	_tickCount,R2
    0275 9250006D  STS	_tickCount+3,R5
    0277 9240006C  STS	_tickCount+2,R4
(0052)   SEI();
    0279 9478      BSET	7
(0053)   
(0054)    if(receTimeOut>0)
    027A 2422      CLR	R2
    027B 9030006F  LDS	R3,_receTimeOut
    027D 1423      CP	R2,R3
    027E F478      BCC	0x028E
(0055)    {
(0056)        receTimeOut--;
    027F 2D83      MOV	R24,R3
    0280 5081      SUBI	R24,1
    0281 9380006F  STS	_receTimeOut,R24
(0057)        if(receTimeOut==0 && receCount>0)   //判断通讯接收是否超时
    0283 2388      TST	R24
    0284 F449      BNE	0x028E
    0285 903000B2  LDS	R3,_receCount
    0287 1423      CP	R2,R3
    0288 F428      BCC	0x028E
(0058)        {
(0059)            receEnable();       //将485置为接收状态
    0289 98C7      CBI	P18,7
(0060)            receCount = 0;      //将接收地址偏移寄存器清零
    028A 922000B2  STS	_receCount,R2
(0061) 		   checkoutError = 0;
    028C 92200070  STS	_checkoutError,R2
(0062)        }
(0063)    }
(0064)   
(0065)   c200ms++;
    028E 91800064  LDS	R24,_c200ms
    0290 5F8F      SUBI	R24,0xFF
    0291 93800064  STS	_c200ms,R24
(0066)   if(c200ms > 100)
    0293 E684      LDI	R24,0x64
    0294 90200064  LDS	R2,_c200ms
    0296 1582      CP	R24,R2
    0297 F438      BCC	0x029F
(0067)   {
(0068)    c200ms = 0; 
    0298 2422      CLR	R2
    0299 92200064  STS	_c200ms,R2
(0069)    blinkLed(); //运行指示灯闪烁  
    029B E480      LDI	R24,0x40
    029C B228      IN	R2,P18
    029D 2628      EOR	R2,R24
    029E BA28      OUT	P18,R2
(0070)   }
(0071)   
(0072)   second++;
    029F 91800061  LDS	R24,0x61
    02A1 91900062  LDS	R25,0x62
    02A3 9601      ADIW	R24,1
    02A4 93900062  STS	0x62,R25
    02A6 93800061  STS	0x61,R24
(0073)   if(second > 10000)
    02A8 E180      LDI	R24,0x10
    02A9 E297      LDI	R25,0x27
    02AA 90200061  LDS	R2,0x61
    02AC 90300062  LDS	R3,0x62
    02AE 1582      CP	R24,R2
    02AF 0593      CPC	R25,R3
    02B0 F430      BCC	0x02B7
(0074)   { 
(0075)      second = 0;  
    02B1 2422      CLR	R2
    02B2 2433      CLR	R3
    02B3 92300062  STS	0x62,R3
    02B5 92200061  STS	0x61,R2
(0076)   } 
(0077)  }
(0078) }//void timeProc(void)
    02B7 9508      RET
(0079) 
(0080) void main(void)
(0081) {
(0082)  int16 i;
(0083)  
(0084)  varInit();

⌨️ 快捷键说明

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