📄 err.s
字号:
.module Err.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ERR\Err.c
.dbfunc e det_err _det_err fV
; sign -> R20
.even
_det_err::
rcall push_gset1
.dbline -1
.dbline 29
; /*****************************************************************
; * 文件名: Err.c
; * 版本号:
; * 创作日期: 2005.7.13
; * 作者: Zhoujie
; * 功能说明: 故障检测与故障处理
; * 其它说明:
;
; *****************************************************************/
;
;
; /*****************************************************************
;
; * 修改日期:
; * 修改人:
; * 修改原因:
;
; *******************************************************************/
;
; #include "Err.h"
;
; // 检测以及处理故障函数
; // 依次检测是否出现各种故障
; // 按照检测到的先后顺序
; // 控制LED 灯显示最先检测到的故障
; // 随后检测到的故障将相应的错误位置起来
; // 怎样清除故障显示 ?
; void det_err(void)
; {
.dbline 32
; byte sign;
;
; if (g_Err_Det_Disable)
lds R2,_g_Err_Det_Disable
tst R2
breq L2
.dbline 33
; return;
rjmp L1
L2:
.dbline 35
;
; sign = 1;
ldi R20,1
.dbline 37
;
; if (det_err_over_flow())
rcall _det_err_over_flow
tst R16
breq L4
.dbline 38
; {
.dbline 39
; RED_ON();
cbi 0x8,2
.dbline 40
; GREEN_OFF();
sbi 0x8,3
.dbline 41
; sign = 0;
clr R20
.dbline 42
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 43
; }
L4:
.dbline 44
; if ( (det_err_inver_protect()) && sign )
rcall _det_err_inver_protect
tst R16
breq L6
tst R20
breq L6
.dbline 45
; {
.dbline 46
; led_flicker(1,2);
ldi R18,2
ldi R16,1
rcall _led_flicker
.dbline 47
; GREEN_OFF();
sbi 0x8,3
.dbline 48
; sign = 0;
clr R20
.dbline 49
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 50
; }
L6:
.dbline 51
; if ((det_err_low_vol()) && sign )
rcall _det_err_low_vol
tst R16
breq L8
tst R20
breq L8
.dbline 52
; {
.dbline 53
; led_flicker(1,3);
ldi R18,3
ldi R16,1
rcall _led_flicker
.dbline 54
; GREEN_OFF();
sbi 0x8,3
.dbline 55
; sign = 0;
clr R20
.dbline 56
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 57
; }
L8:
.dbline 58
; if (( det_err_no_stop_needle()) && sign)
rcall _det_err_no_stop_needle
tst R16
breq L10
tst R20
breq L10
.dbline 59
; {
.dbline 60
; led_flicker(1,4);
ldi R18,4
ldi R16,1
rcall _led_flicker
.dbline 61
; GREEN_OFF();
sbi 0x8,3
.dbline 62
; sign = 0;
clr R20
.dbline 63
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 64
; }
L10:
.dbline 65
; if ((det_err_over_vol()) && sign )
rcall _det_err_over_vol
tst R16
breq L12
tst R20
breq L12
.dbline 66
; {
.dbline 67
; led_flicker(1,5);
ldi R18,5
ldi R16,1
rcall _led_flicker
.dbline 68
; GREEN_OFF();
sbi 0x8,3
.dbline 69
; sign = 0;
clr R20
.dbline 70
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 71
; }
L12:
.dbline 72
; if ((det_err_solenoid_short()) && sign )
rcall _det_err_solenoid_short
tst R16
breq L14
tst R20
breq L14
.dbline 73
; {
.dbline 74
; RED_ON();
cbi 0x8,2
.dbline 75
; led_flicker(0,1);
ldi R18,1
clr R16
rcall _led_flicker
.dbline 76
; sign = 0;
clr R20
.dbline 77
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 78
; }
L14:
.dbline 79
; if ((det_err_syn_encoder()) && sign )
rcall _det_err_syn_encoder
tst R16
breq L16
tst R20
breq L16
.dbline 80
; {
.dbline 81
; RED_ON();
cbi 0x8,2
.dbline 82
; led_flicker(0,2);
ldi R18,2
clr R16
rcall _led_flicker
.dbline 83
; sign = 0;
clr R20
.dbline 84
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 85
; }
L16:
.dbline 86
; if ((det_err_motor_block()) && sign )
rcall _det_err_motor_block
tst R16
breq L18
tst R20
breq L18
.dbline 87
; {
.dbline 88
; RED_ON();
cbi 0x8,2
.dbline 89
; led_flicker(0,3);
ldi R18,3
clr R16
rcall _led_flicker
.dbline 90
; sign = 0;
clr R20
.dbline 91
; g_Err_Det_Disable = 1;
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 92
; }
L18:
.dbline 93
rcall _det_err_motor_hall
tst R16
breq L20
tst R20
breq L20
.dbline 94
.dbline 95
cbi 0x8,2
.dbline 96
ldi R18,4
clr R16
rcall _led_flicker
.dbline 97
ldi R24,1
sts _g_Err_Det_Disable,R24
.dbline 98
L20:
.dbline -2
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r sign 20 c
.dbend
.dbfunc e det_err_over_flow _det_err_over_flow fc
.even
_det_err_over_flow::
.dbline -1
.dbline 106
; if (det_err_motor_hall() && sign)
; {
; RED_ON();
; led_flicker(0,4);
; g_Err_Det_Disable = 1;
; }
;
; }
;
;
; // 硬件过流检测
; // 需要A/D 模块控制当母线电流大于20A,FO_MCU由低电平转到高电平
; byte det_err_over_flow(void)
; {
.dbline 107
; if ( FO_MCU() != 0 )
sbis 0x6,1
rjmp L23
.dbline 108
; {
.dbline 109
; g_ErrCode01 |= 0x01;
lds R24,_g_ErrCode01
ori R24,1
sts _g_ErrCode01,R24
.dbline 110
; return 1;
ldi R16,1
rjmp L22
L23:
.dbline 113
; }
; else
; return 0;
clr R16
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_inver_protect _det_err_inver_protect fc
.even
_det_err_inver_protect::
.dbline -1
.dbline 119
; }
;
; // 反转保护检测
; // 当电机反转180度机械角,REV_MCU由高电平转到低电平;
; byte det_err_inver_protect(void)
; {
.dbline 120
; if ( ( REV_MCU() == 0 ) && (g_MotorRun) )
sbic 0x9,4
rjmp L26
lds R2,_g_MotorRun
tst R2
breq L26
.dbline 121
; {
.dbline 122
; g_ErrCode01 |= 0x02;
lds R24,_g_ErrCode01
ori R24,2
sts _g_ErrCode01,R24
.dbline 123
; return 1;
ldi R16,1
rjmp L25
L26:
.dbline 126
; }
; else
; return 0;
clr R16
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_low_vol _det_err_low_vol fc
.even
_det_err_low_vol::
.dbline -1
.dbline 132
; }
;
; // 欠压检测
; // 在定时器中断服务函数中检测
; byte det_err_low_vol(void)
; {
.dbline 133
; if (g_LowVol)
lds R2,_g_LowVol
tst R2
breq L29
.dbline 134
; {
.dbline 135
; g_ErrCode01 |= 0x04;
lds R24,_g_ErrCode01
ori R24,4
sts _g_ErrCode01,R24
.dbline 136
; return 1;
ldi R16,1
rjmp L28
L29:
.dbline 139
; }
; else
; return 0;
clr R16
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_no_stop_needle _det_err_no_stop_needle fc
.even
_det_err_no_stop_needle::
.dbline -1
.dbline 147
; }
;
; // 无停针信号检测
; // 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
; // 或者连续45次FG_MCU中断而上停针信号未监测到1次
; // 的开关量g_NostopNeedle
; byte det_err_no_stop_needle(void)
; {
.dbline 148
; if (g_NostopNeedle)
lds R2,_g_NostopNeedle
tst R2
breq L32
.dbline 149
; {
.dbline 150
; g_ErrCode01 |= 0x08;
lds R24,_g_ErrCode01
ori R24,8
sts _g_ErrCode01,R24
.dbline 151
; return 1;
ldi R16,1
rjmp L31
L32:
.dbline 154
; }
; else
; return 0;
clr R16
.dbline -2
L31:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_over_vol _det_err_over_vol fc
.even
_det_err_over_vol::
.dbline -1
.dbline 160
; }
;
; // 过压检测
; // 在定时器中断服务函数中检测
; byte det_err_over_vol(void)
; {
.dbline 161
; if (g_OverVol)
lds R2,_g_OverVol
tst R2
breq L35
.dbline 162
; {
.dbline 163
; g_ErrCode01 |= 0x10;
lds R24,_g_ErrCode01
ori R24,16
sts _g_ErrCode01,R24
.dbline 164
; return 1;
ldi R16,1
rjmp L34
L35:
.dbline 167
; }
; else
; return 0;
clr R16
.dbline -2
L34:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_solenoid_short _det_err_solenoid_short fc
.even
_det_err_solenoid_short::
.dbline -1
.dbline 175
;
; }
;
; // 电磁阀驱动回路过流短路故障检测
; // 需提供电磁阀驱动回路电流大于200mA
; // T_Fault 由高电平转到低电平
; byte det_err_solenoid_short(void)
; {
.dbline 176
; if (T_Fault() == 0)
sbic 0x9,1
rjmp L38
.dbline 177
; {
.dbline 178
; g_ErrCode01 |= 0x20;
lds R24,_g_ErrCode01
ori R24,32
sts _g_ErrCode01,R24
.dbline 179
; return 1;
ldi R16,1
rjmp L37
L38:
.dbline 182
; }
; else
; return 0;
clr R16
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_syn_encoder _det_err_syn_encoder fc
.even
_det_err_syn_encoder::
.dbline -1
.dbline 190
;
; }
;
; // 同步编码器故障检测
; // 需在连续12次FG_MCU中断而同步编码信号未监测到1次
; // 置起变量 g_SynEncoderErr
; byte det_err_syn_encoder(void)
; {
.dbline 191
; if (g_SynEncoderErr )
lds R2,_g_SynEncoderErr
tst R2
breq L41
.dbline 192
; {
.dbline 193
; g_ErrCode01 |= 0x40;
lds R24,_g_ErrCode01
ori R24,64
sts _g_ErrCode01,R24
.dbline 194
; return 1;
ldi R16,1
rjmp L40
L41:
.dbline 197
; }
; else
; return 0;
clr R16
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_motor_block _det_err_motor_block fc
.even
_det_err_motor_block::
.dbline -1
.dbline 204
;
; }
;
; // 电机堵转检测
; // 在定时器中断服务函数中检测
; byte det_err_motor_block(void)
; {
.dbline 205
; if (g_MotorBlock)
lds R2,_g_MotorBlock
tst R2
breq L44
.dbline 206
; {
.dbline 207
; g_ErrCode01 |= 0x80;
lds R24,_g_ErrCode01
ori R24,128
sts _g_ErrCode01,R24
.dbline 208
; return 1;
ldi R16,1
rjmp L43
L44:
.dbline 211
; }
; else
; return 0;
clr R16
.dbline -2
L43:
.dbline 0 ; func end
ret
.dbend
.dbfunc e det_err_motor_hall _det_err_motor_hall fc
.even
_det_err_motor_hall::
.dbline -1
.dbline 219
;
; }
;
; // 电机HALL信号故障检测
; // 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
; // 置起 标志g_HallErr
; byte det_err_motor_hall(void)
; {
.dbline 220
; if (g_HallErr)
lds R2,_g_HallErr
tst R2
breq L47
.dbline 221
; {
.dbline 222
; g_ErrCode02 |= 0x01;
lds R24,_g_ErrCode02
ori R24,1
sts _g_ErrCode02,R24
.dbline 223
; return 1;
ldi R16,1
rjmp L46
L47:
.dbline 226
; }
; else
; return 0;
clr R16
.dbline -2
L46:
.dbline 0 ; func end
ret
.dbend
.dbfunc e led_flicker _led_flicker fV
; times -> R18
; type -> R16
.even
_led_flicker::
.dbline -1
.dbline 313
;
; }
;
; #if 0
; // 硬件过流处理
; // 红灯LED长亮,绿灯熄灭
; void deal_err_over_flow(void)
; {
; RED_ON();
; GREEN_OFF();
; }
;
; // 反转保护检测
; // 红灯LED闪烁2下,绿灯熄灭
; void deal_err_inver_protect(void)
; {
; led_flicker(1,2);
; GREEN_OFF();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -