📄 minid.lst
字号:
029A F061 BEQ 0x02A7
029B 2344 TST R20
029C F051 BEQ 0x02A7
(0087) {
(0088) RED_ON();
029D B188 IN R24,0x08
029E 7088 ANDI R24,0x8
029F B988 OUT 0x08,R24
(0089) led_flicker(0,3);
02A0 E023 LDI R18,3
02A1 2700 CLR R16
02A2 D075 RCALL _led_flicker
(0090) sign = 0;
02A3 2744 CLR R20
(0091) g_Err_Det_Disable = 1;
02A4 E081 LDI R24,1
02A5 9380011F STS g_Err_Det_Disable,R24
(0092) }
(0093) if (det_err_motor_hall() && sign)
02A7 D065 RCALL _det_err_motor_hall
02A8 2300 TST R16
02A9 F059 BEQ 0x02B5
02AA 2344 TST R20
02AB F049 BEQ 0x02B5
(0094) {
(0095) RED_ON();
02AC B188 IN R24,0x08
02AD 7088 ANDI R24,0x8
02AE B988 OUT 0x08,R24
(0096) led_flicker(0,4);
02AF E024 LDI R18,4
02B0 2700 CLR R16
02B1 D066 RCALL _led_flicker
(0097) g_Err_Det_Disable = 1;
02B2 E081 LDI R24,1
02B3 9380011F STS g_Err_Det_Disable,R24
(0098) }
02B5 D5AF RCALL pop_gset1
02B6 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:
02B7 9B40 SBIS 0x08,0
02B8 C006 RJMP 0x02BF
(0108) {
(0109) g_ErrCode01 |= 0x01;
02B9 91800132 LDS R24,g_ErrCode01
02BB 6081 ORI R24,1
02BC 93800132 STS g_ErrCode01,R24
(0110) return 1;
02BE E001 LDI R16,1
02BF 9508 RET
(0111) }
(0112) }
(0113)
(0114) // 反转保护检测
(0115) // 当电机反转180度机械角,REV_MCU由高电平转到低电平;
(0116) byte det_err_inver_protect(void)
(0117) {
(0118) if ( ( REV_MCU() == 0 ) && (g_MotorRun) )
_det_err_inver_protect:
02C0 2422 CLR R2
02C1 F051 BEQ 0x02CC
02C2 90200130 LDS R2,g_MotorRun
02C4 2022 TST R2
02C5 F031 BEQ 0x02CC
(0119) {
(0120) g_ErrCode01 |= 0x02;
02C6 91800132 LDS R24,g_ErrCode01
02C8 6082 ORI R24,2
02C9 93800132 STS g_ErrCode01,R24
(0121) return 1;
02CB E001 LDI R16,1
02CC 9508 RET
(0122) }
(0123) }
(0124)
(0125) // 欠压检测
(0126) // 在定时器中断服务函数中检测
(0127) byte det_err_low_vol(void)
(0128) {
(0129) if (g_LowVol)
_det_err_low_vol:
02CD 9020012D LDS R2,g_LowVol
02CF 2022 TST R2
02D0 F031 BEQ 0x02D7
(0130) {
(0131) g_ErrCode01 |= 0x04;
02D1 91800132 LDS R24,g_ErrCode01
02D3 6084 ORI R24,4
02D4 93800132 STS g_ErrCode01,R24
(0132) return 1;
02D6 E001 LDI R16,1
02D7 9508 RET
(0133) }
(0134) }
(0135)
(0136) // 无停针信号检测
(0137) // 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
(0138) // 或者连续45次FG_MCU中断而上停针信号未监测到1次
(0139) // 的开关量g_NostopNeedle
(0140) byte det_err_no_stop_needle(void)
(0141) {
(0142) if (g_NostopNeedle)
_det_err_no_stop_needle:
02D8 9020012E LDS R2,g_NostopNeedle
02DA 2022 TST R2
02DB F031 BEQ 0x02E2
(0143) {
(0144) g_ErrCode01 |= 0x08;
02DC 91800132 LDS R24,g_ErrCode01
02DE 6088 ORI R24,0x8
02DF 93800132 STS g_ErrCode01,R24
(0145) return 1;
02E1 E001 LDI R16,1
02E2 9508 RET
(0146) }
(0147) }
(0148)
(0149) // 过压检测
(0150) // 在定时器中断服务函数中检测
(0151) byte det_err_over_vol(void)
(0152) {
(0153) if (g_OverVol)
_det_err_over_vol:
02E3 9020012C LDS R2,g_OverVol
02E5 2022 TST R2
02E6 F031 BEQ 0x02ED
(0154) {
(0155) g_ErrCode01 |= 0x10;
02E7 91800132 LDS R24,g_ErrCode01
02E9 6180 ORI R24,0x10
02EA 93800132 STS g_ErrCode01,R24
(0156) return 1;
02EC E001 LDI R16,1
02ED 9508 RET
(0157) }
(0158)
(0159) }
(0160)
(0161) // 电磁阀驱动回路过流短路故障检测
(0162) // 需提供电磁阀驱动回路电流大于200mA
(0163) // T_Fault 由高电平转到低电平
(0164) byte det_err_solenoid_short(void)
(0165) {
(0166) if (T_Fault() == 0)
_det_err_solenoid_short:
02EE 2422 CLR R2
02EF F031 BEQ 0x02F6
(0167) {
(0168) g_ErrCode01 |= 0x20;
02F0 91800132 LDS R24,g_ErrCode01
02F2 6280 ORI R24,0x20
02F3 93800132 STS g_ErrCode01,R24
(0169) return 1;
02F5 E001 LDI R16,1
02F6 9508 RET
(0170) }
(0171)
(0172) }
(0173)
(0174) // 同步编码器故障检测
(0175) // 需在连续12次FG_MCU中断而同步编码信号未监测到1次
(0176) // 置起变量 g_SynEncoderErr
(0177) byte det_err_syn_encoder(void)
(0178) {
(0179) if (g_SynEncoderErr )
_det_err_syn_encoder:
02F7 9020012A LDS R2,g_SynEncoderErr
02F9 2022 TST R2
02FA F031 BEQ 0x0301
(0180) {
(0181) g_ErrCode01 |= 0x40;
02FB 91800132 LDS R24,g_ErrCode01
02FD 6480 ORI R24,0x40
02FE 93800132 STS g_ErrCode01,R24
(0182) return 1;
0300 E001 LDI R16,1
0301 9508 RET
(0183) }
(0184)
(0185) }
(0186)
(0187) // 电机堵转检测
(0188) // 在定时器中断服务函数中检测
(0189) byte det_err_motor_block(void)
(0190) {
(0191) if (g_MotorBlock)
_det_err_motor_block:
0302 90200129 LDS R2,g_MotorBlock
0304 2022 TST R2
0305 F031 BEQ 0x030C
(0192) {
(0193) g_ErrCode01 |= 0x80;
0306 91800132 LDS R24,g_ErrCode01
0308 6880 ORI R24,0x80
0309 93800132 STS g_ErrCode01,R24
(0194) return 1;
030B E001 LDI R16,1
030C 9508 RET
(0195) }
(0196)
(0197) }
(0198)
(0199) // 电机HALL信号故障检测
(0200) // 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
(0201) // 置起 标志g_HallErr
(0202) byte det_err_motor_hall(void)
(0203) {
(0204) if (g_HallErr)
_det_err_motor_hall:
030D 90200127 LDS R2,g_HallErr
030F 2022 TST R2
0310 F031 BEQ 0x0317
(0205) {
(0206) g_ErrCode02 |= 0x01;
0311 91800131 LDS R24,g_ErrCode02
0313 6081 ORI R24,1
0314 93800131 STS g_ErrCode02,R24
(0207) return 1;
0316 E001 LDI R16,1
0317 9508 RET
(0208) }
(0209)
(0210) }
(0211)
(0212) #if 0
(0213) // 硬件过流处理
(0214) // 红灯LED长亮,绿灯熄灭
(0215) void deal_err_over_flow(void)
(0216) {
(0217) RED_ON();
(0218) GREEN_OFF();
(0219) }
(0220)
(0221) // 反转保护检测
(0222) // 红灯LED闪烁2下,绿灯熄灭
(0223) void deal_err_inver_protect(void)
(0224) {
(0225) led_flicker(1,2);
(0226) GREEN_OFF();
(0227) }
(0228)
(0229) // 欠压检测
(0230) // 红灯LED闪烁3下,绿灯熄灭
(0231) void deal_err_low_vol(void)
(0232) {
(0233) led_flicker(1,3);
(0234) GREEN_OFF();
(0235) }
(0236)
(0237) // 无停针信号检测
(0238) // 红灯LED闪烁4下,绿灯熄灭
(0239) void deal_err_no_stop_needle(void)
(0240) {
(0241) led_flicker(1,4);
(0242) GREEN_OFF();
(0243) }
(0244)
(0245) // 过压检测
(0246) // 红灯LED闪烁5下,绿灯熄灭
(0247) void deal_err_over_vol(void)
(0248) {
(0249) led_flicker(1,5);
(0250) GREEN_OFF();
(0251) }
(0252)
(0253) // 电磁阀驱动回路过流短路故障检测
(0254) // 红灯LED长亮,绿灯闪烁1下
(0255) void deal_err_solenoid_short(void)
(0256) {
(0257) RED_ON();
(0258) led_flicker(0,1);
(0259) }
(0260)
(0261) // 同步编码器故障检测
(0262) // 红灯LED长亮,绿灯闪烁2下
(0263) void deal_err_syn_encoder(void)
(0264) {
(0265) RED_ON();
(0266) led_flicker(0,2);
(0267) }
(0268)
(0269) // 电机堵转检测
(0270) // 红灯LED长亮,绿灯闪烁3下
(0271) void deal_err_motor_block(void)
(0272) {
(0273) RED_ON();
(0274) led_flicker(0,3);
(0275) }
(0276)
(0277) // 电机HALL信号故障检测
(0278) // 红灯LED长亮,绿灯闪烁4下
(0279) void deal_err_motor_hall(void)
(0280) {
(0281) RED_ON();
(0282) led_flicker(0,4);
(0283) }
(0284) #endif
(0285)
(0286) /****************************************************
(0287)
(0288)
(0289) 控制LED 灯闪烁函数
(0290) 参数type : 1 表示控制红灯 0 表示控制绿灯
(0291) 参数times : 闪烁的次数
(0292)
(0293) *****************************************************/
(0294) void led_flicker(byte type,byte times)
(0295) {
(0296) g_LedTimesT1 = 0;
_led_flicker:
times --> R18
type --> R16
0318 2422 CLR R2
0319 92200123 STS g_LedTimesT1,R2
(0297) g_LedTimesT2 = 0;
031B 92200122 STS g_LedTimesT2,R2
(0298) g_LedTimesT3 = 0;
031D 2433 CLR R3
031E 92300114 STS g_LedTimesT3+1,R3
0320 92200113 STS g_LedTimesT3,R2
(0299)
(0300) g_LedType = type;
0322 93000126 STS g_LedType,R16
(0301) g_LedTimes = times;
0324 93200124 STS g_LedTimes,R18
(0302) g_LedTimesCnt = times;
0326 93200125 STS g_LedTimesCnt,R18
(0303) g_StartLedFlick = 1;
0328 E081 LDI R24,1
0329 93800121 STS g_StartLedFlick,R24
032B 9508 RET
_electromagne_ctrl:
ctrl --> R18
target --> R16
032C D535 RCALL push_gset1
(0304) }
(0305)
(0306)
(0307)
(0308)
(0309) // 电磁铁控制函数
(0310) // 参数 target : 电磁铁序号1~3
(0311) // 参数 ctrl : 1 启动 0 停止
(0312) void electromagne_ctrl(byte target ,byte ctrl)
(0313) {
(0314) switch (target)
032D 2F40 MOV R20,R16
032E 2755 CLR R21
032F 3041 CPI R20,1
0330 E0E0 LDI R30,0
0331 075E CPC R21,R30
0332 F049 BEQ 0x033C
0333 3042 CPI R20,2
0334 E0E0 LDI R30,0
0335 075E CPC R21,R30
0336 F069 BEQ 0x0344
0337 3043 CPI R20,3
0338 E0E0 LDI R30,0
0339 075E CPC R21,R30
033A F089 BEQ 0x034C
033B C017 RJMP 0x0353
(0315) {
(0316) case 1:
(0317) if (ctrl)
033C 2322 TST R18
033D F021 BEQ 0x0342
(0318) {
(0319) E_MAG1_ON();
033E B185 IN R24,0x05
033F 7088 ANDI R24,0x8
0340 B985 OUT 0x05,R24
(0320) }
0341 C011 RJMP 0x0353
(0321) else
(0322) {
(0323) E_MAG1_OFF();
0342 9A2B SBI 0x05,3
(0324) }
(0325) break;
0343 C00F RJMP 0x0353
(0326)
(0327) case 2:
(0328) if (ctrl)
0344 2322 TST R18
0345 F021 BEQ 0x034A
(0329) {
(0330) E_MAG2_ON();
0346 B18B IN R24,0x0B
0347 7280 ANDI R24,0x20
0348 B98B OUT 0x0B,R24
(0331) }
0349 C009 RJMP 0x0353
(0332) else
(0333) {
(0334) E_MAG2_OFF();
034A 9A5D SBI 0x0B,5
(0335) }
(0336) break;
034B C007 RJMP 0x0353
(0337)
(0338) case 3:
(0339) if (ctrl)
034C 2322 TST R18
034D F021 BEQ 0x0352
(0340) {
(0341) E_MAG3_ON();
034E B185 IN R24,0x05
034F 7084 ANDI R24,4
0350 B985 OUT 0x05,R24
(0342) }
0351 C001 RJMP 0x0353
(0343) else
(0344) {
(0345) E_MAG3_OFF();
0352 9A2A SBI 0x05,2
(0346) }
(0347) break;
(0348)
(0349) default:
(0350) break;
0353 D511 RCALL pop_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -