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

📄 xmodem.lst

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0223) send_a_byte(ENTER);		                         //发送回车,测试模块
     7BE E00D      LDI	R16,0xD
     7BF D044      RCALL	_send_a_byte
(0224) Delay(500);
     7C0 EF04      LDI	R16,0xF4
     7C1 E011      LDI	R17,1
     7C2 D248      RCALL	_Delay
(0225) 
(0226) receive_OK = 0;
     7C3 2422      CLR	R2
     7C4 9220 021A STS	receive_OK,R2
(0227) send_m_byte("at\r\n",4);				//发送AT,测试模块
     7C6 E024      LDI	R18,4
     7C7 E030      LDI	R19,0
     7C8 E206      LDI	R16,0x26
     7C9 E011      LDI	R17,1
     7CA D03D      RCALL	_send_m_byte
(0228) send_a_byte(ENTER);
     7CB E00D      LDI	R16,0xD
     7CC D037      RCALL	_send_a_byte
     7CD C005      RJMP	0x07D3
(0229) 
(0230) while(receive_OK== 0)
(0231) {
(0232) send_a_byte(ENTER);
     7CE E00D      LDI	R16,0xD
     7CF D034      RCALL	_send_a_byte
(0233) Delay(1000);
     7D0 EE08      LDI	R16,0xE8
     7D1 E013      LDI	R17,3
     7D2 D238      RCALL	_Delay
     7D3 9020 021A LDS	R2,receive_OK
     7D5 2022      TST	R2
     7D6 F3B9      BEQ	0x07CE
(0234) }
(0235) receive_RING=0;
     7D7 2422      CLR	R2
     7D8 9220 0212 STS	receive_RING,R2
(0236) receive_CLIP=0;
     7DA 9220 0211 STS	receive_CLIP,R2
     7DC C025      RJMP	0x0802
(0237) while(1)
(0238) { 
(0239) Delay(10);
     7DD E00A      LDI	R16,0xA
     7DE E010      LDI	R17,0
     7DF D22B      RCALL	_Delay
     7E0 C019      RJMP	0x07FA
(0240) 
(0241)  while((receive_RING==1)&&(receive_CLIP==1))
(0242)  {			Delay(10);
     7E1 E00A      LDI	R16,0xA
     7E2 E010      LDI	R17,0
     7E3 D227      RCALL	_Delay
(0243) 	
(0244) 			receive_OK = 0;
     7E4 2422      CLR	R2
     7E5 9220 021A STS	receive_OK,R2
(0245)  			send_m_byte("ath\r\n",5);
     7E7 E025      LDI	R18,5
     7E8 E030      LDI	R19,0
     7E9 E200      LDI	R16,0x20
     7EA E011      LDI	R17,1
     7EB D01C      RCALL	_send_m_byte
(0246) 			while(receive_OK == 0) ;
     7EC 9020 021A LDS	R2,receive_OK
     7EE 2022      TST	R2
     7EF F3E1      BEQ	0x07EC
(0247)   			Xmodem();
     7F0 D2BD      RCALL	_Xmodem
(0248) 			
(0249) 			Delay(10);
     7F1 E00A      LDI	R16,0xA
     7F2 E010      LDI	R17,0
     7F3 D217      RCALL	_Delay
(0250) 			mms_atsent();
     7F4 D233      RCALL	_mms_atsent
(0251) 			
(0252) 			receive_RING=0;
     7F5 2422      CLR	R2
     7F6 9220 0212 STS	receive_RING,R2
(0253) 			receive_CLIP=0;
     7F8 9220 0211 STS	receive_CLIP,R2
     7FA 9180 0212 LDS	R24,receive_RING
     7FC 3081      CPI	R24,1
     7FD F421      BNE	0x0802
     7FE 9180 0211 LDS	R24,receive_CLIP
     800 3081      CPI	R24,1
     801 F2F9      BEQ	0x07E1
     802 CFDA      RJMP	0x07DD
     803 9508      RET
(0254)  }
(0255) }
(0256) 
(0257) 
(0258) 				
(0259) }
(0260) 
(0261) 
(0262) 
(0263) 
(0264) void send_a_byte( unsigned char data )
(0265) {
(0266) /* 等待发送缓冲器为空 */
(0267) while ( !( UCSRA & (1<<UDRE)) )
_send_a_byte:
  data                 --> R16
     804 9B5D      SBIS	0x0B,5
     805 CFFE      RJMP	_send_a_byte
(0268) ;
(0269) /* 将数据放入缓冲器,发送数据 */
(0270) UDR = data;
     806 B90C      OUT	0x0C,R16
     807 9508      RET
_send_m_byte:
  i                    --> R20
  length               --> R10
  string               --> R12
     808 940E 0B45 CALL	push_xgset303C
     80A 0159      MOVW	R10,R18
     80B 0168      MOVW	R12,R16
(0271) }
(0272) /*unsigned char USART_Receive( void )
(0273) {
(0274) //等待接收数据
(0275) while ( !(UCSRA & (1<<RXC)) )
(0276) ;
(0277) // 从缓冲器中获取并返回数据
(0278) return UDR;
(0279) }*/
(0280) 
(0281) void send_m_byte(uchar *string, uint length)
(0282) {
(0283) 	uint i;                                                    //发送多字节
(0284) 	for(i = 0; i< length; i++)
     80C 2744      CLR	R20
     80D 2755      CLR	R21
     80E C007      RJMP	0x0816
(0285) 	{
(0286) 		send_a_byte(string[i]);
     80F 01FA      MOVW	R30,R20
     810 0DEC      ADD	R30,R12
     811 1DFD      ADC	R31,R13
     812 8100      LDD	R16,Z+0
     813 DFF0      RCALL	_send_a_byte
     814 5F4F      SUBI	R20,0xFF
     815 4F5F      SBCI	R21,0xFF
     816 154A      CP	R20,R10
     817 055B      CPC	R21,R11
     818 F3B0      BCS	0x080F
     819 940C 0B4C JMP	pop_xgset303C
(0287) 	}
(0288) }
(0289) 
(0290) uchar xModemSend(uchar *temp_data, uint length)
(0291) {
(0292) 	*temp_data = 0;
_xModemSend:
  length               --> R18
  temp_data            --> R16
     81B 2422      CLR	R2
     81C 01F8      MOVW	R30,R16
     81D 8220      STD	Z+0,R2
(0293) 	 length = 0;
     81E 2722      CLR	R18
     81F 2733      CLR	R19
(0294)      return 0;
     820 2700      CLR	R16
     821 9508      RET
_tx_packet:
  attempt              --> R22
  checksum             --> R14
  buffer_index         --> R12
  temp_char            --> R20
  packet_data_buffer   --> R10
  packet_number        --> Y,+10
     822 940E 0B2A CALL	push_arg4
     824 940E 0B3A CALL	push_xgsetF0FC
     826 0159      MOVW	R10,R18
     827 854E      LDD	R20,Y+14
(0295) }
(0296) 
(0297) 
(0298) //                     信息包序号                  包里面的数据     收接收方反回来的信息
(0299) uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
(0300) {
(0301) 	uchar attempt;
(0302) 	uint checksum;
(0303) 	uchar buffer_index;
(0304)     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
     828 E061      LDI	R22,1
     829 C046      RJMP	0x0870
(0305)     {
(0306)         checksum= 0;                          //校验和为0
     82A 24EE      CLR	R14
     82B 24FF      CLR	R15
(0307)         send_a_byte(SOH);                     // send start of packet(sending标志中断发送)
     82C E001      LDI	R16,1
     82D DFD6      RCALL	_send_a_byte
(0308)         send_a_byte(packet_number);           //发送信息包序号
     82E 850A      LDD	R16,Y+10
     82F DFD4      RCALL	_send_a_byte
(0309)         send_a_byte(255 - packet_number);     //发送信息包序号的补码
     830 842A      LDD	R2,Y+10
     831 2433      CLR	R3
     832 EF0F      LDI	R16,0xFF
     833 1902      SUB	R16,R2
     834 0913      SBC	R17,R3
     835 DFCE      RCALL	_send_a_byte
(0310)         //以下为发送数据
(0311)         for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
     836 24CC      CLR	R12
     837 C01A      RJMP	0x0852
(0312)         {
(0313)             send_a_byte(packet_data_buffer[buffer_index]); //发送128个字节
     838 2DEC      MOV	R30,R12
     839 27FF      CLR	R31
     83A 0DEA      ADD	R30,R10
     83B 1DFB      ADC	R31,R11
     83C 8100      LDD	R16,Z+0
     83D DFC6      RCALL	_send_a_byte
(0314)             if (temp_char == NAK) //接收方返回NAK则发送方要得传
     83E 3145      CPI	R20,0x15
     83F F449      BNE	0x0849
(0315) 		  	checksum += packet_data_buffer[buffer_index]; //计算校验和
     840 2DEC      MOV	R30,R12
     841 27FF      CLR	R31
     842 0DEA      ADD	R30,R10
     843 1DFB      ADC	R31,R11
     844 8020      LDD	R2,Z+0
     845 2433      CLR	R3
     846 0CE2      ADD	R14,R2
     847 1CF3      ADC	R15,R3
     848 C008      RJMP	0x0851
(0316)             else
(0317)             checksum = update_CRC(packet_data_buffer[buffer_index], checksum); //CRC校验和
     849 0197      MOVW	R18,R14
     84A 2DEC      MOV	R30,R12
     84B 27FF      CLR	R31
     84C 0DEA      ADD	R30,R10
     84D 1DFB      ADC	R31,R11
     84E 8100      LDD	R16,Z+0
     84F D159      RCALL	_update_CRC
     850 0178      MOVW	R14,R16
     851 94C3      INC	R12
     852 2D8C      MOV	R24,R12
     853 3880      CPI	R24,0x80
     854 F318      BCS	0x0838
(0318)         }
(0319)         if (temp_char == ASCII_C) //如果收到C
     855 3443      CPI	R20,0x43
     856 F441      BNE	0x085F
(0320) 		  {  send_a_byte((uchar)((checksum>>8) & 0x00ff));
     857 0187      MOVW	R16,R14
     858 2F01      MOV	R16,R17
     859 2711      CLR	R17
     85A 7010      ANDI	R17,0
     85B DFA8      RCALL	_send_a_byte
(0321)              send_a_byte((uchar)(checksum & 0x00ff)); 
     85C 2D0E      MOV	R16,R14
     85D 7010      ANDI	R17,0
     85E DFA5      RCALL	_send_a_byte
(0322) 			 }  // send end of packet CRC
(0323) 			 temp_char0=0;
     85F 2422      CLR	R2
     860 9220 0094 STS	temp_char0,R2
(0324) 			 while(temp_char0 == 0);
     862 9020 0094 LDS	R2,temp_char0
     864 2022      TST	R2
     865 F3E1      BEQ	0x0862
(0325)         temp_char =temp_char0;         // get receiver response
     866 2D42      MOV	R20,R2
(0326) 
(0327) 		if (temp_char == CAN)
     867 3148      CPI	R20,0x18
     868 F411      BNE	0x086B
(0328)           return 0;  // reception cancelled
     869 2700      CLR	R16
     86A C00A      RJMP	0x0875
(0329)         if (temp_char == ACK)
     86B 3046      CPI	R20,6
     86C F411      BNE	0x086F
(0330)           return 1;  // packet received okay
     86D E001      LDI	R16,1
     86E C006      RJMP	0x0875
     86F 9563      INC	R22
     870 E083      LDI	R24,3
     871 1786      CP	R24,R22
     872 F008      BCS	0x0874
     873 CFB6      RJMP	0x082A
(0331)     }
(0332)     return 0;                             // attempts exhausted
     874 2700      CLR	R16
     875 940E 0B2F CALL	pop_xgsetF0FC
     877 9624      ADIW	R28,4
     878 9508      RET
_send_packet_data:
  no_more              --> R10
  Xmodem_Pack22        --> Y,+1
  packet_number        --> R20
  temp_char            --> R10
  j                    --> Y,+132
  xModem               --> R22
  i                    --> R12
  LEN                  --> Y,+146
  User_Data            --> Y,+144
     879 940E 0B2A CALL	push_arg4
     87B 940E 0B3A CALL	push_xgsetF0FC
     87D 97EF      SBIW	R28,0x3F
     87E 97EF      SBIW	R28,0x3F
     87F 9728      SBIW	R28,0x8
(0333) }
(0334) 
(0335) /*
(0336) function: 以XMODEM 发送数据
(0337) in:  user_data  是数据指针
(0338) out: 1    sucess
(0339)        o    faile
(0340) 使用全局变量? 无
(0341) 
(0342) */
(0343) 
(0344) uchar send_packet_data(uchar const *User_Data , uint LEN)
(0345) {
(0346)     struct  Message   Xmodem_Pack22;
(0347) 	struct  Message   *xModem;
(0348) 
(0349)     uint i,j=0;
     880 2400      CLR	R0
     881 2411      CLR	R1
     882 01FE      MOVW	R30,R28
     883 57EC      SUBI	R30,0x7C
     884 4FFF      SBCI	R31,0xFF
     885 8211      STD	Z+1,R1
     886 8200      STD	Z+0,R0
(0350)     unsigned char packet_number = 1;
     887 E041      LDI	R20,1
(0351)     unsigned char no_more = 0;
     888 24AA      CLR	R10
(0352)     unsigned char temp_char = 0;
(0353)     xModem=&Xmodem_Pack22;
     889 01BE      MOVW	R22,R28
     88A 5F6F      SUBI	R22,0xFF
     88B 4F7F      SBCI	R23,0xFF
(0354) 	xModem->User_Data=0;
     88C 2422      CLR	R2
     88D 2433      CLR	R3
     88E 01FB      MOVW	R30,R22
     88F 57EF      SUBI	R30,0x7F
     890 4FFF      SBCI	R31,0xFF
     891 8231      STD	Z+1,R3
     892 8220      STD	Z+0,R2
     893 C007      RJMP	0x089B
(0355)  //	xModem->User_Data=User_Data;
(0356)   //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
(0357)     while((temp_char != ASCII_C) && (temp_char != NAK))
(0358) 	{				 
(0359) 		  temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
     894 90A0 0094 LDS	R10,temp_char0
(0360) 		  if(temp_char == CAN)
     896 2D8A      MOV	R24,R10
     897 3188      CPI	R24,0x18
     898 F411      BNE	0x089B
(0361) 		  return 0;
     899 2700      CLR	R16
     89A C0F0      RJMP	0x098B
     89B 2D8A      MOV	R24,R10
     89C 3483      CPI	R24,0x43
     89D F011      BEQ	0x08A0
     89E 3185      CPI	R24,0x15
     89F F7A1      BNE	0x0894
(0362)     }
(0363) 
(0364) 	if (LEN < PACKET_DATA_BUFFER_LENGTH)   // 数据区段的长度固定为 128 字节
     8A0 01FE      MOVW	R30,R28
     8A1 56EE      SUBI	R30,0x6E
     8A2 4FFF      SBCI	R31,0xFF
     8A3 8180      LDD	R24,Z+0
     8A4 8191      LDD	R25,Z+1
     8A5 3880      CPI	R24,0x80
     8A6 E0E0      LDI	R30,0
     8A7 079E      CPC	R25,R30
     8A8 F008      BCS	0x08AA
     8A9 C045      RJMP	0x08EF
(0365) 	{
(0366)          for(i=0;i<LEN;i++)
     8AA 24CC      CLR	R12
     8AB 24DD      CLR	R13
     8AC C01E      RJMP	0x08CB
(0367)             xModem->Message[i]=(User_Data[j++]);
     8AD 01FE      MOVW	R30,R28
     8AE 57EC      SUBI	R30,0x7C
     8AF 4FFF      SBCI	R31,0xFF
     8B0 8020      LDD	R2,Z+0
     8B1 8031      LDD	R3,Z+1
     8B2 01C1      MOVW	R24,R2
     8B3 9601      ADIW	R24,1
     8B4 01FE      MOVW	R30,R28
     8B5 57EC      SUBI	R30,0x7C
     8B6 4FFF      SBCI	R31,0xFF
     8B7 8391      STD	Z+1,R25
     8B8 8380      STD	Z+0,R24
     8B9 01F1      MOVW	R30,R2
     8BA 01DE      MOVW	R26,R28
     8BB 57A0      SUBI	R26,0x70
     8BC 4FBF      SBCI	R27,0xFF
     8BD 900D      LD	R0,X+
     8BE 901C      LD	R1,255(X)
     8BF 0DE0      ADD	R30,R0
     8C0 1DF1      ADC	R31,R1
     8C1 9024      LPM	R2,255(Z)
     8C2 01CB      MOVW	R24,R22
     8C3 9601      ADIW	R24,1
     8C4 01F6      MOVW	R30,R12
     8C5 0FE8      ADD	R30,R24
     8C6 1FF9      ADC	R31,R25
     8C7 8220      STD	Z+0,R2
     8C8 01C6      MOVW	R24,R12
     8C9 9601      ADIW	R24,1
     8CA 016C      MOVW	R12,R24
     8CB 01FE      MOVW	R30,R28
     8CC 56EE      SUBI	R30,0x6E
     8CD 4FFF      SBCI	R31,0xFF
     8CE 8000      LDD	R0,Z+0
     8CF 8011      LDD	R1,Z+1
     8D0 14C0      CP	R12,R0
     8D1 04D1      CPC	R13,R1
     8D2 F2D0      BCS	0x08AD
(0368) 		 for(i=LEN;i<128;i++)
     8D3 0160      MOVW	R12,R0
     8D4 C00A      RJMP	0x08DF
(0369)             xModem->Message[i]=CTRL_Z;
     8D5 01CB      MOVW	R24,R22
     8D6 9601      ADIW	R24,1

⌨️ 快捷键说明

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