📄 soc_test.lst
字号:
__start:
__text_start:
006F EFCF LDI R28,0xFF
0070 E1D0 LDI R29,0x10
0071 BFCD OUT 0x3D,R28
0072 BFDE OUT 0x3E,R29
0073 51C0 SUBI R28,0x10
0074 40D0 SBCI R29,0
0075 EA0A LDI R16,0xAA
0076 8308 STD Y+0,R16
0077 2400 CLR R0
0078 E0E0 LDI R30,0
0079 E0F1 LDI R31,1
007A E011 LDI R17,1
007B 38E3 CPI R30,0x83
007C 07F1 CPC R31,R17
007D F011 BEQ 0x0080
007E 9201 ST R0,Z+
007F CFFB RJMP 0x007B
0080 8300 STD Z+0,R16
0081 EDED LDI R30,0xDD
0082 E0F0 LDI R31,0
0083 E0A0 LDI R26,0
0084 E0B1 LDI R27,1
0085 E010 LDI R17,0
0086 3DED CPI R30,0xDD
0087 07F1 CPC R31,R17
0088 F021 BEQ 0x008D
0089 95C8 LPM
008A 9631 ADIW R30,1
008B 920D ST R0,X+
008C CFF9 RJMP 0x0086
008D 940E0633 CALL _main
_exit:
008F CFFF RJMP _exit
FILE: F:\chengxu128L\soc_test.c
(0001) #include <iom128v.h>
(0002) //单片机ATmega128
(0003) #include <macros.h>
(0004) //单片机ATmega128
(0005) #include "soc_test.H"
(0006) //对应头文件
(0007) //寄存器更名
(0008) asm(".define temp R16");
(0009) //--------------------------------------------------------
(0010) /*********************************************************
(0011) 连续5个NOP
(0012) *********************************************************/
(0013) void NOP5(void)
(0014) {
(0015) NOP();
_NOP5:
0090 0000 NOP
(0016) NOP();
0091 0000 NOP
(0017) NOP();
0092 0000 NOP
(0018) NOP();
0093 0000 NOP
(0019) NOP();
0094 0000 NOP
(0020) }
0095 9508 RET
(0021) //--------------------------------------------------------
(0022) /*********************************************************
(0023) 初始化程序
(0024) *********************************************************/
(0025) void initial_work(void)
(0026) {
(0027) /*********************************
(0028) 初始化IO口
(0029) *********************************/
(0030) //初始化B口
(0031) //DDRB|=BIT(FQUD)+BIT(RESET)+BIT(RESET_FPGA)+BIT(W_CLK)+BIT(SDATA);
(0032) //初始化D口
(0033) //DDRD|=BIT(INT_DSP);
(0034) //初始化E口
(0035) DDRE|=BIT(NBUS_CLK)+BIT(BUSWEN)+BIT(SAMPLE_START)+BIT(MCUREAD_START);
_initial_work:
0096 B182 IN R24,0x02
0097 638C ORI R24,0x3C
0098 B982 OUT 0x02,R24
(0036)
(0037) /*********************************
(0038) *********************************/
(0039) NOP5();
0099 DFF6 RCALL _NOP5
(0040) /*********************************
(0041) 初始化串口
(0042) *********************************/
(0043) UCSR0B=0x00;
009A 2422 CLR R2
009B B82A OUT 0x0A,R2
(0044) UCSR0A=0x00;
009C B82B OUT 0x0B,R2
(0045) UCSR0C=0x06; //8bit,1 stop bit,no check
009D E086 LDI R24,6
009E 93800095 STS 0x95,R24
(0046) UBRR0L=0x0B; //现:设置波特率为38.4Kbps(外部晶振时钟7372.8KHz)
00A0 E08B LDI R24,0xB
00A1 B989 OUT 0x09,R24
(0047) UBRR0H=0x00;
00A2 92200090 STS 0x90,R2
(0048) UCSR0B=0x98; //一开始就打开发送使能,是为了使TXC脚电平变高
00A4 E988 LDI R24,0x98
00A5 B98A OUT 0x0A,R24
(0049) }//end initial_work
00A6 9508 RET
_process_00workmode:
i --> R20
00A7 940E0797 CALL push_gset1
(0050) //--------------------------------------------------------
(0051) /*********************************************************
(0052)
(0053)
(0054)
(0055) *********************************************************/
(0056) void process_00workmode(void)
(0057) {
(0058) unsigned char i;
(0059) if(1)
(0060) {
(0061) for(i=0;i<L00;i++)
00A9 2744 CLR R20
00AA C00F RJMP 0x00BA
(0062) {
(0063) reply_buffer[i]=work_state_succeed[i];
00AB E88C LDI R24,0x8C
00AC E090 LDI R25,0
00AD 2FE4 MOV R30,R20
00AE 27FF CLR R31
00AF 0FE8 ADD R30,R24
00B0 1FF9 ADC R31,R25
00B1 91E4 LPM R30,0(Z)
00B2 E08B LDI R24,0xB
00B3 E091 LDI R25,1
00B4 2FA4 MOV R26,R20
00B5 27BB CLR R27
00B6 0FA8 ADD R26,R24
00B7 1FB9 ADC R27,R25
00B8 93EC ST R30,0(X)
00B9 9543 INC R20
00BA 3047 CPI R20,7
00BB F378 BCS 0x00AB
(0064) }
(0065) usart0_send(L00);
00BC E007 LDI R16,7
00BD D028 RCALL _usart0_send
(0066) }
(0067) }//end process_00workmode
00BE 940E079A CALL pop_gset1
00C0 9508 RET
(0068) //--------------------------------------------------------
(0069) /*********************************************************
(0070) 等待
(0071) *********************************************************/
(0072) void process_01wait(void)
(0073) {
(0074)
(0075) }//end process_01wait
_process_01wait:
00C1 9508 RET
(0076) //--------------------------------------------------------
(0077)
(0078)
(0079)
(0080)
(0081)
(0082)
(0083) /*********************************************************
(0084) 通用延时子程序
(0085) *********************************************************/
(0086) void delay1(void)
(0087) {
(0088) asm("DELAY1:");
(0089) asm("push r16");
_delay1:
00C2 930F PUSH R16
(0090) asm("CC0: push r16");
00C3 930F PUSH R16
(0091) asm("CC1: push r16");
00C4 930F PUSH R16
(0092) asm("CC2: push r16");
00C5 930F PUSH R16
(0093) asm("CC3: dec r16");
00C6 950A DEC R16
(0094) asm("brne CC3");
00C7 F7F1 BNE 0x00C6
(0095) asm("pop r16");
00C8 910F POP R16
(0096) asm("dec r16");
00C9 950A DEC R16
(0097) asm("brne CC2");
00CA F7D1 BNE 0x00C5
(0098) asm("pop r16");
00CB 910F POP R16
(0099) asm("dec r16");
00CC 950A DEC R16
(0100) asm("brne CC1");
00CD F7B1 BNE 0x00C4
(0101) asm("pop r16");
00CE 910F POP R16
(0102) asm("dec r16");
00CF 950A DEC R16
(0103) asm("brne CC0");
00D0 F791 BNE 0x00C3
(0104) asm("pop r16");
00D1 910F POP R16
(0105) }//end delay1
00D2 9508 RET
(0106) //--------------------------------------------------------
(0107) /*********************************************************
(0108) 串口发送查询
(0109) *********************************************************/
(0110) void query_TXC(void)
(0111) {
(0112) while(!(UCSR0A&BIT(TXC0)));
_query_TXC:
00D3 9B5E SBIS 0x0B,6
00D4 CFFE RJMP _query_TXC
(0113) UCSR0A|=BIT(TXC0); //写1清零
00D5 9A5E SBI 0x0B,6
(0114) }//end query_TXC
00D6 9508 RET
(0115) //--------------------------------------------------------
(0116) /*********************************************************
(0117) 使能外部SRAM
(0118) *********************************************************/
(0119) void enable_XMEM(void)
(0120) {
(0121) MCUCR=0b10000000; //XMEM enable,no wait states
_enable_XMEM:
00D7 E880 LDI R24,0x80
00D8 BF85 OUT 0x35,R24
(0122) XMCRA=0;
00D9 2422 CLR R2
00DA 9220006D STS 0x6D,R2
(0123) XMCRB=0; //no XMEM high mask
00DC 9220006C STS 0x6C,R2
(0124) }//end enable_XMEM
00DE 9508 RET
(0125) //--------------------------------------------------------
(0126) /*********************************************************
(0127) 清串口
(0128) *********************************************************/
(0129) void usart_flush(void)
(0130) {
(0131) asm("push temp");
_usart_flush:
00DF 930F PUSH R16
00E0 C001 RJMP 0x00E2
(0132) while(UCSR0A&BIT(RXC0))
(0133) {
(0134) asm("in temp,0x0c"); //in temp,udr0
00E1 B10C IN R16,0x0C
00E2 995F SBIC 0x0B,7
00E3 CFFD RJMP 0x00E1
(0135) continue; //继续判断
(0136) }
(0137) asm("pop temp");
00E4 910F POP R16
(0138) }//end usart_flush
00E5 9508 RET
_usart0_send:
i --> R20
uSendLen --> R22
00E6 940E07AE CALL push_gset2
00E8 2F60 MOV R22,R16
(0139) //--------------------------------------------------------
(0140)
(0141)
(0142) /*********************************************************
(0143) 通过异步串口0发送回复命令
(0144) *********************************************************/
(0145) void usart0_send(unsigned char uSendLen)
(0146) {
(0147) unsigned char i=0;
00E9 2744 CLR R20
(0148) for(i=0;i<uSendLen;i++)
00EA C00A RJMP 0x00F5
(0149) {
(0150) UDR0=reply_buffer[i];
00EB E08B LDI R24,0xB
00EC E091 LDI R25,1
00ED 2FE4 MOV R30,R20
00EE 27FF CLR R31
00EF 0FE8 ADD R30,R24
00F0 1FF9 ADC R31,R25
00F1 8020 LDD R2,Z+0
00F2 B82C OUT 0x0C,R2
(0151) query_TXC();
00F3 DFDF RCALL _query_TXC
00F4 9543 INC R20
00F5 1746 CP R20,R22
00F6 F3A0 BCS 0x00EB
(0152) }
(0153) }//end usart0_send
00F7 940E0791 CALL pop_gset2
00F9 9508 RET
_usart0_sendbyte:
uSendByte --> R20
00FA 940E0797 CALL push_gset1
00FC 2F40 MOV R20,R16
(0154) //--------------------------------------------------------
(0155) /*********************************************************
(0156) 通过异步串口0发送一个字节
(0157) *********************************************************/
(0158) void usart0_sendbyte(unsigned char uSendByte)
(0159) {
(0160)
(0161) UDR0=uSendByte;
00FD B94C OUT 0x0C,R20
(0162) query_TXC();
00FE DFD4 RCALL _query_TXC
(0163)
(0164) }//end usart0_sendbyte
00FF 940E079A CALL pop_gset1
0101 9508 RET
_usart0_receive:
revChar --> R16
0102 922A ST R2,-Y
0103 930A ST R16,-Y
0104 938A ST R24,-Y
0105 939A ST R25,-Y
0106 93EA ST R30,-Y
0107 93FA ST R31,-Y
0108 B62F IN R2,0x3F
0109 922A ST R2,-Y
(0165) //--------------------------------------------------------
(0166) /*********************************************************
(0167) **********************************************************
(0168) 以下为中断服务子程序
(0169) **********************************************************
(0170) *********************************************************/
(0171) //异步串口接收中断处理程序,将所接收命令存于数组buffer[]中
(0172) //为防止意外改变寄存器的值,在这里只用全局变量
(0173) //每次进中断接收一字节数据
(0174) void usart0_receive(void)
(0175) {
(0176) unsigned char revChar;
(0177) haveUartInt=0x01; //haveUartInt表示接收了一次串口中断,即一个字节数据
010A E081 LDI R24,1
010B 93800108 STS _haveUartInt,R24
(0178) revChar=UDR0; //接收一个字节
010D B10C IN R16,0x0C
(0179) if(buf_index<MAX_RECEV_LEN) //如果长度小于最大长度
010E 91800105 LDS R24,_buf_index
0110 3684 CPI R24,0x64
0111 F008 BCS 0x0113
0112 C098 RJMP 0x01AB
(0180) {
(0181) buffer[buf_index]=revChar; //将该字节加入buffer
0113 E18F LDI R24,0x1F
0114 E091 LDI R25,1
0115 91E00105 LDS R30,_buf_index
0117 27FF CLR R31
0118 0FE8 ADD R30,R24
0119 1FF9 ADC R31,R25
011A 8300 STD Z+0,R16
(0182) if(END_WORD==buffer[buf_index] && BEGIN_WORD==beginWord && buf_index>2)
011B 91E00105 LDS R30,_buf_index
011D 27FF CLR R31
011E 0FE8 ADD R30,R24
011F 1FF9 ADC R31,R25
0120 8180 LDD R24,Z+0
0121 378E CPI R24,0x7E
0122 F481 BNE 0x0133
0123 9180010A LDS R24,_beginWord
0125 378E CPI R24,0x7E
0126 F461 BNE 0x0133
0127 E082 LDI R24,2
0128 90200105 LDS R2,_buf_index
012A 1582 CP R24,R2
012B F438 BCC 0x0133
(0183) //这里为beginWord是因为beginWord是在结束字之前设置的,也就是说收到结束字时必须先收到了起始字否则这个结束字是非法的
(0184) { //注意:结束字判断应该在转义操作之前
(0185) endWord=END_WORD; //接收到结束标志
012C E78E LDI R24,0x7E
012D 93800109 STS _endWord,R24
(0186) beginWord=0x00; //接收完一次,为接收下一次数据做准备
012F 2422 CLR R2
0130 9220010A STS _beginWord,R2
(0187) }
0132 C07B RJMP 0x01AE
(0188) else if(0==buf_index)
0133 90200105 LDS R2,_buf_index
0135 2022 TST R2
0136 F461 BNE 0x0143
(0189) { //对第一个数据进行判断
(0190) if(BEGIN_WORD==buffer[0])
0137 9180011F LDS R24,_buffer
0139 378E CPI R24,0x7E
013A F421 BNE 0x013F
(0191) {
(0192) beginWord=BEGIN_WORD; //接收到起始字
013B E78E LDI R24,0x7E
013C 9380010A STS _beginWord,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -