📄 err_debug.lst
字号:
__text_start:
__start:
001A EFCF LDI R28,0xFF
001B E0D4 LDI R29,4
001C BFCD OUT 0x3D,R28
001D BFDE OUT 0x3E,R29
001E 52C0 SUBI R28,0x20
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD Y+0,R16
0022 2400 CLR R0
0023 E0E0 LDI R30,0
0024 E0F1 LDI R31,1
0025 E011 LDI R17,1
0026 32E0 CPI R30,0x20
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD Z+0,R16
002C E3E4 LDI R30,0x34
002D E0F0 LDI R31,0
002E E0A0 LDI R26,0
002F E0B1 LDI R27,1
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D25B RCALL _main
_exit:
0039 CFFF RJMP _exit
_det_err:
sign --> R20
003A D26C RCALL push_gset1
FILE: D:\bak\新建文件夹\函数库\ERR\Err.c
(0001) /*****************************************************************
(0002) * 文件名: Err.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.13
(0005) * 作者: Zhoujie
(0006) * 功能说明: 故障检测与故障处理
(0007) * 其它说明:
(0008)
(0009) *****************************************************************/
(0010)
(0011)
(0012) /*****************************************************************
(0013)
(0014) * 修改日期:
(0015) * 修改人:
(0016) * 修改原因:
(0017)
(0018) *******************************************************************/
(0019)
(0020) #include "Err.h"
(0021)
(0022) // 检测以及处理故障函数
(0023) // 依次检测是否出现各种故障
(0024) // 按照检测到的先后顺序
(0025) // 控制LED 灯显示最先检测到的故障
(0026) // 随后检测到的故障将相应的错误位置起来
(0027) // 怎样清除故障显示 ?
(0028) void det_err(void)
(0029) {
(0030) byte sign;
(0031)
(0032) if (g_Err_Det_Disable)
003B 9020010C LDS R2,g_Err_Det_Disable
003D 2022 TST R2
003E F009 BEQ 0x0040
(0033) return;
003F C071 RJMP 0x00B1
(0034)
(0035) sign = 1;
0040 E041 LDI R20,1
(0036)
(0037) if (det_err_over_flow())
0041 D071 RCALL _det_err_over_flow
0042 2300 TST R16
0043 F031 BEQ 0x004A
(0038) {
(0039) RED_ON();
0044 9842 CBI 0x08,2
(0040) GREEN_OFF();
0045 9A43 SBI 0x08,3
(0041) sign = 0;
0046 2744 CLR R20
(0042) g_Err_Det_Disable = 1;
0047 E081 LDI R24,1
0048 9380010C STS g_Err_Det_Disable,R24
(0043) }
(0044) if ( (det_err_inver_protect()) && sign )
004A D073 RCALL _det_err_inver_protect
004B 2300 TST R16
004C F051 BEQ 0x0057
004D 2344 TST R20
004E F041 BEQ 0x0057
(0045) {
(0046) led_flicker(1,2);
004F E022 LDI R18,2
0050 E001 LDI R16,1
0051 D0D4 RCALL _led_flicker
(0047) GREEN_OFF();
0052 9A43 SBI 0x08,3
(0048) sign = 0;
0053 2744 CLR R20
(0049) g_Err_Det_Disable = 1;
0054 E081 LDI R24,1
0055 9380010C STS g_Err_Det_Disable,R24
(0050) }
(0051) if ((det_err_low_vol()) && sign )
0057 D075 RCALL _det_err_low_vol
0058 2300 TST R16
0059 F051 BEQ 0x0064
005A 2344 TST R20
005B F041 BEQ 0x0064
(0052) {
(0053) led_flicker(1,3);
005C E023 LDI R18,3
005D E001 LDI R16,1
005E D0C7 RCALL _led_flicker
(0054) GREEN_OFF();
005F 9A43 SBI 0x08,3
(0055) sign = 0;
0060 2744 CLR R20
(0056) g_Err_Det_Disable = 1;
0061 E081 LDI R24,1
0062 9380010C STS g_Err_Det_Disable,R24
(0057) }
(0058) if (( det_err_no_stop_needle()) && sign)
0064 D075 RCALL _det_err_no_stop_needle
0065 2300 TST R16
0066 F051 BEQ 0x0071
0067 2344 TST R20
0068 F041 BEQ 0x0071
(0059) {
(0060) led_flicker(1,4);
0069 E024 LDI R18,4
006A E001 LDI R16,1
006B D0BA RCALL _led_flicker
(0061) GREEN_OFF();
006C 9A43 SBI 0x08,3
(0062) sign = 0;
006D 2744 CLR R20
(0063) g_Err_Det_Disable = 1;
006E E081 LDI R24,1
006F 9380010C STS g_Err_Det_Disable,R24
(0064) }
(0065) if ((det_err_over_vol()) && sign )
0071 D075 RCALL _det_err_over_vol
0072 2300 TST R16
0073 F051 BEQ 0x007E
0074 2344 TST R20
0075 F041 BEQ 0x007E
(0066) {
(0067) led_flicker(1,5);
0076 E025 LDI R18,5
0077 E001 LDI R16,1
0078 D0AD RCALL _led_flicker
(0068) GREEN_OFF();
0079 9A43 SBI 0x08,3
(0069) sign = 0;
007A 2744 CLR R20
(0070) g_Err_Det_Disable = 1;
007B E081 LDI R24,1
007C 9380010C STS g_Err_Det_Disable,R24
(0071) }
(0072) if ((det_err_solenoid_short()) && sign )
007E D075 RCALL _det_err_solenoid_short
007F 2300 TST R16
0080 F051 BEQ 0x008B
0081 2344 TST R20
0082 F041 BEQ 0x008B
(0073) {
(0074) RED_ON();
0083 9842 CBI 0x08,2
(0075) led_flicker(0,1);
0084 E021 LDI R18,1
0085 2700 CLR R16
0086 D09F RCALL _led_flicker
(0076) sign = 0;
0087 2744 CLR R20
(0077) g_Err_Det_Disable = 1;
0088 E081 LDI R24,1
0089 9380010C STS g_Err_Det_Disable,R24
(0078) }
(0079) if ((det_err_syn_encoder()) && sign )
008B D073 RCALL _det_err_syn_encoder
008C 2300 TST R16
008D F051 BEQ 0x0098
008E 2344 TST R20
008F F041 BEQ 0x0098
(0080) {
(0081) RED_ON();
0090 9842 CBI 0x08,2
(0082) led_flicker(0,2);
0091 E022 LDI R18,2
0092 2700 CLR R16
0093 D092 RCALL _led_flicker
(0083) sign = 0;
0094 2744 CLR R20
(0084) g_Err_Det_Disable = 1;
0095 E081 LDI R24,1
0096 9380010C STS g_Err_Det_Disable,R24
(0085) }
(0086) if ((det_err_motor_block()) && sign )
0098 D073 RCALL _det_err_motor_block
0099 2300 TST R16
009A F051 BEQ 0x00A5
009B 2344 TST R20
009C F041 BEQ 0x00A5
(0087) {
(0088) RED_ON();
009D 9842 CBI 0x08,2
(0089) led_flicker(0,3);
009E E023 LDI R18,3
009F 2700 CLR R16
00A0 D085 RCALL _led_flicker
(0090) sign = 0;
00A1 2744 CLR R20
(0091) g_Err_Det_Disable = 1;
00A2 E081 LDI R24,1
00A3 9380010C STS g_Err_Det_Disable,R24
(0092) }
(0093) if (det_err_motor_hall() && sign)
00A5 D073 RCALL _det_err_motor_hall
00A6 2300 TST R16
00A7 F049 BEQ 0x00B1
00A8 2344 TST R20
00A9 F039 BEQ 0x00B1
(0094) {
(0095) RED_ON();
00AA 9842 CBI 0x08,2
(0096) led_flicker(0,4);
00AB E024 LDI R18,4
00AC 2700 CLR R16
00AD D078 RCALL _led_flicker
(0097) g_Err_Det_Disable = 1;
00AE E081 LDI R24,1
00AF 9380010C STS g_Err_Det_Disable,R24
(0098) }
00B1 D1F8 RCALL pop_gset1
00B2 9508 RET
(0099)
(0100) }
(0101)
(0102)
(0103) // 硬件过流检测
(0104) // 需要A/D 模块控制当母线电流大于20A,FO_MCU由低电平转到高电平
(0105) byte det_err_over_flow(void)
(0106) {
(0107) if ( FO_MCU() != 0 )
_det_err_over_flow:
00B3 9B31 SBIS 0x06,1
00B4 C007 RJMP 0x00BC
(0108) {
(0109) g_ErrCode01 |= 0x01;
00B5 9180011F LDS R24,g_ErrCode01
00B7 6081 ORI R24,1
00B8 9380011F STS g_ErrCode01,R24
(0110) return 1;
00BA E001 LDI R16,1
00BB C001 RJMP 0x00BD
(0111) }
(0112) else
(0113) return 0;
00BC 2700 CLR R16
00BD 9508 RET
(0114) }
(0115)
(0116) // 反转保护检测
(0117) // 当电机反转180度机械角,REV_MCU由高电平转到低电平;
(0118) byte det_err_inver_protect(void)
(0119) {
(0120) if ( ( REV_MCU() == 0 ) && (g_MotorRun) )
_det_err_inver_protect:
00BE 994C SBIC 0x09,4
00BF C00B RJMP 0x00CB
00C0 9020011D LDS R2,g_MotorRun
00C2 2022 TST R2
00C3 F039 BEQ 0x00CB
(0121) {
(0122) g_ErrCode01 |= 0x02;
00C4 9180011F LDS R24,g_ErrCode01
00C6 6082 ORI R24,2
00C7 9380011F STS g_ErrCode01,R24
(0123) return 1;
00C9 E001 LDI R16,1
00CA C001 RJMP 0x00CC
(0124) }
(0125) else
(0126) return 0;
00CB 2700 CLR R16
00CC 9508 RET
(0127) }
(0128)
(0129) // 欠压检测
(0130) // 在定时器中断服务函数中检测
(0131) byte det_err_low_vol(void)
(0132) {
(0133) if (g_LowVol)
_det_err_low_vol:
00CD 9020011A LDS R2,g_LowVol
00CF 2022 TST R2
00D0 F039 BEQ 0x00D8
(0134) {
(0135) g_ErrCode01 |= 0x04;
00D1 9180011F LDS R24,g_ErrCode01
00D3 6084 ORI R24,4
00D4 9380011F STS g_ErrCode01,R24
(0136) return 1;
00D6 E001 LDI R16,1
00D7 C001 RJMP 0x00D9
(0137) }
(0138) else
(0139) return 0;
00D8 2700 CLR R16
00D9 9508 RET
(0140) }
(0141)
(0142) // 无停针信号检测
(0143) // 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
(0144) // 或者连续45次FG_MCU中断而上停针信号未监测到1次
(0145) // 的开关量g_NostopNeedle
(0146) byte det_err_no_stop_needle(void)
(0147) {
(0148) if (g_NostopNeedle)
_det_err_no_stop_needle:
00DA 9020011B LDS R2,g_NostopNeedle
00DC 2022 TST R2
00DD F039 BEQ 0x00E5
(0149) {
(0150) g_ErrCode01 |= 0x08;
00DE 9180011F LDS R24,g_ErrCode01
00E0 6088 ORI R24,0x8
00E1 9380011F STS g_ErrCode01,R24
(0151) return 1;
00E3 E001 LDI R16,1
00E4 C001 RJMP 0x00E6
(0152) }
(0153) else
(0154) return 0;
00E5 2700 CLR R16
00E6 9508 RET
(0155) }
(0156)
(0157) // 过压检测
(0158) // 在定时器中断服务函数中检测
(0159) byte det_err_over_vol(void)
(0160) {
(0161) if (g_OverVol)
_det_err_over_vol:
00E7 90200119 LDS R2,g_OverVol
00E9 2022 TST R2
00EA F039 BEQ 0x00F2
(0162) {
(0163) g_ErrCode01 |= 0x10;
00EB 9180011F LDS R24,g_ErrCode01
00ED 6180 ORI R24,0x10
00EE 9380011F STS g_ErrCode01,R24
(0164) return 1;
00F0 E001 LDI R16,1
00F1 C001 RJMP 0x00F3
(0165) }
(0166) else
(0167) return 0;
00F2 2700 CLR R16
00F3 9508 RET
(0168)
(0169) }
(0170)
(0171) // 电磁阀驱动回路过流短路故障检测
(0172) // 需提供电磁阀驱动回路电流大于200mA
(0173) // T_Fault 由高电平转到低电平
(0174) byte det_err_solenoid_short(void)
(0175) {
(0176) if (T_Fault() == 0)
_det_err_solenoid_short:
00F4 9949 SBIC 0x09,1
00F5 C007 RJMP 0x00FD
(0177) {
(0178) g_ErrCode01 |= 0x20;
00F6 9180011F LDS R24,g_ErrCode01
00F8 6280 ORI R24,0x20
00F9 9380011F STS g_ErrCode01,R24
(0179) return 1;
00FB E001 LDI R16,1
00FC C001 RJMP 0x00FE
(0180) }
(0181) else
(0182) return 0;
00FD 2700 CLR R16
00FE 9508 RET
(0183)
(0184) }
(0185)
(0186) // 同步编码器故障检测
(0187) // 需在连续12次FG_MCU中断而同步编码信号未监测到1次
(0188) // 置起变量 g_SynEncoderErr
(0189) byte det_err_syn_encoder(void)
(0190) {
(0191) if (g_SynEncoderErr )
_det_err_syn_encoder:
00FF 90200117 LDS R2,g_SynEncoderErr
0101 2022 TST R2
0102 F039 BEQ 0x010A
(0192) {
(0193) g_ErrCode01 |= 0x40;
0103 9180011F LDS R24,g_ErrCode01
0105 6480 ORI R24,0x40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -