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

📄 jk0061119.lst

📁 Modbus RTU 的C语言程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0073) #pragma interrupt_handler timer0_ovf_isr:18
(0074) void timer0_ovf_isr(void)
(0075) {
(0076)  TCNT0= 0xA3; //set count
    0303 EA83      LDI	R24,0xA3
    0304 BF82      OUT	0x32,R24
(0077)  if(Time0_Ovf_com0_ProgramBranch==0)
    0305 90200100  LDS	R2,0x100
    0307 2022      TST	R2
    0308 F421      BNE	0x030D
(0078) 	Com0_R_Cout=0;   
    0309 2422      CLR	R2
    030A 92200101  STS	0x101,R2
    030C C00D      RJMP	0x031A
(0079)  else
(0080)    {
(0081) 	  Com0_R_Complete=1;
    030D E081      LDI	R24,1
    030E 93800102  STS	0x102,R24
(0082) 	  Com0_R_CRCcouter=Com0_R_Cout-2;
    0310 91800101  LDS	R24,0x101
    0312 5082      SUBI	R24,2
    0313 9380037C  STS	_Com0_R_CRCcouter,R24
(0083) 	  UCSR0B = 0xC8;///close the receiveing  interrupt
    0315 EC88      LDI	R24,0xC8
    0316 B98A      OUT	0x0A,R24
(0084) 	  Time0_Ovf_com0_ProgramBranch=0;
    0317 2422      CLR	R2
    0318 92200100  STS	0x100,R2
(0085) 	}
(0086) }
    031A 9029      LD	R2,Y+
    031B BE2F      OUT	0x3F,R2
    031C 9189      LD	R24,Y+
    031D 9029      LD	R2,Y+
    031E 9518      RETI
(0087) //UART0 initialisation
(0088) // desired baud rate: 9600
(0089) // actual: baud rate:9600 (0.0%)
(0090) // char size: 8 bit
(0091) // parity: Disabled
(0092) void uart0_init(void)
(0093) {
(0094)  UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
    031F 2422      CLR	R2
    0320 B82A      OUT	0x0A,R2
(0095)  UCSR0A = 0x00; //disable while setting baud rate
    0321 B82B      OUT	0x0B,R2
(0096)  UBRR0L  =0x2F; //set baud rate
    0322 E28F      LDI	R24,0x2F
    0323 B989      OUT	0x09,R24
(0097)  UBRR0H = 0x00;
    0324 BC20      OUT	0x20,R2
(0098)  UCSR0C = 0x86;
    0325 E886      LDI	R24,0x86
    0326 BD80      OUT	0x20,R24
(0099)  UCSR0A = 0x00; //enable
    0327 B82B      OUT	0x0B,R2
(0100)  UCSR0B = 0xD8; //enable
    0328 ED88      LDI	R24,0xD8
    0329 B98A      OUT	0x0A,R24
(0101) }
    032A 9508      RET
_uart0_rx_isr:
    032B 922A      ST	R2,-Y
    032C 923A      ST	R3,-Y
    032D 938A      ST	R24,-Y
    032E 939A      ST	R25,-Y
    032F 93EA      ST	R30,-Y
    0330 93FA      ST	R31,-Y
    0331 B62F      IN	R2,0x3F
    0332 922A      ST	R2,-Y
(0102) 
(0103) #pragma interrupt_handler uart0_rx_isr:20
(0104) void uart0_rx_isr(void)
(0105) {
(0106)  //uart has received a character in UDR
(0107)    Com0_R_Data[Com0_R_Cout]=UDR0;
    0333 E688      LDI	R24,0x68
    0334 E093      LDI	R25,3
    0335 91E00101  LDS	R30,0x101
    0337 27FF      CLR	R31
    0338 0FE8      ADD	R30,R24
    0339 1FF9      ADC	R31,R25
    033A B02C      IN	R2,0x0C
    033B 8220      STD	Z+0,R2
(0108) 	   if(Com0_R_Data[0]==Com0_S_Data[0])
    033C 9020032C  LDS	R2,_Com0_S_Data
    033E 90300368  LDS	R3,_Com0_R_Data
    0340 1432      CP	R3,R2
    0341 F459      BNE	0x034D
(0109) 	     {
(0110) 		   if(Com0_R_Cout<18)
    0342 91800101  LDS	R24,0x101
    0344 3182      CPI	R24,0x12
    0345 F418      BCC	0x0349
(0111) 	          Com0_R_Cout++;
    0346 5F8F      SUBI	R24,0xFF
    0347 93800101  STS	0x101,R24
(0112) 	       Time0_Ovf_com0_ProgramBranch=1;
    0349 E081      LDI	R24,1
    034A 93800100  STS	0x100,R24
(0113) 	      }	 
    034C C006      RJMP	0x0353
(0114)        else
(0115)         { 
(0116) 	       Com0_R_Cout=1;
    034D E081      LDI	R24,1
    034E 93800101  STS	0x101,R24
(0117) 	       Time0_Ovf_com0_ProgramBranch=0;
    0350 2422      CLR	R2
    0351 92200100  STS	0x100,R2
(0118) 	     }   
(0119)      TCNT0=0xB9; 
    0353 EB89      LDI	R24,0xB9
    0354 BF82      OUT	0x32,R24
(0120) }
    0355 9029      LD	R2,Y+
    0356 BE2F      OUT	0x3F,R2
    0357 91F9      LD	R31,Y+
    0358 91E9      LD	R30,Y+
    0359 9199      LD	R25,Y+
    035A 9189      LD	R24,Y+
    035B 9039      LD	R3,Y+
    035C 9029      LD	R2,Y+
    035D 9518      RETI
_uart0_tx_isr:
    035E 922A      ST	R2,-Y
    035F 938A      ST	R24,-Y
    0360 939A      ST	R25,-Y
    0361 93EA      ST	R30,-Y
    0362 93FA      ST	R31,-Y
    0363 B62F      IN	R2,0x3F
    0364 922A      ST	R2,-Y
(0121) 
(0122) #pragma interrupt_handler uart0_tx_isr:24
(0123) void uart0_tx_isr(void)
(0124) {
(0125)  //character has been transmitted
(0126)    Com0_S_Pointer++;
    0365 91800329  LDS	R24,_Com0_S_Pointer
    0367 9190032A  LDS	R25,_Com0_S_Pointer+1
    0369 9601      ADIW	R24,1
    036A 9390032A  STS	_Com0_S_Pointer+1,R25
    036C 93800329  STS	_Com0_S_Pointer,R24
(0127)    Com0_S_DataByte=Com0_S_DataByte-1;
    036E 9180032B  LDS	R24,_Com0_S_DataByte
    0370 5081      SUBI	R24,1
    0371 9380032B  STS	_Com0_S_DataByte,R24
(0128)    if(Com0_S_DataByte>0)
    0373 2422      CLR	R2
    0374 1628      CP	R2,R24
    0375 F430      BCC	0x037C
(0129)       UDR0=*Com0_S_Pointer;
    0376 91E00329  LDS	R30,_Com0_S_Pointer
    0378 91F0032A  LDS	R31,_Com0_S_Pointer+1
    037A 8020      LDD	R2,Z+0
    037B B82C      OUT	0x0C,R2
(0130) }
    037C 9029      LD	R2,Y+
    037D BE2F      OUT	0x3F,R2
    037E 91F9      LD	R31,Y+
    037F 91E9      LD	R30,Y+
    0380 9199      LD	R25,Y+
    0381 9189      LD	R24,Y+
    0382 9029      LD	R2,Y+
    0383 9518      RETI
_Modbus_Function_1:
  b                    --> R22
  c                    --> R10
  a                    --> R12
  i                    --> R14
  temp                 --> R20
  Ptr_send             --> R6
  Ptr_receive          --> R8
    0384 940E1C0A  CALL	push_gset5
    0386 0139      MOVW	R6,R18
    0387 0148      MOVW	R8,R16
(0131) ///////////////////////////////////////////////////////////////
(0132) char  Modbus_Function_1(char *Ptr_receive,char *Ptr_send)
(0133) {
(0134)    unsigned char  a, b,c,i;
(0135)     unsigned int temp;
(0136)     Ptr_send[1]=0x01;
    0388 E081      LDI	R24,1
    0389 01F3      MOVW	R30,R6
    038A 8381      STD	Z+1,R24
(0137) 	if((Ptr_receive[2]==0)&&(Ptr_receive[3]<=32))
    038B 01F4      MOVW	R30,R8
    038C 8022      LDD	R2,Z+2
    038D 2022      TST	R2
    038E F009      BEQ	0x0390
    038F C094      RJMP	0x0424
    0390 E280      LDI	R24,0x20
    0391 01F4      MOVW	R30,R8
    0392 8023      LDD	R2,Z+3
    0393 1582      CP	R24,R2
    0394 F408      BCC	0x0396
    0395 C08E      RJMP	0x0424
(0138) 	   {
(0139) 		  if(Ptr_receive[3]+Ptr_receive[5]<=32) 
    0396 01F4      MOVW	R30,R8
    0397 8025      LDD	R2,Z+5
    0398 01F4      MOVW	R30,R8
    0399 8033      LDD	R3,Z+3
    039A 0C32      ADD	R3,R2
    039B 1583      CP	R24,R3
    039C F408      BCC	0x039E
    039D C079      RJMP	0x0417
(0140) 		    {
(0141) 			    a=Ptr_receive[3]>>3;
    039E 01F4      MOVW	R30,R8
    039F 80C3      LDD	R12,Z+3
    03A0 94C6      LSR	R12
    03A1 94C6      LSR	R12
    03A2 94C6      LSR	R12
(0142) 				b=Ptr_receive[3]&0x07;
    03A3 01F4      MOVW	R30,R8
    03A4 8163      LDD	R22,Z+3
    03A5 7067      ANDI	R22,7
(0143) 				c=Ptr_receive[5]+b;
    03A6 01F4      MOVW	R30,R8
    03A7 80A5      LDD	R10,Z+5
    03A8 0EA6      ADD	R10,R22
(0144) 				//Com0_S_DataByte=4+(Com0_R_Data[5]>>3);
(0145) 				Ptr_send[2]=Ptr_receive[5]>>3;
    03A9 01F4      MOVW	R30,R8
    03AA 8025      LDD	R2,Z+5
    03AB 9426      LSR	R2
    03AC 9426      LSR	R2
    03AD 9426      LSR	R2
    03AE 01F3      MOVW	R30,R6
    03AF 8222      STD	Z+2,R2
(0146) 				if(Ptr_receive[5]&0x07)
    03B0 01F4      MOVW	R30,R8
    03B1 8185      LDD	R24,Z+5
    03B2 7087      ANDI	R24,7
    03B3 F031      BEQ	0x03BA
(0147) 				   Ptr_send[2]+=1;
    03B4 01C3      MOVW	R24,R6
    03B5 9602      ADIW	R24,2
    03B6 01FC      MOVW	R30,R24
    03B7 8180      LDD	R24,Z+0
    03B8 5F8F      SUBI	R24,0xFF
    03B9 8380      STD	Z+0,R24
(0148) 				
(0149) 				//Com0_S_DataByte=Com0_S_Data[2]+3;
(0150) 				if(c&0x07)
    03BA 2D8A      MOV	R24,R10
    03BB 7087      ANDI	R24,7
    03BC F039      BEQ	0x03C4
(0151) 				 c=(c>>3)+1;
    03BD 2D8A      MOV	R24,R10
    03BE 9586      LSR	R24
    03BF 9586      LSR	R24
    03C0 9586      LSR	R24
    03C1 5F8F      SUBI	R24,0xFF
    03C2 2EA8      MOV	R10,R24
    03C3 C003      RJMP	0x03C7
(0152) 				 else
(0153) 				 c=c>>3;
    03C4 94A6      LSR	R10
    03C5 94A6      LSR	R10
    03C6 94A6      LSR	R10
(0154) 				for(i=0;i<c;i++)
    03C7 24EE      CLR	R14
    03C8 C021      RJMP	0x03EA
(0155) 				  {
(0156) 				      temp=JK_IO[a];
    03C9 E282      LDI	R24,0x22
    03CA E091      LDI	R25,1
    03CB 2DEC      MOV	R30,R12
    03CC 27FF      CLR	R31
    03CD 0FE8      ADD	R30,R24
    03CE 1FF9      ADC	R31,R25
    03CF 8140      LDD	R20,Z+0
    03D0 2755      CLR	R21
(0157) 					  a++;
    03D1 94C3      INC	R12
(0158) 					  temp+=(JK_IO[a]<<8);
    03D2 2DEC      MOV	R30,R12
    03D3 27FF      CLR	R31
    03D4 0FE8      ADD	R30,R24
    03D5 1FF9      ADC	R31,R25
    03D6 8020      LDD	R2,Z+0
    03D7 2433      CLR	R3
    03D8 2C32      MOV	R3,R2
    03D9 2422      CLR	R2
    03DA 0D42      ADD	R20,R2
    03DB 1D53      ADC	R21,R3
(0159) 					  temp>>=b;
    03DC 2F26      MOV	R18,R22
    03DD 2733      CLR	R19
    03DE 018A      MOVW	R16,R20
    03DF 940E1C56  CALL	lsr16
    03E1 01A8      MOVW	R20,R16
(0160) 					  Ptr_send[i+3]=temp&0xff;
    03E2 2DEE      MOV	R30,R14
    03E3 27FF      CLR	R31
    03E4 0DE6      ADD	R30,R6
    03E5 1DF7      ADC	R31,R7
    03E6 01CA      MOVW	R24,R20
    03E7 7090      ANDI	R25,0
    03E8 8383      STD	Z+3,R24
    03E9 94E3      INC	R14
    03EA 14EA      CP	R14,R10
    03EB F2E8      BCS	0x03C9
(0161) 				   }
(0162) 				 Ptr_send[i+3]=temp>>8;
    03EC 2DEE      MOV	R30,R14
    03ED 27FF      CLR	R31
    03EE 0DE6      ADD	R30,R6
    03EF 1DF7      ADC	R31,R7
    03F0 011A      MOVW	R2,R20
    03F1 2C23      MOV	R2,R3
    03F2 2433      CLR	R3
    03F3 8223      STD	Z+3,R2
(0163) 				 Ptr_send[i+3]<<=(8-Ptr_receive[5]&0x07);
    03F4 2D8E      MOV	R24,R14
    03F5 2799      CLR	R25
    03F6 0D86      ADD	R24,R6
    03F7 1D97      ADC	R25,R7
    03F8 9603      ADIW	R24,3
    03F9 011C      MOVW	R2,R24
    03FA 01F4      MOVW	R30,R8
    03FB 8045      LDD	R4,Z+5
    03FC E018      LDI	R17,0x8
    03FD 1914      SUB	R17,R4
    03FE 7017      ANDI	R17,7
    03FF 01FC      MOVW	R30,R24
    0400 8100      LDD	R16,Z+0
    0401 940E1C50  CALL	lsl8
    0403 01F1      MOVW	R30,R2
    0404 8300      STD	Z+0,R16
(0164) 				 Ptr_send[i+3]>>=(8-Ptr_receive[5]&0x07);
    0405 2D8E      MOV	R24,R14
    0406 2799      CLR	R25
    0407 0D86      ADD	R24,R6
    0408 1D97      ADC	R25,R7
    0409 9603      ADIW	R24,3
    040A 011C      MOVW	R2,R24
    040B 01F4      MOVW	R30,R8
    040C 8045      LDD	R4,Z+5
    040D E018      LDI	R17,0x8
    040E 1914      SUB	R17,R4
    040F 7017      ANDI	R17,7
    0410 01FC      MOVW	R30,R24
    0411 8100      LDD	R16,Z+0
    0412 940E1C5D  CALL	lsr8
    0414 01F1      MOVW	R30,R2
    0415 8300      STD	Z+0,R16
(0165) 			 }
    0416 C018      RJMP	0x042F
(0166) 		   else
(0167) 		    {////show   error!
(0168) 		     Ptr_send[1]=0xFF;
    0417 EF8F      LDI	R24,0xFF
    0418 01F3      MOVW	R30,R6
    0419 8381      STD	Z+1,R24
(0169) 		     Ptr_send[2]=2;
    041A E082      LDI	R24,2
    041B 01F3      MOVW	R30,R6
    041C 8382      STD	Z+2,R24
(0170) 			 Ptr_send[3]=0x00;
    041D 2422      CLR	R2
    041E 01F3      MOVW	R30,R6
    041F 8223      STD	Z+3,R2
(0171) 			 Ptr_send[4]=0x01;
    0420 E081      LDI	R24,1
    0421 01F3      MOVW	R30,R6
    0422 8384      STD	Z+4,R24
(0172) 		    }
(0173) 		}
    0423 C00B      RJMP	0x042F
(0174) 	 else
(0175) 	  {////show   error!
(0176) 	     Ptr_send[1]=0xFF;
    0424 EF8F      LDI	R24,0xFF
    0425 01F3      MOVW	R30,R6
    0426 8381      STD	Z+1,R24
(0177) 	     Ptr_send[2]=2;
    0427 E082      LDI	R24,2
    0428 01F3      MOVW	R30,R6
    0429 8382      STD	Z+2,R24
(0178) 		 Ptr_send[3]=0x00;
    042A 2422      CLR	R2
    042B 01F3      MOVW	R30,R6
    042C 8223      STD	Z+3,R2
(0179) 		 Ptr_send[4]=0x02; 
    042D 01F3      MOVW	R30,R6
    042E 8384      STD	Z+4,R24

⌨️ 快捷键说明

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