📄 xmodem.lst
字号:
__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 + -