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

📄 m16_xmodem.s

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 S
📖 第 1 页 / 共 5 页
字号:
; 
; void send_a_byte( unsigned char data )
; {
L53:
	.dbline 268
; /* 等待发送缓冲器为空 */
; while ( !( UCSRA & (1<<UDRE)) )
; ;
L54:
	.dbline 267
	sbis 0xb,5
	rjmp L53
X16:
	.dbline 270
; /* 将数据放入缓冲器,发送数据 */
; UDR = data;
	out 0xc,R16
	.dbline -2
L52:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.dbfunc e send_m_byte _send_m_byte fV
;              i -> R20,R21
;         length -> R10,R11
;         string -> R12,R13
	.even
_send_m_byte::
	xcall push_xgset303C
	movw R10,R18
	movw R12,R16
	.dbline -1
	.dbline 282
; }
; /*unsigned char USART_Receive( void )
; {
; //等待接收数据
; while ( !(UCSRA & (1<<RXC)) )
; ;
; // 从缓冲器中获取并返回数据
; return UDR;
; }*/
; 
; void send_m_byte(uchar *string, uint length)
; {
	.dbline 284
; 	uint i;                                                    //发送多字节
; 	for(i = 0; i< length; i++)
	clr R20
	clr R21
	xjmp L60
L57:
	.dbline 285
; 	{
	.dbline 286
; 		send_a_byte(string[i]);
	movw R30,R20
	add R30,R12
	adc R31,R13
	ldd R16,z+0
	xcall _send_a_byte
	.dbline 287
; 	}
L58:
	.dbline 284
	subi R20,255  ; offset = 1
	sbci R21,255
L60:
	.dbline 284
	cp R20,R10
	cpc R21,R11
	brlo L57
X17:
	.dbline -2
L56:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.dbsym r i 20 i
	.dbsym r length 10 i
	.dbsym r string 12 pc
	.dbend
	.dbfunc e xModemSend _xModemSend fc
;         length -> R18,R19
;      temp_data -> R16,R17
	.even
_xModemSend::
	.dbline -1
	.dbline 291
; }
; 
; uchar xModemSend(uchar *temp_data, uint length)
; {
	.dbline 292
; 	*temp_data = 0;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 293
; 	 length = 0;
	clr R18
	clr R19
	.dbline 294
;      return 0;
	clr R16
	.dbline -2
L61:
	.dbline 0 ; func end
	ret
	.dbsym r length 18 i
	.dbsym r temp_data 16 pc
	.dbend
	.dbfunc e tx_packet _tx_packet fc
;        attempt -> R22
;       checksum -> R14,R15
;   buffer_index -> R12
;      temp_char -> R20
; packet_data_buffer -> R10,R11
;  packet_number -> y+10
	.even
_tx_packet::
	xcall push_arg4
	xcall push_xgsetF0FC
	movw R10,R18
	ldd R20,y+14
	.dbline -1
	.dbline 300
; }
; 
; 
; //                     信息包序号                  包里面的数据     收接收方反回来的信息
; uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
; {
	.dbline 304
; 	uchar attempt;
; 	uint checksum;
; 	uchar buffer_index;
;     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
	ldi R22,1
	xjmp L66
L63:
	.dbline 305
;     {
	.dbline 306
;         checksum= 0;                          //校验和为0
	clr R14
	clr R15
	.dbline 307
;         send_a_byte(SOH);                     // send start of packet(sending标志中断发送)
	ldi R16,1
	xcall _send_a_byte
	.dbline 308
;         send_a_byte(packet_number);           //发送信息包序号
	ldd R16,y+10
	xcall _send_a_byte
	.dbline 309
;         send_a_byte(255 - packet_number);     //发送信息包序号的补码
	ldd R2,y+10
	clr R3
	ldi R16,255
	sub R16,R2
	sbc R17,R3
	xcall _send_a_byte
	.dbline 311
;         //以下为发送数据
;         for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
	clr R12
	xjmp L70
L67:
	.dbline 312
;         {
	.dbline 313
;             send_a_byte(packet_data_buffer[buffer_index]); //发送128个字节
	mov R30,R12
	clr R31
	add R30,R10
	adc R31,R11
	ldd R16,z+0
	xcall _send_a_byte
	.dbline 314
;             if (temp_char == NAK) //接收方返回NAK则发送方要得传
	cpi R20,21
	brne L71
X18:
	.dbline 315
; 		  	checksum += packet_data_buffer[buffer_index]; //计算校验和
	mov R30,R12
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+0
	clr R3
	add R14,R2
	adc R15,R3
	xjmp L72
L71:
	.dbline 317
;             else
;             checksum = update_CRC(packet_data_buffer[buffer_index], checksum); //CRC校验和
	movw R18,R14
	mov R30,R12
	clr R31
	add R30,R10
	adc R31,R11
	ldd R16,z+0
	xcall _update_CRC
	movw R14,R16
L72:
	.dbline 318
;         }
L68:
	.dbline 311
	inc R12
L70:
	.dbline 311
	mov R24,R12
	cpi R24,128
	brlo L67
X19:
	.dbline 319
;         if (temp_char == ASCII_C) //如果收到C
	cpi R20,67
	brne L73
X20:
	.dbline 320
; 		  {  send_a_byte((uchar)((checksum>>8) & 0x00ff));
	.dbline 320
	movw R16,R14
	mov R16,R17
	clr R17
	andi R17,0
	xcall _send_a_byte
	.dbline 321
;              send_a_byte((uchar)(checksum & 0x00ff)); 
	mov R16,R14
	andi R17,0
	xcall _send_a_byte
	.dbline 322
; 			 }  // send end of packet CRC
L73:
	.dbline 323
; 			 temp_char0=0;
	clr R2
	sts _temp_char0,R2
L75:
	.dbline 324
; 			 while(temp_char0 == 0);
L76:
	.dbline 324
	lds R2,_temp_char0
	tst R2
	breq L75
X21:
	.dbline 325
;         temp_char =temp_char0;         // get receiver response
	mov R20,R2
	.dbline 327
; 
; 		if (temp_char == CAN)
	cpi R20,24
	brne L78
X22:
	.dbline 328
;           return 0;  // reception cancelled
	clr R16
	xjmp L62
L78:
	.dbline 329
;         if (temp_char == ACK)
	cpi R20,6
	brne L80
X23:
	.dbline 330
;           return 1;  // packet received okay
	ldi R16,1
	xjmp L62
L80:
	.dbline 331
;     }
L64:
	.dbline 304
	inc R22
L66:
	.dbline 304
	ldi R24,3
	cp R24,R22
	brlo X25
	xjmp L63
X25:
X24:
	.dbline 332
;     return 0;                             // attempts exhausted
	clr R16
	.dbline -2
L62:
	.dbline 0 ; func end
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r attempt 22 c
	.dbsym r checksum 14 i
	.dbsym r buffer_index 12 c
	.dbsym r temp_char 20 c
	.dbsym r packet_data_buffer 10 pc
	.dbsym l packet_number 10 c
	.dbend
	.dbfunc e send_packet_data _send_packet_data fc
	.dbstruct 0 131 Message
	.dbfield 0 Data_Len c
	.dbfield 1 Message A[128:128]c
	.dbfield 129 User_Data i
	.dbend
;        no_more -> R10
;  Xmodem_Pack22 -> y+1
;  packet_number -> R20
;      temp_char -> R10
;              j -> y+132
;         xModem -> R22,R23
;              i -> R12,R13
;            LEN -> y+146
;      User_Data -> y+144
	.even
_send_packet_data::
	xcall push_arg4
	xcall push_xgsetF0FC
	sbiw R28,63
	sbiw R28,63
	sbiw R28,8  ; offset = 134
	.dbline -1
	.dbline 345
; }
; 
; /*
; function: 以XMODEM 发送数据
; in:  user_data  是数据指针
; out: 1    sucess
;        o    faile
; 使用全局变量? 无
; 
; */
; 
; uchar send_packet_data(uchar const *User_Data , uint LEN)
; {
	.dbline 349
;     struct  Message   Xmodem_Pack22;
; 	struct  Message   *xModem;
; 
;     uint i,j=0;
	clr R0
	clr R1
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	std z+1,R1
	std z+0,R0
	.dbline 350
;     unsigned char packet_number = 1;
	ldi R20,1
	.dbline 351
;     unsigned char no_more = 0;
	clr R10
	.dbline 352
;     unsigned char temp_char = 0;
	.dbline 353
;     xModem=&Xmodem_Pack22;
	movw R22,R28
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 354
; 	xModem->User_Data=0;
	clr R2
	clr R3
	movw R30,R22
	subi R30,127  ; addi 129
	sbci R31,255
	std z+1,R3
	std z+0,R2
	xjmp L84
L83:
	.dbline 358
;  //	xModem->User_Data=User_Data;
;   //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
;     while((temp_char != ASCII_C) && (temp_char != NAK))
; 	{				 
	.dbline 359
; 		  temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
	lds R10,_temp_char0
	.dbline 360
; 		  if(temp_char == CAN)
	mov R24,R10
	cpi R24,24
	brne L86
X26:
	.dbline 361
; 		  return 0;
	clr R16
	xjmp L82
L86:
	.dbline 362
;     }
L84:
	.dbline 357
	mov R24,R10
	cpi R24,67
	breq L88
X27:
	cpi R24,21
	brne L83
X28:
L88:
	.dbline 364
; 
; 	if (LEN < PACKET_DATA_BUFFER_LENGTH)   // 数据区段的长度固定为 128 字节
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	ldd R24,z+0
	ldd R25,z+1
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo X41
	xjmp L89
X41:
X29:
	.dbline 365
; 	{
	.dbline 366
;          for(i=0;i<LEN;i++)
	clr R12
	clr R13
	xjmp L94
L91:
	.dbline 367
;             xModem->Message[i]=(User_Data[j++]);
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	movw R24,R2
	adiw R24,1
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	std z+1,R25
	std z+0,R24
	movw R30,R2
	movw R26,R28
	subi R26,112  ; addi 144
	sbci R27,255
	ld R0,x+
	ld R1,x
	add R30,R0
	adc R31,R1
	lpm R2,Z
	movw R24,R22
	adiw R24,1
	movw R30,R12
	add R30,R24
	adc R31,R25
	std z+0,R2
L92:
	.dbline 366
	movw R24,R12
	adiw R24,1
	movw R12,R24
L94:
	.dbline 366
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	ldd R0,z+0
	ldd R1,z+1
	cp R12,R0
	cpc R13,R1
	brlo L91
X30:
	.dbline 368
; 		 for(i=LEN;i<128;i++)
	movw R12,R0
	xjmp L98
L95:
	.dbline 369
;             xModem->Message[i]=CTRL_Z;
	movw R24,R22
	adiw R24,1
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldi R24,26
	std z+0,R24
L96:
	.dbline 368
	movw R24,R12
	adiw R24,1
	movw R12,R24
L98:
	.dbline 368
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L95
X31:
	.dbline 370
;          if(tx_packet(packet_number, xModem->Message, temp_char)==0)
	std y+0,R10
	movw R18,R22
	subi R18,255  ; offset = 1
	sbci R19,255
	mov R16,R20
	xcall _tx_packet
	tst R16
	breq X42
	xjmp L90
X42:
X32:
	.dbline 371
;             return 0;
	clr R16
	xjmp L82
L89:
	.dbline 374
; 	}
;     else
; 	{
L101:
	.dbline 376
;         do
; 		{
	.dbline 377
;             for(i=0;i<128;i++)
	clr R12
	clr R13
	xjmp L107
L104:
	.dbline 378
;                xModem->Message[i]=(User_Data[j++]);
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	ldd R14,z+0
	ldd R15,z+1
	movw R24,R14
	adiw R24,1
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	std z+1,R25
	std z+0,R24
	movw R30,R14
	movw R26,R28
	subi R26,112  ; addi 144
	sbci R27,255
	ld R0,x+
	ld R1,x
	add R30,R0
	adc R31,R1
	lpm R2,Z
	movw R24,R22
	adiw R24,1
	movw R30,R12
	add R30,R24
	adc R31,R25
	std z+0,R2
L105:
	.dbline 377
	movw R24,R12
	adiw R24,1
	movw R12,R24
L107:
	.dbline 377
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L104
X33:
	.dbline 379
;             if(tx_packet(packet_number, xModem->Message, temp_char)==0)
	std y+0,R10
	movw R18,R22
	subi R18,255  ; offset = 1
	sbci R19,255
	mov R16,R20
	xcall _tx_packet
	mov R14,R16
	tst R16
	brne L108
X34:
	.dbline 380
;                return 0;
	clr R16
	xjmp L82
L108:
	.dbline 381
;             packet_number++;
	inc R20
	.dbline 382
;             LEN=LEN-128;
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	ldd R24,z+0
	ldd R25,z+1
	subi R24,128
	sbci R25,0
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	std z+1,R25
	std z+0,R24
	.dbline 383
; 			Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 385
;                          
; 		}while(LEN>=128);
L102:
	.dbline 385
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	ldd R24,z+0
	ldd R25,z+1
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo X43
	xjmp L101
X43:
X35:
	.dbline 386
; 	    if (LEN)
	movw R0,R24
	cpi R24,0
	cpc R24,R25
	brne X44
	xjmp L110
X44:
X36:
	.dbline 387
; 	    {
	.dbline 388
;             for(i=0;i<LEN;i++)
	clr R12
	clr R13
	xjmp L115
L112:
	.dbline 389
;                 xModem->Message[i]=(User_Data[j++]);
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	ldd R14,z+0
	ldd R15,z+1
	movw R24,R14
	adiw R24,1
	movw R30,R28
	subi R30,124  ; addi 132
	sbci R31,255
	std z+1,R25
	std z+0,R24
	movw R30,R14
	movw R26,R28
	subi R26,112  ; addi 144
	sbci R27,255
	ld R0,x+
	ld R1,x
	add R30,R0
	adc R31,R1
	lpm R2,Z
	movw R24,R22
	adiw R24,1
	movw R30,R12
	add R30,R24
	adc R31,R25
	std z+0,R2
L113:
	.dbline 388
	movw R24,R12
	adiw R24,1
	movw R12,R24
L115:
	.dbline 388
	movw R30,R28
	subi R30,110  ; addi 146
	sbci R31,255
	ldd R0,z+0
	ldd R1,z+1
	cp R12,R0
	cpc R13,R1
	brlo L112
X37:
	.dbline 390
; 	        for(i=LEN;i<128;i++)
	movw R12,R0
	xjmp L119
L116:
	.dbline 391
;                 xModem->Message[i]=CTRL_Z;
	movw R24,R22
	adiw R24,1
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldi R24,26
	std z+0,R24
L117:
	.dbline 390
	movw R24,R12
	adiw R24,1
	movw R12,R24
L119:
	.dbline 390
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L116
X38:
	.dbline 392
;             if( tx_packet(packet_number, xModem->Message, temp_char)==0)
	std y+0,R10
	movw R18,R22
	subi R18,255  ; offset = 1
	sbci R19,255
	mov R16,R20
	xcall _tx_packet
	mov R10,R16
	tst R16
	brne L120
X39:
	.dbline 393
;                 return 0;
	clr R16
	xjmp L82
L120:
	.dbline 394
; 		}
L110:
	.dbline 395
; 	}
L90:
	.dbline 397
; 
; 	if (!tx_EOT()) //发送方正常结束要发EOT信号,
	xcall _tx_EOT
	mov R10,R16
	tst R16
	brne L122
X40:
	.dbline 398
;        return 0;      // end tx data failed
	clr R16
	xjmp L82
L122:
	.dbline 399
; return 1;   //正常结束
	ldi R16,1
	.dbline -2
L82:
	.dbline 0 ; func end
	adiw R28,63
	adiw R28,63
	adiw R28,8  ; offset = 134
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r no_more 10 c
	.dbsym l Xmodem_Pack22 1 S[Message]
	.dbsym r packet_number 20 c
	.dbsym r temp_char 10 c
	.dbsym l j 132 i
	.dbsym r xModem 22 pS[Message]
	.dbsym r i 12 i
	.dbsym l LEN 146 i
	.dbsym l User_Data 144 pkc
	.dbend
	.dbfunc e tx_EOT _tx_EOT fc
;           temp -> R22
;        attempt -> R20
	.even
_tx_EOT::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 402
; }
; uchar tx_EOT(void)
; {
	.dbline 406
;     uchar attempt;
; 	unsigned char temp;
; 

⌨️ 快捷键说明

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