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

📄 main.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile C:\AVR\AD\main.c
	.dbfunc e SIGNALA _SIGNALA fI
;      temp_data -> R20,R21
;              i -> R20,R21
; SIG_UART0_RECV -> R16,R17
	.even
_SIGNALA::
	xcall push_gset1
	.dbline -1
	.dbline 22
; #include <iom128v.h>
; #include <stdlib.h>
; 
; //全局变量////////////////////////////
; 
; unsigned int  global_flag_serie;//通信状态标志
; unsigned int  global_ad_counter;//AD转换计数器
; unsigned int  global_start_sample_flag;//采样开始标志
; unsigned int  global_sample_mode_flag;//采样方式标志:手动或自动
; unsigned int  global_operation_detected_flag;//检测到动作标志
; unsigned int  global_detect_close[5];//用于检测合闸动作开始
; unsigned int  global_detect_trip[5];//用于检测分闸动作开始
; unsigned int  global_channel_flag;//通道标志
; unsigned int  global_close_counter;//合闸线圈地址计数器
; unsigned int  global_trip_counter;//分闸线圈地址计数器
; unsigned int  global_motor_counter;//打压电机地址计数器
; unsigned int  global_voltage_counter;//操作电压地址计数器
; unsigned int  global_ad_finish_flag;//AD转换结束标志
; 
; //串口接收中断////////////////////////
; SIGNALA(SIG_UART0_RECV)
; {
	.dbline 31
; //变量定义
; 	unsigned int temp_data;
; 	unsigned int i;
; //关全局中断
;  //   cli();
; //等待接收到数据标志被置位
; 	//loop_until_bit_is_set(UCSR0A,RXC0);
; //对接收到的字节进行判断
; 	temp_data=UDR0;//读取接收的字节
	in R20,0xc
	clr R21
	.dbline 32
; 	if(temp_data!=0)//如果接收到非零
	cpi R20,0
	cpc R20,R21
	brne X3
	xjmp L2
X3:
X0:
	.dbline 33
; 	{
	.dbline 34
; 		if(global_flag_serie==0)//如果接收到的为第一字节
	lds R2,_global_flag_serie
	lds R3,_global_flag_serie+1
	tst R2
	brne L4
	tst R3
	brne L4
X1:
	.dbline 35
; 		{
	.dbline 36
; 			switch (temp_data)
	cpi R20,16
	ldi R30,0
	cpc R21,R30
	breq L9
	ldi R24,16
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L12
L11:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L8
	xjmp L5
L12:
	cpi R20,34
	ldi R30,0
	cpc R21,R30
	breq L10
	xjmp L5
X2:
	.dbline 37
; 			{
L8:
	.dbline 39
; 				case 2://接到本机地址
; 					global_flag_serie=1;//准备接收第二字节数据
	ldi R24,1
	ldi R25,0
	sts _global_flag_serie+1,R25
	sts _global_flag_serie,R24
	.dbline 40
; 					UCSR0A&=~(1<<MPCM0);//清零MPCM0,允许继续接收数据包
	cbi 0xb,0
	.dbline 41
; 					break;
	xjmp L5
L9:
	.dbline 46
; 			//	case 0://接到复位命令
; 			//		global_start_sample_flag=0xff;//复位开始
; 			//		break;
; 				case 0x10://接到采集命令
; 					global_start_sample_flag=0;//开始采集数据
	clr R2
	clr R3
	sts _global_start_sample_flag+1,R3
	sts _global_start_sample_flag,R2
	.dbline 48
; 				//	sbi(PORTG,3);//测试用///////////////
; 					break;
	xjmp L5
L10:
	.dbline 53
; 			//	case 17://接到采集结束命令
; 				//	global_start_sample_flag=0xff;//结束采集数据
; 			//		break;
; 				case 0x22://接收到自动测试信号
; 					global_sample_mode_flag=0;
	clr R2
	clr R3
	sts _global_sample_mode_flag+1,R3
	sts _global_sample_mode_flag,R2
	.dbline 54
; 					break;
	.dbline 56
; 				default:
; 					break;
	.dbline 58
; 			}
; 		}
	xjmp L5
L4:
	.dbline 59
; 		else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字节
	lds R24,_global_flag_serie
	lds R25,_global_flag_serie+1
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne L13
	ldi R24,32
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlo L13
	.dbline 60
; 		{
	.dbline 61
	clr R20
	clr R21
	xjmp L18
L15:
	.dbline 61
	.dbline 61
	.dbline 61
L16:
	.dbline 61
	subi R20,255  ; offset = 1
	sbci R21,255
L18:
	.dbline 61
; 			for(i=0;i<0xfff;i++){;}//延时等待
	cpi R20,255
	ldi R30,15
	cpc R21,R30
	brlo L15
	.dbline 64
; 		//	SEND_ONE_PACKAGE(temp_data);//发送数据包,temp_data为包序号
; 		//	if(temp_data==17){sbi(PORTG,3);}//测试用////////////
; 			global_flag_serie=0;
	clr R2
	clr R3
	sts _global_flag_serie+1,R3
	sts _global_flag_serie,R2
	.dbline 65
; 			UCSR0A|=(1<<MPCM0);//准备接收地址
	sbi 0xb,0
	.dbline 66
; 		}
L13:
L5:
	.dbline 67
L2:
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp_data 20 i
	.dbsym r i 20 i
	.dbsym r SIG_UART0_RECV 16 I
	.dbend
	.dbfunc e SIGNAL _SIGNAL fI
;              i -> <dead>
;          temp2 -> R22,R23
;          temp1 -> R22,R23
;    int16_temp1 -> R20,R21
; SIG_INTERRUPT7 -> R16,R17
	.even
_SIGNAL::
	xcall push_gset2
	.dbline -1
	.dbline 74
;     }
; 	//cbi(PORTE,2);//改为接收状态
; 	//sei();
; }
; 
; //AD转换结束中断int7//////////////////
; SIGNAL(SIG_INTERRUPT7)
; {
	.dbline 83
; //变量定义
; 	unsigned int int16_temp1;
; 	unsigned int temp1,temp2,i;
; //关中断
; 	//cli();
; //读取ad转换结果
; 	//int16_temp1=AD7891_READ();
; //如果是需要保存到RAM的采样
; 	if(global_sample_mode_flag==0xFF)
	lds R24,_global_sample_mode_flag
	lds R25,_global_sample_mode_flag+1
	cpi R24,255
	ldi R30,0
	cpc R25,R30
	breq X6
	xjmp L20
X6:
	.dbline 84
; 	{
	.dbline 88
; 	//AD7891 deselect,否则数据总线与RAM冲突
; 		//sbi(PORTD,5);
; 	//AD转换结果存入RAM
; 		temp1=int16_temp1/256;
	movw R22,R20
	mov R22,R23
	clr R23
	.dbline 89
; 		temp2=int16_temp1%256;
	movw R22,R20
	andi R23,0
	.dbline 91
; 	//保存数据
; 		switch(global_channel_flag)
	lds R24,_global_channel_flag
	lds R25,_global_channel_flag+1
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L24
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	breq L25
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	breq L26
	xjmp L23
X4:
	.dbline 92
; 		{
L24:
	.dbline 96
; 			case 1://保存合闸线圈电流
; 				//SRAM_1M_8_WRITE(global_close_counter,temp1);//高位字节
; 				//SRAM_1M_8_WRITE(global_close_counter+1,temp2);//低位字节
; 				global_close_counter+=2;
	lds R24,_global_close_counter
	lds R25,_global_close_counter+1
	adiw R24,2
	sts _global_close_counter+1,R25
	sts _global_close_counter,R24
	.dbline 97
; 				break;
	xjmp L23
L25:
	.dbline 101
; 			case 2://保存分闸线圈电流
; 				//SRAM_1M_8_WRITE(global_trip_counter,temp1);//高位字节
; 				//SRAM_1M_8_WRITE(global_trip_counter+1,temp2);//低位字节
; 				global_trip_counter+=2;
	lds R24,_global_trip_counter
	lds R25,_global_trip_counter+1
	adiw R24,2
	sts _global_trip_counter+1,R25
	sts _global_trip_counter,R24
	.dbline 102
; 				break;
	xjmp L23
L26:
	.dbline 108
; 			case 3://保存操作电压
; 			//	SRAM_1M_8_WRITE(global_motor_counter,temp1);//高位字节
; 			//	SRAM_1M_8_WRITE(global_motor_counter+1,temp2);//低位字节
; 				//SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字节
; 				//SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字节
; 				global_voltage_counter+=2;
	lds R24,_global_voltage_counter
	lds R25,_global_voltage_counter+1
	adiw R24,2
	sts _global_voltage_counter+1,R25
	sts _global_voltage_counter,R24
	.dbline 110
; 			//	global_motor_counter+=2;
; 				break;
	.dbline 117
; 		//	case 4://保存操作电压
; 			//	SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字节
; 			//	SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字节
; 			//	global_voltage_counter+=2;
; 			//	break;
; 			default:
; 				break;
L23:
	.dbline 120
; 		}
; 	//计数器自加
; 		global_ad_counter++;
	lds R24,_global_ad_counter
	lds R25,_global_ad_counter+1
	adiw R24,1
	sts _global_ad_counter+1,R25
	sts _global_ad_counter,R24
	.dbline 121
; 	}
L20:
	.dbline 123
; //如果是检测动作是否开始的采样
; 	if(global_sample_mode_flag==0x00)
	lds R2,_global_sample_mode_flag
	lds R3,_global_sample_mode_flag+1
	tst R2
	breq X7
	xjmp L27
X7:
	tst R3
	breq X8
	xjmp L27
X8:
X5:
	.dbline 124
; 	{
	.dbline 127
; 	//采样轮转赋值
; 		//合闸线圈采样
; 		if(global_ad_counter%2==0)
	lds R2,_global_ad_counter
	lds R3,_global_ad_counter+1
	sbrc R2,0
	rjmp L29
	.dbline 128
; 		{
	.dbline 130
; 		//	global_detect_close[0]=int16_temp1;

⌨️ 快捷键说明

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