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

📄 xmodem.s

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 S
📖 第 1 页 / 共 4 页
字号:
	.word 18533
	.word 30726
	.word 26663
	.word 6336
	.word 2273
	.word 14466
	.word 10403
	.word 52093
	.word 56156
	.word 60223
	.word 64286
	.word 35833
	.word 39896
	.word 43963
	.word 48026
	.word 19061
	.word 23124
	.word 27191
	.word 31254
	.word 2801
	.word 6864
	.word 10931
	.word 14994
	.word 64814
	.word 60687
	.word 56684
	.word 52557
	.word 48554
	.word 44427
	.word 40424
	.word 36297
	.word 31782
	.word 27655
	.word 23652
	.word 19525
	.word 15522
	.word 11395
	.word 7392
	.word 3265
	.word 61215
	.word 65342
	.word 53085
	.word 57212
	.word 44955
	.word 49082
	.word 36825
	.word 40952
	.word 28183
	.word 32310
	.word 20053
	.word 24180
	.word 11923
	.word 16050
	.word 3793
	.word 7920
	.dbsym e crc16_table _crc16_table A[512:256]ki
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\pic_crc_data.h
_receive_sp::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\pic_crc_data.h
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
	.dbsym e receive_sp _receive_sp I
_temp_char0::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
	.dbsym e temp_char0 _temp_char0 c
	.area text(rom, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
	.dbfunc e xModemSend _xModemSend fc
;         length -> R18,R19
;      temp_data -> R16,R17
	.even
_xModemSend::
	.dbline -1
	.dbline 47
; #include "xmodem.h"
; #include "pic_crc_data.h"
; 
; 
; uchar sending;
; extern uchar  receive_data[STRING_LENGTH];
; extern int receive_sp=0;
; uchar const *pic;
; uchar temp_char0=0;
; 
; uchar xmodedata; // TH
; uint picLenth; // TH
; 
; 
; 
; 
; struct  Message
; {
;     uchar Data_Len;                        /* 消息内容长度,即Message中的内容字节数 */
;     uchar Message[PACKET_DATA_BUFFER_LENGTH];  /* 消息内容, 由发送进程填写 */
;     uint User_Data;
; 
; };
; 
; struct String
; {
; 	uint string_len;
; 	uchar string[STRING_LENGTH];
; 	void *string_data;
; };
; 
; 
; void intDelay(uint i);
; uint update_CRC(uchar inData, uint checksum);
; uchar tx_EOT(void);
; void Delay(unsigned int Delay_MS);
; 
; void send_m_byte(uchar *string, uint length);
; void send_a_byte(uchar temp);
; void do_serial_data(int lenth);
; uchar send_packet_data(uchar const *User_Data , uint LEN);
; uchar tx_packet(uchar packet_number,uchar  * packet_data_buffer, uchar temp_char );
; void sendcmd(unsigned char *by_Array);
; 
; 
; uchar xModemSend(uchar *temp_data, uint length)
; {
	.dbline 48
; 	*temp_data = 0;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 49
; 	 length = 0;
	clr R18
	clr R19
	.dbline 50
;      return 0;
	clr R16
	.dbline -2
L8:
	.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 56
; }
; 
; 
; //                     信息包序号                  包里面的数据     收接收方反回来的信息
; uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
; {
	.dbline 60
; 	uchar attempt;
; 	uint checksum;
; 	uchar buffer_index;
;     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
	ldi R22,1
	xjmp L13
L10:
	.dbline 61
;     {
	.dbline 62
;         checksum= 0;                          //校验和为0
	clr R14
	clr R15
	.dbline 63
;         send_a_byte(SOH);                     // send start of packet(sending标志中断发送)
	ldi R16,1
	xcall _send_a_byte
	.dbline 64
;         send_a_byte(packet_number);           //发送信息包序号
	ldd R16,y+10
	xcall _send_a_byte
	.dbline 65
;         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 67
;         //以下为发送数据
;         for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
	clr R12
	xjmp L17
L14:
	.dbline 68
;         {
	.dbline 69
;             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 70
;             if (temp_char == NAK) //接收方返回NAK则发送方要得传
	cpi R20,21
	brne L18
X0:
	.dbline 71
; 		  	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 L19
L18:
	.dbline 73
;             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
L19:
	.dbline 74
;         }
L15:
	.dbline 67
	inc R12
L17:
	.dbline 67
	mov R24,R12
	cpi R24,128
	brlo L14
X1:
	.dbline 75
;         if (temp_char == ASCII_C) //如果收到C
	cpi R20,67
	brne L20
X2:
	.dbline 76
; 		  {  send_a_byte((uchar)((checksum>>8) & 0x00ff));
	.dbline 76
	movw R16,R14
	mov R16,R17
	clr R17
	andi R17,0
	xcall _send_a_byte
	.dbline 77
;              send_a_byte((uchar)(checksum & 0x00ff)); 
	mov R16,R14
	andi R17,0
	xcall _send_a_byte
	.dbline 78
; 			 }  // send end of packet CRC
L20:
	.dbline 79
; 			 temp_char0=0;
	clr R2
	sts _temp_char0,R2
L22:
	.dbline 80
; 			 while(temp_char0 == 0);
L23:
	.dbline 80
	lds R2,_temp_char0
	tst R2
	breq L22
X3:
	.dbline 81
;         temp_char =temp_char0;         // get receiver response
	mov R20,R2
	.dbline 83
; 
; 		if (temp_char == CAN)
	cpi R20,24
	brne L25
X4:
	.dbline 84
;           return 0;  // reception cancelled
	clr R16
	xjmp L9
L25:
	.dbline 85
;         if (temp_char == ACK)
	cpi R20,6
	brne L27
X5:
	.dbline 86
;           return 1;  // packet received okay
	ldi R16,1
	xjmp L9
L27:
	.dbline 87
;     }
L11:
	.dbline 60
	inc R22
L13:
	.dbline 60
	ldi R24,3
	cp R24,R22
	brlo X7
	xjmp L10
X7:
X6:
	.dbline 88
;     return 0;                             // attempts exhausted
	clr R16
	.dbline -2
L9:
	.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 101
; }
; 
; /*
; function: 以XMODEM 发送数据
; in:  user_data  是数据指针
; out: 1    sucess
;        o    faile
; 使用全局变量? 无
; 
; */
; 
; uchar send_packet_data(uchar const *User_Data , uint LEN)
; {
	.dbline 105
;     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 106
;     unsigned char packet_number = 1;
	ldi R20,1
	.dbline 107
;     unsigned char no_more = 0;
	clr R10
	.dbline 108
;     unsigned char temp_char = 0;
	.dbline 109
;     xModem=&Xmodem_Pack22;
	movw R22,R28
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 110
; 	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 L31
L30:
	.dbline 114
;  //	xModem->User_Data=User_Data;
;   //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
;     while((temp_char != ASCII_C) && (temp_char != NAK))
; 	{				 
	.dbline 115
; 		  temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
	lds R10,_temp_char0
	.dbline 116
; 		  if(temp_char == CAN)
	mov R24,R10
	cpi R24,24
	brne L33
X8:
	.dbline 117
; 		  return 0;
	clr R16
	xjmp L29
L33:
	.dbline 118
;     }
L31:
	.dbline 113
	mov R24,R10
	cpi R24,67
	breq L35
X9:
	cpi R24,21
	brne L30
X10:
L35:
	.dbline 120
; 
; 	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 X23
	xjmp L36
X23:
X11:
	.dbline 121
; 	{
	.dbline 122
;          for(i=0;i<LEN;i++)
	clr R12
	clr R13
	xjmp L41
L38:
	.dbline 123
;             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
L39:
	.dbline 122
	movw R24,R12
	adiw R24,1
	movw R12,R24
L41:
	.dbline 122
	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 L38
X12:
	.dbline 124
; 		 for(i=LEN;i<128;i++)
	movw R12,R0
	xjmp L45
L42:
	.dbline 125
;             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
L43:
	.dbline 124
	movw R24,R12
	adiw R24,1
	movw R12,R24
L45:
	.dbline 124
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L42
X13:
	.dbline 126
;          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 X24
	xjmp L37
X24:
X14:
	.dbline 127
;             return 0;
	clr R16
	xjmp L29
L36:
	.dbline 130
; 	}
;     else
; 	{
L48:
	.dbline 132
;         do
; 		{
	.dbline 133
;             for(i=0;i<128;i++)
	clr R12
	clr R13
	xjmp L54
L51:
	.dbline 134
;                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
L52:
	.dbline 133
	movw R24,R12
	adiw R24,1
	movw R12,R24
L54:
	.dbline 133
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L51
X15:
	.dbline 135
;             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 L55
X16:
	.dbline 136
;                return 0;
	clr R16
	xjmp L29
L55:
	.dbline 137
;             packet_number++;
	inc R20
	.dbline 138
;             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 139
; 			Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 141
;                          
; 		}while(LEN>=128);
L49:
	.dbline 141
	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 X25
	xjmp L48
X25:
X17:
	.dbline 142
; 	    if (LEN)
	movw R0,R24
	cpi R24,0
	cpc R24,R25
	brne X26
	xjmp L57
X26:
X18:
	.dbline 143
; 	    {
	.dbline 144
;             for(i=0;i<LEN;i++)
	clr R12
	clr R13
	xjmp L62
L59:
	.dbline 145
;                 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
L60:
	.dbline 144
	movw R24,R12
	adiw R24,1
	movw R12,R24
L62:
	.dbline 144
	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 L59
X19:
	.dbline 146
; 	        for(i=LEN;i<128;i++)
	movw R12,R0
	xjmp L66
L63:
	.dbline 147
;                 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
L64:
	.dbline 146
	movw R24,R12
	adiw R24,1
	movw R12,R24
L66:
	.dbline 146
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L63
X20:
	.dbline 148
;             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 L67
X21:
	.dbline 149
;                 return 0;
	clr R16
	xjmp L29
L67:
	.dbline 150
; 		}
L57:
	.dbline 151
; 	}
L37:
	.dbline 153
; 
; 	if (!tx_EOT()) //发送方正常结束要发EOT信号,
	xcall _tx_EOT
	mov R10,R16
	tst R16
	brne L69
X22:
	.dbline 154
;        return 0;      // end tx data failed
	clr R16
	xjmp L29
L69:
	.dbline 155
; return 1;   //正常结束

⌨️ 快捷键说明

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