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

📄 xmodem.lst

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
     6DA E5CF      LDI	R28,0x5F
     6DB E0D4      LDI	R29,4
     6DC BFCD      OUT	0x3D,R28
     6DD BFDE      OUT	0x3E,R29
     6DE 51CE      SUBI	R28,0x1E
     6DF 40D0      SBCI	R29,0
     6E0 EA0A      LDI	R16,0xAA
     6E1 8308      STD	Y+0,R16
     6E2 2400      CLR	R0
     6E3 E7EC      LDI	R30,0x7C
     6E4 E0F1      LDI	R31,1
     6E5 E012      LDI	R17,2
     6E6 31EB      CPI	R30,0x1B
     6E7 07F1      CPC	R31,R17
     6E8 F011      BEQ	0x06EB
     6E9 9201      ST	R0,Z+
     6EA CFFB      RJMP	0x06E6
     6EB 8300      STD	Z+0,R16
     6EC E9E8      LDI	R30,0x98
     6ED E0FC      LDI	R31,0xC
     6EE E6A0      LDI	R26,0x60
     6EF E0B0      LDI	R27,0
     6F0 E01D      LDI	R17,0xD
     6F1 E000      LDI	R16,0
     6F2 BF0B      OUT	0x3B,R16
     6F3 3BE4      CPI	R30,0xB4
     6F4 07F1      CPC	R31,R17
     6F5 F021      BEQ	0x06FA
     6F6 95C8      LPM
     6F7 9631      ADIW	R30,1
     6F8 920D      ST	R0,X+
     6F9 CFF9      RJMP	0x06F3
     6FA 940E 07AB CALL	_main
_exit:
     6FC CFFF      RJMP	_exit
FILE: F:\GPRS资料\M16_Xmodem\m16_Xmodem.c
(0001) //ICC-AVR application builder : 2008-7-29 下午 04:04:26
(0002) // Target : M16
(0003) // Crystal: 3.6864Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "pic_crc_data.h"
(0008) 
(0009) 
(0010) #define		true	1
(0011) #define		false	0
(0012) #define		uchar	unsigned char
(0013) #define		uint	unsigned int
(0014) #define		ulong	unsigned long
(0015) 
(0016) #define SOH       0x01
(0017) #define EOT       0x04
(0018) #define ACK       0x06
(0019) #define NAK       0x15
(0020) #define CAN       0x18
(0021) #define CTRL_Z    0x1a
(0022) #define SPACE     0x20
(0023) #define ASCII_C   0x43
(0024) #define ENTER 	  0x0d
(0025) #define CHARGE_LINE		0x0a
(0026) #define PACKET_DATA_BUFFER_LENGTH 128
(0027) #define MAX_TX_TRY 3
(0028) #define ctrl_z 0x1a
(0029) 
(0030) uchar const *DATA_AT = "at$";
(0031) uchar const *DATA_OK = "OK";
(0032) uchar const *DATA_DOWNFINE = "Ok_Info_FileUploadStarted";
(0033) uchar const *DATA_ERROR = "ERROR";
(0034) uchar const *DATA_DOWNFINEOK = "Ok_Info_FileClose";
(0035) uchar const *DATA_MMSTRACE = "$MMSTRACE: 1";
(0036) uchar const *DATA_RING = "RING";
(0037) uchar const *DATA_CLIP = "+CLIP";
(0038) 
(0039) 
(0040) uchar  dial_number[12]={'1','3','7','6','7','1','3','1','6','4','1'};
(0041) uchar  subject[]="mmstest";
(0042) uchar  deletmms[]="AT$FDEL=\"*\"\r\n" ;
(0043) 
(0044) 
(0045) uchar 	  receive_OK;
(0046) uchar	  receive_other;
(0047) uchar     receive_C;
(0048) uchar     receive_DAYUHAO;
(0049) uchar     receive_DOWNFINE;
(0050) uchar     receive_DOWNFINEOK;
(0051) uchar     receive_ERROR;
(0052) uchar     receive_MMSTRACE;
(0053) uchar	  receive_RING;
(0054) uchar	  receive_CLIP;
(0055) 
(0056) uchar flag_mobile;
(0057) uchar flag_telephone;
(0058) uchar telephone_long;
(0059) 
(0060) 
(0061) uchar xmodedata; // TH
(0062) uint picLenth; // TH
(0063) uchar test[100];
(0064) 
(0065) 
(0066) 
(0067) #define PRINT_BUFFER_LENGTH     80
(0068) #define COUNT_STEP               1
(0069) #define MAX_COUNT              100
(0070) #define MAX_MESSAGE_LEN        132
(0071) 
(0072) struct  Message
(0073) {
(0074)     uchar Data_Len;                        /* 消息内容长度,即Message中的内容字节数 */
(0075)     uchar Message[PACKET_DATA_BUFFER_LENGTH];  /* 消息内容, 由发送进程填写 */
(0076)     uint User_Data;
(0077) 
(0078) };
(0079) 
(0080) #define STRING_LENGTH     40
(0081) struct String
(0082) {
(0083) 	uint string_len;
(0084) 	uchar string[STRING_LENGTH];
(0085) 	void *string_data;
(0086) };
(0087) 
(0088)                    
(0089) 
(0090) uchar sending;
(0091) uchar  receive_data[STRING_LENGTH];
(0092) int receive_sp=0;
(0093) 
(0094) uchar const *pic;
(0095) 
(0096) void intDelay(uint i);
(0097) uint update_CRC(uchar inData, uint checksum);
(0098) uchar tx_EOT(void);
(0099) void Delay(unsigned int Delay_MS);
(0100) 
(0101) void send_m_byte(uchar *string, uint length);
(0102) void send_a_byte(uchar temp);
(0103) void do_serial_data(void);
(0104) uchar send_packet_data(uchar const *User_Data , uint LEN);
(0105) uchar tx_packet(uchar packet_number,uchar  * packet_data_buffer, uchar temp_char );
(0106) void sendcmd(unsigned char *by_Array);
(0107) void mms_atsent(void);
(0108) void Xmodem(void);
(0109) 
(0110) 
(0111) void port_init(void)
(0112) {
(0113)  PORTA = 0x00;
_port_init:
     6FD 2422      CLR	R2
     6FE BA2B      OUT	0x1B,R2
(0114)  DDRA  = 0x00;
     6FF BA2A      OUT	0x1A,R2
(0115)  PORTB = 0x00;
     700 BA28      OUT	0x18,R2
(0116)  DDRB  = 0x00;
     701 BA27      OUT	0x17,R2
(0117)  PORTC = 0x00; //m103 output only
     702 BA25      OUT	0x15,R2
(0118)  DDRC  = 0x00;
     703 BA24      OUT	0x14,R2
(0119)  PORTD = 0x00;
     704 BA22      OUT	0x12,R2
(0120)  DDRD  = 0x00;
     705 BA21      OUT	0x11,R2
     706 9508      RET
(0121) }
(0122) 
(0123) //UART0 initialize
(0124) // desired baud rate: 9600
(0125) // actual: baud rate:9600 (0.0%)
(0126) void uart0_init(void)
(0127) {
(0128)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
     707 2422      CLR	R2
     708 B82A      OUT	0x0A,R2
(0129)  UCSRA = 0x00;
     709 B82B      OUT	0x0B,R2
(0130)  UCSRC = BIT(URSEL) | 0x06;
     70A E886      LDI	R24,0x86
     70B BD80      OUT	0x20,R24
(0131)  UBRRL = 0x01; //set baud rate lo
     70C E081      LDI	R24,1
     70D B989      OUT	0x09,R24
(0132)  UBRRH = 0x00; //set baud rate hi
     70E BC20      OUT	0x20,R2
(0133)  UCSRB = 0x98;
     70F E988      LDI	R24,0x98
     710 B98A      OUT	0x0A,R24
     711 9508      RET
(0134) }
(0135) 
(0136) //call this routine to initialize all peripherals
(0137) void init_devices(void)
(0138) {
(0139)  //stop errant interrupts until set up
(0140)  CLI(); //disable all interrupts
_init_devices:
     712 94F8      BCLR	7
(0141)  port_init();
     713 DFE9      RCALL	_port_init
(0142)  uart0_init();
     714 DFF2      RCALL	_uart0_init
(0143) 
(0144)  MCUCR = 0x00;
     715 2422      CLR	R2
     716 BE25      OUT	0x35,R2
(0145)  GICR  = 0x00;
     717 BE2B      OUT	0x3B,R2
(0146)  TIMSK = 0x00; //timer interrupt sources
     718 BE29      OUT	0x39,R2
(0147)  SEI(); //re-enable interrupts
     719 9478      BSET	7
     71A 9508      RET
_uart0_rx_isr:
  temp                 --> R10
     71B 920A      ST	R0,-Y
     71C 921A      ST	R1,-Y
     71D 922A      ST	R2,-Y
     71E 923A      ST	R3,-Y
     71F 924A      ST	R4,-Y
     720 925A      ST	R5,-Y
     721 926A      ST	R6,-Y
     722 927A      ST	R7,-Y
     723 928A      ST	R8,-Y
     724 929A      ST	R9,-Y
     725 930A      ST	R16,-Y
     726 931A      ST	R17,-Y
     727 932A      ST	R18,-Y
     728 933A      ST	R19,-Y
     729 938A      ST	R24,-Y
     72A 939A      ST	R25,-Y
     72B 93AA      ST	R26,-Y
     72C 93BA      ST	R27,-Y
     72D 93EA      ST	R30,-Y
     72E 93FA      ST	R31,-Y
     72F B60F      IN	R0,0x3F
     730 920A      ST	R0,-Y
     731 92AA      ST	R10,-Y
(0148)  //all peripherals are now initialized
(0149) }
(0150) 
(0151) uchar temp_char0=0;
(0152) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0153) void uart0_rx_isr(void)
(0154) {
(0155)  //uart has received a character in UDR
(0156)  		//uchar temp_char0;
(0157) 		unsigned char temp;
(0158)      	temp=UDR;
     732 B0AC      IN	R10,0x0C
(0159)  		temp_char0 = temp;
     733 92A0 0094 STS	temp_char0,R10
(0160)         if(temp_char0 == 'C')
     735 2D8A      MOV	R24,R10
     736 3483      CPI	R24,0x43
     737 F419      BNE	0x073B
(0161)         {                                         //检测是否收到 C
(0162)             receive_C = 1;
     738 E081      LDI	R24,1
     739 9380 0218 STS	receive_C,R24
(0163) 			
(0164)         }
(0165)         if(temp_char0 == '>')
     73B 9180 0094 LDS	R24,temp_char0
     73D 338E      CPI	R24,0x3E
     73E F419      BNE	0x0742
(0166)         {                                         //检测是否收到 >
(0167)             receive_DAYUHAO = 1;
     73F E081      LDI	R24,1
     740 9380 0217 STS	receive_DAYUHAO,R24
(0168)         }
(0169)         if(temp_char0 == 'K')
     742 9180 0094 LDS	R24,temp_char0
     744 348B      CPI	R24,0x4B
     745 F419      BNE	0x0749
(0170)         {                                         //检测是否收到 OK
(0171)             receive_OK = 1;
     746 E081      LDI	R24,1
     747 9380 021A STS	receive_OK,R24
(0172)         }
(0173)         if(temp_char0 == '1')
     749 9180 0094 LDS	R24,temp_char0
     74B 3381      CPI	R24,0x31
     74C F419      BNE	0x0750
(0174)         {                                         //检测是否收到 $MMSTRACE: 1
(0175)             receive_MMSTRACE = 1;
     74D E081      LDI	R24,1
     74E 9380 0213 STS	receive_MMSTRACE,R24
(0176)         }
(0177)         if(temp_char0 == 'U')
     750 9180 0094 LDS	R24,temp_char0
     752 3585      CPI	R24,0x55
     753 F419      BNE	0x0757
(0178)         {                                         //检测是否收到 DOWNFINE
(0179)             receive_DOWNFINE = 1;
     754 E081      LDI	R24,1
     755 9380 0216 STS	receive_DOWNFINE,R24
(0180)         }
(0181) 		if(temp_char0 == 'R')
     757 9180 0094 LDS	R24,temp_char0
     759 3582      CPI	R24,0x52
     75A F419      BNE	0x075E
(0182)         {                                         //检测是否收到 RING
(0183)             receive_RING = 1;	
     75B E081      LDI	R24,1
     75C 9380 0212 STS	receive_RING,R24
(0184) 		}	
(0185)         if(temp_char0 == '+')
     75E 9180 0094 LDS	R24,temp_char0
     760 328B      CPI	R24,0x2B
     761 F419      BNE	0x0765
(0186)         {                                         //检测是否收到 CLIP
(0187)             receive_CLIP = 1;
     762 E081      LDI	R24,1
     763 9380 0211 STS	receive_CLIP,R24
(0188)         }	
(0189) 		if ((temp_char0 == CHARGE_LINE)|| (temp_char0 == ENTER))
     765 9020 0094 LDS	R2,temp_char0
     767 2D82      MOV	R24,R2
     768 308A      CPI	R24,0xA
     769 F011      BEQ	0x076C
     76A 308D      CPI	R24,0xD
     76B F441      BNE	0x0774
(0190) 		{
(0191) 			do_serial_data();        //收到回车,接收指针归零  ,并处理接收数据
     76C D273      RCALL	_do_serial_data
(0192) 			receive_sp = 0;
     76D 2422      CLR	R2
     76E 2433      CLR	R3
     76F 9230 0093 STS	receive_sp+1,R3
     771 9220 0092 STS	receive_sp,R2
(0193) 		}
     773 C010      RJMP	0x0784
(0194) 		else
(0195) 		{            
(0196)         	receive_data[receive_sp++] =temp;
     774 9020 0092 LDS	R2,receive_sp
     776 9030 0093 LDS	R3,receive_sp+1
     778 01C1      MOVW	R24,R2
     779 9601      ADIW	R24,1
     77A 9390 0093 STS	receive_sp+1,R25
     77C 9380 0092 STS	receive_sp,R24
     77E E78E      LDI	R24,0x7E
     77F E091      LDI	R25,1
     780 01F1      MOVW	R30,R2
     781 0FE8      ADD	R30,R24
     782 1FF9      ADC	R31,R25
     783 82A0      STD	Z+0,R10
(0197)         }
(0198)          if (receive_sp > 40)                                      //接收超长,接收指针规零
     784 E288      LDI	R24,0x28
     785 E090      LDI	R25,0
     786 9020 0092 LDS	R2,receive_sp
     788 9030 0093 LDS	R3,receive_sp+1
     78A 1582      CP	R24,R2
     78B 0593      CPC	R25,R3
     78C F434      BGE	0x0793
(0199)           receive_sp = 0;
     78D 2422      CLR	R2
     78E 2433      CLR	R3
     78F 9230 0093 STS	receive_sp+1,R3
     791 9220 0092 STS	receive_sp,R2
     793 90A9      LD	R10,Y+
     794 9009      LD	R0,Y+
     795 BE0F      OUT	0x3F,R0
     796 91F9      LD	R31,Y+
     797 91E9      LD	R30,Y+
     798 91B9      LD	R27,Y+
     799 91A9      LD	R26,Y+
     79A 9199      LD	R25,Y+
     79B 9189      LD	R24,Y+
     79C 9139      LD	R19,Y+
     79D 9129      LD	R18,Y+
     79E 9119      LD	R17,Y+
     79F 9109      LD	R16,Y+
     7A0 9099      LD	R9,Y+
     7A1 9089      LD	R8,Y+
     7A2 9079      LD	R7,Y+
     7A3 9069      LD	R6,Y+
     7A4 9059      LD	R5,Y+
     7A5 9049      LD	R4,Y+
     7A6 9039      LD	R3,Y+
     7A7 9029      LD	R2,Y+
     7A8 9019      LD	R1,Y+
     7A9 9009      LD	R0,Y+
     7AA 9518      RETI
(0200) 		 
(0201) }
(0202) 
(0203) 
(0204) 
(0205) 
(0206) 
(0207) /*********************************************************************
(0208) 
(0209) *********************************************************************/
(0210) 
(0211) void main(void)
(0212) {
(0213) int i;
(0214)  	
(0215) init_devices();
_main:
  i                    --> R20
     7AB DF66      RCALL	_init_devices
(0216) 	
(0217) for(i = 0; i< STRING_LENGTH ; i++)                  //清接收缓存//40
     7AC 2744      CLR	R20
     7AD 2755      CLR	R21
(0218) {
(0219)     receive_data[i] = 0;
     7AE E78E      LDI	R24,0x7E
     7AF E091      LDI	R25,1
     7B0 01FA      MOVW	R30,R20
     7B1 0FE8      ADD	R30,R24
     7B2 1FF9      ADC	R31,R25
     7B3 2422      CLR	R2
     7B4 8220      STD	Z+0,R2
     7B5 5F4F      SUBI	R20,0xFF
     7B6 4F5F      SBCI	R21,0xFF
     7B7 3248      CPI	R20,0x28
     7B8 E0E0      LDI	R30,0
     7B9 075E      CPC	R21,R30
     7BA F39C      BLT	0x07AE
(0220) }
(0221) 
(0222) receive_OK = 0;
     7BB 2422      CLR	R2
     7BC 9220 021A STS	receive_OK,R2

⌨️ 快捷键说明

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