📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile C:\AVR\AD\main.c
0000 .dbfunc e SIGNALA _SIGNALA fI
0000 ; temp_data -> R20,R21
0000 ; i -> R20,R21
0000 ; SIG_UART0_RECV -> R16,R17
.even
0000 _SIGNALA::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 22
0004 ; #include <iom128v.h>
0004 ; #include <stdlib.h>
0004 ;
0004 ; //全局变量////////////////////////////
0004 ;
0004 ; unsigned int global_flag_serie;//通信状态标志
0004 ; unsigned int global_ad_counter;//AD转换计数器
0004 ; unsigned int global_start_sample_flag;//采样开始标志
0004 ; unsigned int global_sample_mode_flag;//采样方式标志:手动或自动
0004 ; unsigned int global_operation_detected_flag;//检测到动作标志
0004 ; unsigned int global_detect_close[5];//用于检测合闸动作开始
0004 ; unsigned int global_detect_trip[5];//用于检测分闸动作开始
0004 ; unsigned int global_channel_flag;//通道标志
0004 ; unsigned int global_close_counter;//合闸线圈地址计数器
0004 ; unsigned int global_trip_counter;//分闸线圈地址计数器
0004 ; unsigned int global_motor_counter;//打压电机地址计数器
0004 ; unsigned int global_voltage_counter;//操作电压地址计数器
0004 ; unsigned int global_ad_finish_flag;//AD转换结束标志
0004 ;
0004 ; //串口接收中断////////////////////////
0004 ; SIGNALA(SIG_UART0_RECV)
0004 ; {
0004 .dbline 31
0004 ; //变量定义
0004 ; unsigned int temp_data;
0004 ; unsigned int i;
0004 ; //关全局中断
0004 ; // cli();
0004 ; //等待接收到数据标志被置位
0004 ; //loop_until_bit_is_set(UCSR0A,RXC0);
0004 ; //对接收到的字节进行判断
0004 ; temp_data=UDR0;//读取接收的字节
0004 4CB1 in R20,0xc
0006 5527 clr R21
0008 .dbline 32
0008 ; if(temp_data!=0)//如果接收到非零
0008 4030 cpi R20,0
000A 4507 cpc R20,R21
000C 09F4 brne X3
000E 4EC0 xjmp L2
0010 X3:
0010 X0:
0010 .dbline 33
0010 ; {
0010 .dbline 34
0010 ; if(global_flag_serie==0)//如果接收到的为第一字节
0010 20902800 lds R2,_global_flag_serie
0014 30902900 lds R3,_global_flag_serie+1
0018 2220 tst R2
001A 59F5 brne L4
001C 3320 tst R3
001E 49F5 brne L4
0020 X1:
0020 .dbline 35
0020 ; {
0020 .dbline 36
0020 ; switch (temp_data)
0020 4031 cpi R20,16
0022 E0E0 ldi R30,0
0024 5E07 cpc R21,R30
0026 B9F0 breq L9
0028 80E1 ldi R24,16
002A 90E0 ldi R25,0
002C 8417 cp R24,R20
002E 9507 cpc R25,R21
0030 2CF0 brlt L12
0032 L11:
0032 4230 cpi R20,2
0034 E0E0 ldi R30,0
0036 5E07 cpc R21,R30
0038 31F0 breq L8
003A 38C0 xjmp L5
003C L12:
003C 4232 cpi R20,34
003E E0E0 ldi R30,0
0040 5E07 cpc R21,R30
0042 81F0 breq L10
0044 33C0 xjmp L5
0046 X2:
0046 .dbline 37
0046 ; {
0046 L8:
0046 .dbline 39
0046 ; case 2://接到本机地址
0046 ; global_flag_serie=1;//准备接收第二字节数据
0046 81E0 ldi R24,1
0048 90E0 ldi R25,0
004A 90932900 sts _global_flag_serie+1,R25
004E 80932800 sts _global_flag_serie,R24
0052 .dbline 40
0052 ; UCSR0A&=~(1<<MPCM0);//清零MPCM0,允许继续接收数据包
0052 5898 cbi 0xb,0
0054 .dbline 41
0054 ; break;
0054 2BC0 xjmp L5
0056 L9:
0056 .dbline 46
0056 ; // case 0://接到复位命令
0056 ; // global_start_sample_flag=0xff;//复位开始
0056 ; // break;
0056 ; case 0x10://接到采集命令
0056 ; global_start_sample_flag=0;//开始采集数据
0056 2224 clr R2
0058 3324 clr R3
005A 30922500 sts _global_start_sample_flag+1,R3
005E 20922400 sts _global_start_sample_flag,R2
0062 .dbline 48
0062 ; // sbi(PORTG,3);//测试用///////////////
0062 ; break;
0062 24C0 xjmp L5
0064 L10:
0064 .dbline 53
0064 ; // case 17://接到采集结束命令
0064 ; // global_start_sample_flag=0xff;//结束采集数据
0064 ; // break;
0064 ; case 0x22://接收到自动测试信号
0064 ; global_sample_mode_flag=0;
0064 2224 clr R2
0066 3324 clr R3
0068 30922300 sts _global_sample_mode_flag+1,R3
006C 20922200 sts _global_sample_mode_flag,R2
0070 .dbline 54
0070 ; break;
0070 .dbline 56
0070 ; default:
0070 ; break;
0070 .dbline 58
0070 ; }
0070 ; }
0070 1DC0 xjmp L5
0072 L4:
0072 .dbline 59
0072 ; else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字节
0072 80912800 lds R24,_global_flag_serie
0076 90912900 lds R25,_global_flag_serie+1
007A 8130 cpi R24,1
007C E0E0 ldi R30,0
007E 9E07 cpc R25,R30
0080 A9F4 brne L13
0082 80E2 ldi R24,32
0084 90E0 ldi R25,0
0086 8417 cp R24,R20
0088 9507 cpc R25,R21
008A 80F0 brlo L13
008C .dbline 60
008C ; {
008C .dbline 61
008C 4427 clr R20
008E 5527 clr R21
0090 02C0 xjmp L18
0092 L15:
0092 .dbline 61
0092 .dbline 61
0092 .dbline 61
0092 L16:
0092 .dbline 61
0092 4F5F subi R20,255 ; offset = 1
0094 5F4F sbci R21,255
0096 L18:
0096 .dbline 61
0096 ; for(i=0;i<0xfff;i++){;}//延时等待
0096 4F3F cpi R20,255
0098 EFE0 ldi R30,15
009A 5E07 cpc R21,R30
009C D0F3 brlo L15
009E .dbline 64
009E ; // SEND_ONE_PACKAGE(temp_data);//发送数据包,temp_data为包序号
009E ; // if(temp_data==17){sbi(PORTG,3);}//测试用////////////
009E ; global_flag_serie=0;
009E 2224 clr R2
00A0 3324 clr R3
00A2 30922900 sts _global_flag_serie+1,R3
00A6 20922800 sts _global_flag_serie,R2
00AA .dbline 65
00AA ; UCSR0A|=(1<<MPCM0);//准备接收地址
00AA 589A sbi 0xb,0
00AC .dbline 66
00AC ; }
00AC L13:
00AC L5:
00AC .dbline 67
00AC L2:
00AC .dbline -2
00AC L1:
00AC 0E940000 xcall pop_gset1
00B0 .dbline 0 ; func end
00B0 0895 ret
00B2 .dbsym r temp_data 20 i
00B2 .dbsym r i 20 i
00B2 .dbsym r SIG_UART0_RECV 16 I
00B2 .dbend
00B2 .dbfunc e SIGNAL _SIGNAL fI
00B2 ; i -> <dead>
00B2 ; temp2 -> R22,R23
00B2 ; temp1 -> R22,R23
00B2 ; int16_temp1 -> R20,R21
00B2 ; SIG_INTERRUPT7 -> R16,R17
.even
00B2 _SIGNAL::
00B2 0E940000 xcall push_gset2
00B6 .dbline -1
00B6 .dbline 74
00B6 ; }
00B6 ; //cbi(PORTE,2);//改为接收状态
00B6 ; //sei();
00B6 ; }
00B6 ;
00B6 ; //AD转换结束中断int7//////////////////
00B6 ; SIGNAL(SIG_INTERRUPT7)
00B6 ; {
00B6 .dbline 83
00B6 ; //变量定义
00B6 ; unsigned int int16_temp1;
00B6 ; unsigned int temp1,temp2,i;
00B6 ; //关中断
00B6 ; //cli();
00B6 ; //读取ad转换结果
00B6 ; //int16_temp1=AD7891_READ();
00B6 ; //如果是需要保存到RAM的采样
00B6 ; if(global_sample_mode_flag==0xFF)
00B6 80912200 lds R24,_global_sample_mode_flag
00BA 90912300 lds R25,_global_sample_mode_flag+1
00BE 8F3F cpi R24,255
00C0 E0E0 ldi R30,0
00C2 9E07 cpc R25,R30
00C4 09F0 breq X6
00C6 3CC0 xjmp L20
00C8 X6:
00C8 .dbline 84
00C8 ; {
00C8 .dbline 88
00C8 ; //AD7891 deselect,否则数据总线与RAM冲突
00C8 ; //sbi(PORTD,5);
00C8 ; //AD转换结果存入RAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -