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

📄 main.lst

📁 基于AVR单片机 Atmel Mega128的AD采集程序。
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"main.c"
   2               		.arch atmega128
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  12               		.text
  13               	.Ltext0:
  74               	.global	__vector_18
  76               	__vector_18:
   1:main.c        **** #include <avr/io.h>
   2:main.c        **** #include <avr/signal.h>
   3:main.c        **** #include <avr/interrupt.h>
   4:main.c        **** #include <stdlib.h>
   5:main.c        **** #include <inttypes.h>
   6:main.c        **** #include "adc_sram.h"
   7:main.c        **** #include "macro.h"
   8:main.c        **** //全局变量////////////////////////////
   9:main.c        **** uint8_t global_flag_serie;//通信状态标志
  10:main.c        **** uint16_t global_ad_counter;//AD转换计数器
  11:main.c        **** uint8_t global_start_sample_flag;//采样开始标志
  12:main.c        **** uint8_t global_sample_mode_flag;//采样方式标志:手动或自动
  13:main.c        **** uint8_t global_operation_detected_flag;//检测到动作标志
  14:main.c        **** uint16_t global_detect_close[5];//用于检测合闸动作开始
  15:main.c        **** uint16_t global_detect_trip[5];//用于检测分闸动作开始
  16:main.c        **** uint8_t global_channel_flag;//通道标志
  17:main.c        **** uint16_t global_close_counter;//合闸线圈地址计数器
  18:main.c        **** uint16_t global_trip_counter;//分闸线圈地址计数器
  19:main.c        **** uint16_t global_motor_counter;//打压电机地址计数器
  20:main.c        **** uint16_t global_voltage_counter;//操作电压地址计数器
  21:main.c        **** uint8_t global_ad_finish_flag;//AD转换结束标志
  22:main.c        **** //串口接收中断////////////////////////
  23:main.c        **** SIGNAL(SIG_UART0_RECV)
  24:main.c        **** {
  78               	.LM1:
  79               	/* prologue: frame size=5 */
  80 0000 1F92      		push __zero_reg__
  81 0002 0F92      		push __tmp_reg__
  82 0004 0FB6      		in __tmp_reg__,__SREG__
  83 0006 0F92      		push __tmp_reg__
  84 0008 1124      		clr __zero_reg__
  85 000a 2F93      		push r18
  86 000c 3F93      		push r19
  87 000e 4F93      		push r20
  88 0010 5F93      		push r21
  89 0012 6F93      		push r22
  90 0014 7F93      		push r23
  91 0016 8F93      		push r24
  92 0018 9F93      		push r25
  93 001a AF93      		push r26
  94 001c BF93      		push r27
  95 001e EF93      		push r30
  96 0020 FF93      		push r31
  97 0022 CF93      		push r28
  98 0024 DF93      		push r29
  99 0026 CDB7      		in r28,__SP_L__
 100 0028 DEB7      		in r29,__SP_H__
 101 002a 2597      		sbiw r28,5
 102 002c DEBF      		out __SP_H__,r29
 103 002e CDBF      		out __SP_L__,r28
 104               	/* prologue end (size=24) */
  25:main.c        **** //变量定义
  26:main.c        **** 	uint8_t temp_data;
  27:main.c        **** 	uint16_t i;
  28:main.c        **** //关全局中断
  29:main.c        ****     cli();
 106               	.LM2:
 107               	.LBB2:
 108               	/* #APP */
 109 0030 F894      		cli
  30:main.c        **** //等待接收到数据标志被置位
  31:main.c        **** 	loop_until_bit_is_set(UCSR0A,RXC0);
 111               	.LM3:
 112               	/* #NOAPP */
 113               	.L8:
 114 0032 8091 2B00 		lds r24,43
 115 0036 8823      		tst r24
 116 0038 E4F7      		brge .L8
  32:main.c        **** //对接收到的字节进行判断
  33:main.c        **** 	temp_data=UDR0;//读取接收的字节
 118               	.LM4:
 119 003a 8091 2C00 		lds r24,44
 120 003e 8983      		std Y+1,r24
  34:main.c        **** 	if(temp_data!=0)//如果接收到非零
 122               	.LM5:
 123 0040 8981      		ldd r24,Y+1
 124 0042 8823      		tst r24
 125 0044 09F4      		brne .+2
 126 0046 4EC0      		rjmp .L12
  35:main.c        **** 	{
  36:main.c        **** 		if(global_flag_serie==0)//如果接收到的为第一字节
 128               	.LM6:
 129 0048 8091 0000 		lds r24,global_flag_serie
 130 004c 8823      		tst r24
 131 004e 51F5      		brne .L13
  37:main.c        **** 		{
  38:main.c        **** 			switch (temp_data)
 133               	.LM7:
 134 0050 8981      		ldd r24,Y+1
 135 0052 282F      		mov r18,r24
 136 0054 3327      		clr r19
 137 0056 2C83      		std Y+4,r18
 138 0058 3D83      		std Y+5,r19
 139 005a 8C81      		ldd r24,Y+4
 140 005c 9D81      		ldd r25,Y+5
 141 005e 8031      		cpi r24,16
 142 0060 9105      		cpc r25,__zero_reg__
 143 0062 D1F0      		breq .L16
 144 0064 2C81      		ldd r18,Y+4
 145 0066 3D81      		ldd r19,Y+5
 146 0068 2131      		cpi r18,17
 147 006a 3105      		cpc r19,__zero_reg__
 148 006c 34F4      		brge .L20
 149 006e 8C81      		ldd r24,Y+4
 150 0070 9D81      		ldd r25,Y+5
 151 0072 8230      		cpi r24,2
 152 0074 9105      		cpc r25,__zero_reg__
 153 0076 39F0      		breq .L15
 154 0078 35C0      		rjmp .L12
 155               	.L20:
 156 007a 2C81      		ldd r18,Y+4
 157 007c 3D81      		ldd r19,Y+5
 158 007e 2232      		cpi r18,34
 159 0080 3105      		cpc r19,__zero_reg__
 160 0082 69F0      		breq .L17
 161 0084 2FC0      		rjmp .L12
 162               	.L15:
  39:main.c        **** 			{
  40:main.c        **** 				case 2://接到本机地址
  41:main.c        **** 					global_flag_serie=1;//准备接收第二字节数据
 164               	.LM8:
 165 0086 81E0      		ldi r24,lo8(1)
 166 0088 8093 0000 		sts global_flag_serie,r24
  42:main.c        **** 					UCSR0A&=~(1<<MPCM0);//清零MPCM0,允许继续接收数据包
 168               	.LM9:
 169 008c 8091 2B00 		lds r24,43
 170 0090 8E7F      		andi r24,lo8(-2)
 171 0092 8093 2B00 		sts 43,r24
  43:main.c        **** 					break;
 173               	.LM10:
 174 0096 26C0      		rjmp .L12
 175               	.L16:
  44:main.c        **** 			//	case 0://接到复位命令
  45:main.c        **** 			//		global_start_sample_flag=0xff;//复位开始
  46:main.c        **** 			//		break;
  47:main.c        **** 				case 0x10://接到采集命令
  48:main.c        **** 					global_start_sample_flag=0;//开始采集数据
 177               	.LM11:
 178 0098 1092 0000 		sts global_start_sample_flag,__zero_reg__
  49:main.c        **** 				//	sbi(PORTG,3);//测试用///////////////
  50:main.c        **** 					break;
 180               	.LM12:
 181 009c 23C0      		rjmp .L12
 182               	.L17:
  51:main.c        **** 			//	case 17://接到采集结束命令
  52:main.c        **** 				//	global_start_sample_flag=0xff;//结束采集数据
  53:main.c        **** 			//		break;
  54:main.c        **** 				case 0x22://接收到自动测试信号
  55:main.c        **** 					global_sample_mode_flag=0;
 184               	.LM13:
 185 009e 1092 0000 		sts global_sample_mode_flag,__zero_reg__
  56:main.c        **** 					break;
 187               	.LM14:
 188 00a2 20C0      		rjmp .L12
 189               	.L13:
  57:main.c        **** 				default:
  58:main.c        **** 					break;
  59:main.c        **** 			}
  60:main.c        **** 		}
  61:main.c        **** 		else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字节
 191               	.LM15:
 192 00a4 8091 0000 		lds r24,global_flag_serie
 193 00a8 8130      		cpi r24,lo8(1)
 194 00aa E1F4      		brne .L12
 195 00ac 8981      		ldd r24,Y+1
 196 00ae 8132      		cpi r24,lo8(33)
 197 00b0 C8F4      		brsh .L12
  62:main.c        **** 		{
  63:main.c        **** 			for(i=0;i<0xfff;i++){;}//延时等待
 199               	.LM16:
 200 00b2 1A82      		std Y+2,__zero_reg__
 201 00b4 1B82      		std Y+3,__zero_reg__
 202               	.L23:
 203 00b6 8A81      		ldd r24,Y+2
 204 00b8 9B81      		ldd r25,Y+3
 205 00ba 3FE0      		ldi r19,hi8(4095)
 206 00bc 8F3F      		cpi r24,lo8(4095)
 207 00be 9307      		cpc r25,r19
 208 00c0 08F0      		brlo .L25
 209 00c2 06C0      		rjmp .L24
 210               	.L25:
 211 00c4 8A81      		ldd r24,Y+2
 212 00c6 9B81      		ldd r25,Y+3
 213 00c8 0196      		adiw r24,1
 214 00ca 8A83      		std Y+2,r24
 215 00cc 9B83      		std Y+3,r25
 216 00ce F3CF      		rjmp .L23
 217               	.L24:
  64:main.c        **** 			SEND_ONE_PACKAGE(temp_data);//发送数据包,temp_data为包序号
 219               	.LM17:
 220 00d0 8981      		ldd r24,Y+1
 221 00d2 0E94 0000 		call SEND_ONE_PACKAGE
  65:main.c        **** 		//	if(temp_data==17){sbi(PORTG,3);}//测试用////////////
  66:main.c        **** 			global_flag_serie=0;
 223               	.LM18:
 224 00d6 1092 0000 		sts global_flag_serie,__zero_reg__
  67:main.c        **** 			UCSR0A|=(1<<MPCM0);//准备接收地址
 226               	.LM19:
 227 00da 8091 2B00 		lds r24,43
 228 00de 8160      		ori r24,lo8(1)
 229 00e0 8093 2B00 		sts 43,r24
 230               	.L12:
  68:main.c        **** 		}
  69:main.c        ****     }
  70:main.c        **** 	cbi(PORTE,2);//改为接收状态
 232               	.LM20:
 233 00e4 8091 2300 		lds r24,35
 234 00e8 8B7F      		andi r24,lo8(-5)
 235 00ea 8093 2300 		sts 35,r24
  71:main.c        **** 	sei();
 237               	.LM21:
 238               	/* #APP */
 239 00ee 7894      		sei
  72:main.c        **** }
 241               	.LM22:
 242               	/* #NOAPP */
 243               	.LBE2:
 244               	/* epilogue: frame size=5 */
 245 00f0 2596      		adiw r28,5
 246 00f2 F894      		cli
 247 00f4 DEBF      		out __SP_H__,r29
 248 00f6 CDBF      		out __SP_L__,r28
 249 00f8 DF91      		pop r29
 250 00fa CF91      		pop r28
 251 00fc FF91      		pop r31
 252 00fe EF91      		pop r30
 253 0100 BF91      		pop r27
 254 0102 AF91      		pop r26
 255 0104 9F91      		pop r25
 256 0106 8F91      		pop r24
 257 0108 7F91      		pop r23
 258 010a 6F91      		pop r22
 259 010c 5F91      		pop r21
 260 010e 4F91      		pop r20
 261 0110 3F91      		pop r19
 262 0112 2F91      		pop r18
 263 0114 0F90      		pop __tmp_reg__
 264 0116 0FBE      		out __SREG__,__tmp_reg__
 265 0118 0F90      		pop __tmp_reg__
 266 011a 1F90      		pop __zero_reg__
 267 011c 1895      		reti
 268               	/* epilogue end (size=23) */
 269               	/* function __vector_18 size 145 (98) */
 275               	.Lscope0:
 278               	.global	__vector_8
 280               	__vector_8:
  73:main.c        **** 
  74:main.c        **** //AD转换结束中断int7//////////////////
  75:main.c        **** SIGNAL(SIG_INTERRUPT7)
  76:main.c        **** {
 282               	.LM23:
 283               	/* prologue: frame size=7 */
 284 011e 1F92      		push __zero_reg__
 285 0120 0F92      		push __tmp_reg__
 286 0122 0FB6      		in __tmp_reg__,__SREG__
 287 0124 0F92      		push __tmp_reg__
 288 0126 1124      		clr __zero_reg__
 289 0128 2F93      		push r18
 290 012a 3F93      		push r19
 291 012c 4F93      		push r20
 292 012e 5F93      		push r21
 293 0130 6F93      		push r22
 294 0132 7F93      		push r23
 295 0134 8F93      		push r24
 296 0136 9F93      		push r25
 297 0138 AF93      		push r26
 298 013a BF93      		push r27
 299 013c EF93      		push r30
 300 013e FF93      		push r31
 301 0140 CF93      		push r28
 302 0142 DF93      		push r29
 303 0144 CDB7      		in r28,__SP_L__
 304 0146 DEB7      		in r29,__SP_H__
 305 0148 2797      		sbiw r28,7
 306 014a DEBF      		out __SP_H__,r29
 307 014c CDBF      		out __SP_L__,r28
 308               	/* prologue end (size=24) */
  77:main.c        **** //变量定义
  78:main.c        **** 	uint16_t int16_temp1;
  79:main.c        **** 	uint8_t temp1,temp2,i;
  80:main.c        **** //关中断
  81:main.c        **** 	cli();
 310               	.LM24:
 311               	.LBB3:
 312               	/* #APP */
 313 014e F894      		cli
  82:main.c        **** //读取ad转换结果
  83:main.c        **** 	int16_temp1=AD7891_READ();
 315               	.LM25:
 316               	/* #NOAPP */
 317 0150 0E94 0000 		call AD7891_READ
 318 0154 8983      		std Y+1,r24
 319 0156 9A83      		std Y+2,r25
  84:main.c        **** //如果是需要保存到RAM的采样
  85:main.c        **** 	if(global_sample_mode_flag==0xFF)
 321               	.LM26:
 322 0158 8091 0000 		lds r24,global_sample_mode_flag
 323 015c 8F3F      		cpi r24,lo8(-1)
 324 015e 09F0      		breq .+2
 325 0160 96C0      		rjmp .L28
  86:main.c        **** 	{
  87:main.c        **** 	//AD7891 deselect,否则数据总线与RAM冲突
  88:main.c        **** 		sbi(PORTD,5);
 327               	.LM27:
 328 0162 8091 3200 		lds r24,50
 329 0166 8062      		ori r24,lo8(32)
 330 0168 8093 3200 		sts 50,r24
  89:main.c        **** 	//AD转换结果存入RAM
  90:main.c        **** 		temp1=int16_temp1/256;
 332               	.LM28:
 333 016c 8981      		ldd r24,Y+1
 334 016e 9A81      		ldd r25,Y+2
 335 0170 892F      		mov r24,r25
 336 0172 9927      		clr r25
 337 0174 8B83      		std Y+3,r24
  91:main.c        **** 		temp2=int16_temp1%256;
 339               	.LM29:
 340 0176 8981      		ldd r24,Y+1
 341 0178 9A81      		ldd r25,Y+2
 342 017a 9070      		andi r25,hi8(255)
 343 017c 8C83      		std Y+4,r24

⌨️ 快捷键说明

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