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

📄 soc_test.s

📁 atmega128串口通信
💻 S
📖 第 1 页 / 共 4 页
字号:
	.module soc_test.c
	.area vector(rom, abs)
	.org 72
	jmp _usart0_receive
	.area code(ram, con, rel)
	.area lit(rom, con, rel)
_work_state_succeed::
	.byte 126,95
	.byte 3,1
	.byte 0,'c
	.byte 126
	.dbfile F:\chengxu128L/soc_test.H
	.dbsym e work_state_succeed _work_state_succeed A[7:7]kc
_work_state_fail::
	.byte 126,95
	.byte 3,1
	.byte 1,'d
	.byte 126
	.dbsym e work_state_fail _work_state_fail A[7:7]kc
_state_normal::
	.byte 126,95
	.byte 3,3
	.byte 0,'e
	.byte 126
	.dbsym e state_normal _state_normal A[7:7]kc
_state_abnormal::
	.byte 126,95
	.byte 3,3
	.byte 1,'f
	.byte 126
	.dbsym e state_abnormal _state_abnormal A[7:7]kc
_test_normal::
	.byte 126,95
	.byte 3,4
	.byte 0,'f
	.byte 126
	.dbsym e test_normal _test_normal A[7:7]kc
_test_abnormal::
	.byte 126,95
	.byte 3,4
	.byte 1,'g
	.byte 126
	.dbsym e test_abnormal _test_abnormal A[7:7]kc
_FREQ_WORD::
	.byte 136,181
	.byte 248,20
	.byte 254,25
	.byte 184,22
	.byte 226,17
	.byte 239,19
	.dbsym e FREQ_WORD _FREQ_WORD A[12:3:4]kc
_T_PROCESS_CLK::
	.byte 255,2
	.byte 15
	.byte 127,2
	.byte 14
	.byte 63,2
	.byte 12
	.byte 31,2
	.byte 8
	.byte 15,1
	.byte 12
	.byte 7,1
	.byte 8
	.byte 3,0
	.byte 14
	.byte 1,0
	.byte 12
	.byte 0,0
	.byte 8
	.dbsym e T_PROCESS_CLK _T_PROCESS_CLK A[27:9:3]kc
	.area data(ram, con, rel)
	.dbfile F:\chengxu128L/soc_test.H
	.define  temp   R16

	.area text(rom, con, rel)
	.dbfile F:\chengxu128L/soc_test.H
	.dbfile F:\chengxu128L\soc_test.c
	.dbfunc e NOP5 _NOP5 fV
	.even
_NOP5::
	.dbline -1
	.dbline 14
; #include  <iom128v.h>
; //单片机ATmega128
; #include  <macros.h>
; //单片机ATmega128
; #include  "soc_test.H"
; //对应头文件
; //寄存器更名
; asm(".define  temp   R16");
; //--------------------------------------------------------
; /*********************************************************
; 连续5个NOP
; *********************************************************/
; void	NOP5(void)
; {
	.dbline 15
; 	NOP();
	nop
	.dbline 16
; 	NOP();
	nop
	.dbline 17
; 	NOP();
	nop
	.dbline 18
; 	NOP();
	nop
	.dbline 19
; 	NOP();
	nop
	.dbline -2
	.dbline 20
; }
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e initial_work _initial_work fV
	.even
_initial_work::
	.dbline -1
	.dbline 26
; //--------------------------------------------------------
; /*********************************************************
; 初始化程序	
; *********************************************************/
; void	initial_work(void)
; {
	.dbline 35
; 	/*********************************
;   					初始化IO口
;   *********************************/
;   //初始化B口
;   //DDRB|=BIT(FQUD)+BIT(RESET)+BIT(RESET_FPGA)+BIT(W_CLK)+BIT(SDATA);
;   //初始化D口
;   //DDRD|=BIT(INT_DSP);  
;   //初始化E口
;   DDRE|=BIT(NBUS_CLK)+BIT(BUSWEN)+BIT(SAMPLE_START)+BIT(MCUREAD_START);
	in R24,0x2
	ori R24,60
	out 0x2,R24
	.dbline 39
; 	
;   /*********************************
;   *********************************/
;   NOP5();
	xcall _NOP5
	.dbline 43
;   /*********************************
;   					初始化串口												
;   *********************************/
; 	UCSR0B=0x00;
	clr R2
	out 0xa,R2
	.dbline 44
; 	UCSR0A=0x00;
	out 0xb,R2
	.dbline 45
; 	UCSR0C=0x06; //8bit,1 stop bit,no check
	ldi R24,6
	sts 149,R24
	.dbline 46
; 	UBRR0L=0x0B; //现:设置波特率为38.4Kbps(外部晶振时钟7372.8KHz)
	ldi R24,11
	out 0x9,R24
	.dbline 47
; 	UBRR0H=0x00;
	sts 144,R2
	.dbline 48
; 	UCSR0B=0x98; //一开始就打开发送使能,是为了使TXC脚电平变高
	ldi R24,152
	out 0xa,R24
	.dbline -2
	.dbline 49
; }//end initial_work
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e process_00workmode _process_00workmode fV
;              i -> R20
	.even
_process_00workmode::
	xcall push_gset1
	.dbline -1
	.dbline 57
; //--------------------------------------------------------
; /*********************************************************
; 
; 
; 
; *********************************************************/
; void  process_00workmode(void)
; {
	.dbline 59
; 	unsigned char i;
; 	if(1)
	.dbline 60
; 	{
	.dbline 61
; 		for(i=0;i<L00;i++)
	clr R20
	xjmp L9
L6:
	.dbline 62
	.dbline 63
	ldi R24,<_work_state_succeed
	ldi R25,>_work_state_succeed
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	ldi R24,<_reply_buffer
	ldi R25,>_reply_buffer
	mov R26,R20
	clr R27
	add R26,R24
	adc R27,R25
	st x,R30
	.dbline 64
L7:
	.dbline 61
	inc R20
L9:
	.dbline 61
	cpi R20,7
	brlo L6
	.dbline 65
	ldi R16,7
	xcall _usart0_send
	.dbline 66
L4:
	.dbline -2
	.dbline 67
; 		{
; 			reply_buffer[i]=work_state_succeed[i];
; 		}
; 		usart0_send(L00);
; 	}
; }//end process_00workmode
L3:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e process_01wait _process_01wait fV
	.even
_process_01wait::
	.dbline -1
	.dbline 73
; //--------------------------------------------------------
; /*********************************************************
; 等待
; *********************************************************/
; void	process_01wait(void)
; {
	.dbline -2
	.dbline 75
; 	
; }//end process_01wait
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay1 _delay1 fV
	.even
_delay1::
	.dbline -1
	.dbline 87
; //--------------------------------------------------------
; 
; 
; 
; 
; 
; 
; /*********************************************************
; 通用延时子程序
; *********************************************************/
; void delay1(void)
; {
	.dbline 88
; 	asm("DELAY1:"); 
	DELAY1:
	.dbline 89
; 	asm("push r16");
	push r16
	.dbline 90
; 	asm("CC0:  push r16");
	CC0:  push r16
	.dbline 91
; 	asm("CC1:  push r16");
	CC1:  push r16
	.dbline 92
; 	asm("CC2:  push r16");
	CC2:  push r16
	.dbline 93
; 	asm("CC3:  dec  r16");
	CC3:  dec  r16
	.dbline 94
; 	asm("brne CC3");
	brne CC3
	.dbline 95
; 	asm("pop r16");
	pop r16
	.dbline 96
; 	asm("dec r16");
	dec r16
	.dbline 97
; 	asm("brne CC2");
	brne CC2
	.dbline 98
; 	asm("pop r16");
	pop r16
	.dbline 99
; 	asm("dec r16");
	dec r16
	.dbline 100
; 	asm("brne CC1");
	brne CC1
	.dbline 101
; 	asm("pop r16");
	pop r16
	.dbline 102
; 	asm("dec r16");
	dec r16
	.dbline 103
; 	asm("brne CC0");
	brne CC0
	.dbline 104
; 	asm("pop r16");    
	pop r16
	.dbline -2
	.dbline 105
; }//end delay1
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e query_TXC _query_TXC fV
	.even
_query_TXC::
	.dbline -1
	.dbline 111
; //--------------------------------------------------------
; /*********************************************************
; 串口发送查询
; *********************************************************/
; void  query_TXC(void)
; {
L13:
	.dbline 112
L14:
	.dbline 112
; 	while(!(UCSR0A&BIT(TXC0)));
	sbis 0xb,6
	rjmp L13
	.dbline 113
; 	UCSR0A|=BIT(TXC0);   //写1清零
	sbi 0xb,6
	.dbline -2
	.dbline 114
; }//end query_TXC
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e enable_XMEM _enable_XMEM fV
	.even
_enable_XMEM::
	.dbline -1
	.dbline 120
; //--------------------------------------------------------
; /*********************************************************
; 使能外部SRAM
; *********************************************************/
; void  enable_XMEM(void)
; {
	.dbline 121
; 	MCUCR=0b10000000; //XMEM enable,no wait states
	ldi R24,128
	out 0x35,R24
	.dbline 122
; 	XMCRA=0;
	clr R2
	sts 109,R2
	.dbline 123
; 	XMCRB=0;   				//no XMEM high mask
	sts 108,R2
	.dbline -2
	.dbline 124
; }//end enable_XMEM
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e usart_flush _usart_flush fV
	.even
_usart_flush::
	.dbline -1
	.dbline 130
; //--------------------------------------------------------
; /*********************************************************
; 清串口
; *********************************************************/
; void  usart_flush(void)
; {
	.dbline 131
; 	asm("push temp");
	push temp
	xjmp L19
L18:
	.dbline 133
	.dbline 134
	in temp,0x0c
	.dbline 135
L19:
	.dbline 132
; 	while(UCSR0A&BIT(RXC0))
	sbic 0xb,7
	rjmp L18
	.dbline 137
; 	{
; 		asm("in temp,0x0c");   //in temp,udr0
; 		continue;   //继续判断
; 	}
; 	asm("pop temp");
	pop temp
	.dbline -2
	.dbline 138
; }//end usart_flush
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e usart0_send _usart0_send fV
;              i -> R20
;       uSendLen -> R22
	.even
_usart0_send::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 146
; //--------------------------------------------------------
; 
; 
; /*********************************************************
; 通过异步串口0发送回复命令
; *********************************************************/
; void  usart0_send(unsigned char uSendLen)
; {
	.dbline 147
; 	unsigned char i=0;
	clr R20
	.dbline 148
; 	for(i=0;i<uSendLen;i++)
	xjmp L25
L22:
	.dbline 149
	.dbline 150
	ldi R24,<_reply_buffer
	ldi R25,>_reply_buffer
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 151
	xcall _query_TXC
	.dbline 152
L23:
	.dbline 148
	inc R20
L25:
	.dbline 148
	cp R20,R22
	brlo L22
	.dbline -2
	.dbline 153
; 	{
; 		UDR0=reply_buffer[i];
; 		query_TXC();
; 	}
; }//end usart0_send
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r uSendLen 22 c
	.dbend
	.dbfunc e usart0_sendbyte _usart0_sendbyte fV
;      uSendByte -> R20
	.even
_usart0_sendbyte::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 159
; //--------------------------------------------------------
; /*********************************************************
; 通过异步串口0发送一个字节
; *********************************************************/
; void  usart0_sendbyte(unsigned char uSendByte)
; {
	.dbline 161
;     
;   UDR0=uSendByte;
	out 0xc,R20
	.dbline 162
;   query_TXC();  
	xcall _query_TXC
	.dbline -2
	.dbline 164
;     
; }//end usart0_sendbyte
L26:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r uSendByte 20 c
	.dbend
	.dbfunc e usart0_receive _usart0_receive fV
;        revChar -> R16
	.even
_usart0_receive::
	st -y,R2
	st -y,R16
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 175
; //--------------------------------------------------------
; /*********************************************************
; **********************************************************
; 以下为中断服务子程序
; **********************************************************
; *********************************************************/
; //异步串口接收中断处理程序,将所接收命令存于数组buffer[]中
; //为防止意外改变寄存器的值,在这里只用全局变量
; //每次进中断接收一字节数据
; void usart0_receive(void)
; {
	.dbline 177
; 	unsigned char revChar;
; 	haveUartInt=0x01;  //haveUartInt表示接收了一次串口中断,即一个字节数据
	ldi R24,1
	sts _haveUartInt,R24
	.dbline 178
; 	revChar=UDR0;	//接收一个字节
	in R16,0xc
	.dbline 179
; 	if(buf_index<MAX_RECEV_LEN)	//如果长度小于最大长度
	lds R24,_buf_index
	cpi R24,100
	brlo X0
	xjmp L28
X0:
	.dbline 180
; 	{
	.dbline 181
; 		buffer[buf_index]=revChar;	//将该字节加入buffer
	ldi R24,<_buffer
	ldi R25,>_buffer
	lds R30,_buf_index
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 182
; 		if(END_WORD==buffer[buf_index] && BEGIN_WORD==beginWord && buf_index>2)
	lds R30,_buf_index
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,126
	brne L30
	lds R24,_beginWord
	cpi R24,126
	brne L30
	ldi R24,2
	lds R2,_buf_index
	cp R24,R2
	brsh L30
	.dbline 184
; 		//这里为beginWord是因为beginWord是在结束字之前设置的,也就是说收到结束字时必须先收到了起始字否则这个结束字是非法的
; 		{	//注意:结束字判断应该在转义操作之前
	.dbline 185
; 			endWord=END_WORD;			//接收到结束标志
	ldi R24,126
	sts _endWord,R24
	.dbline 186
; 			beginWord=0x00;			//接收完一次,为接收下一次数据做准备
	clr R2
	sts _beginWord,R2
	.dbline 187
; 		}
	xjmp L29
L30:
	.dbline 188
; 		else if(0==buf_index)
	lds R2,_buf_index
	tst R2
	brne L32
	.dbline 189
; 		{	//对第一个数据进行判断
	.dbline 190
; 			if(BEGIN_WORD==buffer[0])
	lds R24,_buffer
	cpi R24,126
	brne L34
	.dbline 191
; 			{
	.dbline 192
; 				beginWord=BEGIN_WORD;	//接收到起始字
	ldi R24,126
	sts _beginWord,R24
	.dbline 193
; 			}
	xjmp L29
L34:
	.dbline 195
; 			else
; 			{
	.dbline 196
; 				haveError=0x02;			//haveError索引(2),开始字出错
	ldi R24,2
	sts _haveError,R24
	.dbline 197
; 			}
	.dbline 198
; 		}
	xjmp L29
L32:
	.dbline 199
; 		else if(1==buf_index && BEGIN_WORD==beginWord)
	lds R24,_buf_index
	cpi R24,1
	brne L36
	lds R24,_beginWord
	cpi R24,126
	brne L36
	.dbline 200
; 		{	//索引为1,且已经起始
	.dbline 201
; 			if(BEGIN_WORD==buffer[1])	//若第二个数据也是起始字,删除一个
	lds R24,_buffer+1
	cpi R24,126
	brne L38
	.dbline 202
; 			{
	.dbline 203
; 				buf_index=0;		//索引变为0
	clr R2
	sts _buf_index,R2
	.dbline 204
; 				buffer[1]=0x01;	//清除第二个接收到的起始字
	ldi R24,1
	sts _buffer+1,R24
	.dbline 205
; 			}
	xjmp L29
L38:
	.dbline 207
; 			//判断所收命令是否归本片AVR处理
; 			else if(ADDRESS_WORD!=buffer[1]) 
	lds R24,_buffer+1
	cpi R24,95
	brne X1
	xjmp L29
X1:
	.dbline 208
; 			{
	.dbline 209
; 				haveError=0x03;   //haveError索引(3),地址不对,重新接收
	ldi R24,3
	sts _haveError,R24
	.dbline 210
; 			}
	.dbline 211
; 		}
	xjmp L29
L36:
	.dbline 212
; 		else if(haveSpeWord)	//这里用else,是因为第一个字,第二个字都不可能是转义字符
	lds R2,_haveSpeWord
	tst R2
	brne X2
	xjmp L45
X2:
	.dbline 213
; 		{//含有转义字符,做转义操作,若数据错误,则设置错误标志,重新接收
	.dbline 214
; 			haveSpeWord=0x00;			//清除标志
	clr R2
	sts _haveSpeWord,R2
	.dbline 215
; 			if(CHANGE_WORDL1==buffer[buf_index])
	ldi R24,<_buffer
	ldi R25,>_buffer
	lds R30,_buf_index
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,94
	brne L47
	.dbline 216
; 			{
	.dbline 217
; 				buffer[buf_index-1]=0x7E;	//若是7D 5E -> 7E
	ldi R24,<_buffer-1
	ldi R25,>_buffer-1
	lds R30,_buf_index
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,126
	std z+0,R24
	.dbline 218
; 				buf_index-=1;			//buf_index减一
	lds R24,_buf_index
	subi R24,1
	sts _buf_index,R24
	.dbline 219
; 			}
	xjmp L29

⌨️ 快捷键说明

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