📄 main.s
字号:
.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 + -