📄 minid.lst
字号:
0163 9508 RET
FILE: D:\bak\新建文件夹\函数库\ENC\ENC.c
(0001) /*****************************************************************
(0002) * 文件名: ENC.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.7
(0005) * 作者: wangzq
(0006) * 功能说明: 采集转速数值
(0007)
(0008) * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
(0009)
(0010) *****************************************************************/
(0011)
(0012)
(0013) /*****************************************************************
(0014)
(0015) * 修改日期:
(0016) * 修改人:
(0017) * 修改原因:
(0018)
(0019) *******************************************************************/
(0020)
(0021)
(0022) //包含文件
(0023) #include "ENC.h"
(0024)
(0025) //TIMER1 initialize - prescale:1
(0026) // WGM: 0) Normal, TOP=0xFFFF
(0027) // desired value:
(0028) // actual value: Out of range
(0029) void timer1_init(void)
(0030) {
(0031) TCCR1B = 0x00; //stop
_timer1_init:
0164 2422 CLR R2
0165 92200081 STS 0x81,R2
(0032) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
0167 92200085 STS 0x85,R2
(0033) TCNT1L = 0x00 /*INVALID SETTING*/;
0169 92200084 STS 0x84,R2
(0034) OCR1AH = 0x00 /*INVALID SETTING*/;
016B 92200089 STS 0x89,R2
(0035) OCR1AL = 0x00 /*INVALID SETTING*/;
016D 92200088 STS 0x88,R2
(0036) OCR1BH = 0x00 /*INVALID SETTING*/;
016F 9220008B STS 0x8B,R2
(0037) OCR1BL = 0x00 /*INVALID SETTING*/;
0171 9220008A STS 0x8A,R2
(0038) ICR1H = 0x00 /*INVALID SETTING*/;
0173 92200087 STS 0x87,R2
(0039) ICR1L = 0x00 /*INVALID SETTING*/;
0175 92200086 STS 0x86,R2
(0040) TCCR1A = 0x00;
0177 92200080 STS 0x80,R2
(0041) TCCR1B = 0xC1; //start Timer
0179 EC81 LDI R24,0xC1
017A 93800081 STS 0x81,R24
017C 9508 RET
_timer1_capt_isr:
017D 922A ST R2,-Y
017E 923A ST R3,-Y
017F 924A ST R4,-Y
0180 925A ST R5,-Y
0181 928A ST R8,-Y
0182 929A ST R9,-Y
0183 938A ST R24,-Y
0184 939A ST R25,-Y
0185 93EA ST R30,-Y
0186 B62F IN R2,0x3F
0187 922A ST R2,-Y
0188 D6D7 RCALL push_gset2
(0042) }
(0043)
(0044) #pragma interrupt_handler timer1_capt_isr:11
(0045) void timer1_capt_isr(void)
(0046) {
(0047) g_CntUpdate = ICR1L;
0189 90200086 LDS R2,0x86
018B 2433 CLR R3
018C 9230013A STS g_CntUpdate+1,R3
018E 92200139 STS g_CntUpdate,R2
(0048) g_CntUpdate |=(int)ICR1H << 8;
0190 90200087 LDS R2,0x87
0192 2433 CLR R3
0193 2C32 MOV R3,R2
0194 2422 CLR R2
0195 90400139 LDS R4,g_CntUpdate
0197 9050013A LDS R5,g_CntUpdate+1
0199 2842 OR R4,R2
019A 2853 OR R5,R3
019B 9250013A STS g_CntUpdate+1,R5
019D 92400139 STS g_CntUpdate,R4
(0049)
(0050) if ((TIFR1&0x01) != 0) //判断定时器1溢出
019F 9BB0 SBIS 0x16,0
01A0 C006 RJMP 0x01A7
(0051) {
(0052) g_TotalEnc++;
01A1 9180013B LDS R24,g_TotalEnc
01A3 5F8F SUBI R24,0xFF
01A4 9380013B STS g_TotalEnc,R24
(0053) TIFR1 |= 0x01; //取消定时器1溢出标志位
01A6 9AB0 SBI 0x16,0
(0054) }
(0055)
(0056) if (g_CntOld < g_CntUpdate)
01A7 90200139 LDS R2,g_CntUpdate
01A9 9030013A LDS R3,g_CntUpdate+1
01AB 90400137 LDS R4,g_CntOld
01AD 90500138 LDS R5,g_CntOld+1
01AF 1442 CP R4,R2
01B0 0453 CPC R5,R3
01B1 F498 BCC 0x01C5
(0057) {
(0058) g_DeltaEnc = g_CntUpdate - g_CntOld;
01B2 0112 MOVW R2,R4
01B3 90400139 LDS R4,g_CntUpdate
01B5 9050013A LDS R5,g_CntUpdate+1
01B7 1842 SUB R4,R2
01B8 0853 SBC R5,R3
01B9 0112 MOVW R2,R4
01BA 2444 CLR R4
01BB 2455 CLR R5
01BC 92300134 STS g_DeltaEnc+1,R3
01BE 92200133 STS g_DeltaEnc,R2
01C0 92500136 STS g_DeltaEnc+3,R5
01C2 92400135 STS g_DeltaEnc+2,R4
(0059)
(0060) }
01C4 C020 RJMP 0x01E5
(0061) else
(0062) {
(0063) g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
01C5 90200137 LDS R2,g_CntOld
01C7 90300138 LDS R3,g_CntOld+1
01C9 2444 CLR R4
01CA 2455 CLR R5
01CB E040 LDI R20,0
01CC E050 LDI R21,0
01CD E061 LDI R22,1
01CE E070 LDI R23,0
01CF 1942 SUB R20,R2
01D0 0953 SBC R21,R3
01D1 0964 SBC R22,R4
01D2 0975 SBC R23,R5
01D3 90200139 LDS R2,g_CntUpdate
01D5 9030013A LDS R3,g_CntUpdate+1
01D7 2444 CLR R4
01D8 2455 CLR R5
01D9 0D42 ADD R20,R2
01DA 1D53 ADC R21,R3
01DB 1D64 ADC R22,R4
01DC 1D75 ADC R23,R5
01DD 93500134 STS g_DeltaEnc+1,R21
01DF 93400133 STS g_DeltaEnc,R20
01E1 93700136 STS g_DeltaEnc+3,R23
01E3 93600135 STS g_DeltaEnc+2,R22
(0064) }
(0065)
(0066) if (g_TotalEnc > 10)
01E5 E08A LDI R24,0xA
01E6 9020013B LDS R2,g_TotalEnc
01E8 1582 CP R24,R2
01E9 F500 BCC 0x020A
(0067) g_TotalEnc = 10;
01EA 9380013B STS g_TotalEnc,R24
(0068)
(0069) for (; g_TotalEnc != 0; g_TotalEnc--)
01EC C01D RJMP 0x020A
(0070) {
(0071) g_DeltaEnc += 0x10000;
01ED E040 LDI R20,0
01EE E050 LDI R21,0
01EF E061 LDI R22,1
01F0 E070 LDI R23,0
01F1 90400135 LDS R4,g_DeltaEnc+2
01F3 90500136 LDS R5,g_DeltaEnc+3
01F5 90200133 LDS R2,g_DeltaEnc
01F7 90300134 LDS R3,g_DeltaEnc+1
01F9 0E24 ADD R2,R20
01FA 1E35 ADC R3,R21
01FB 1E46 ADC R4,R22
01FC 1E57 ADC R5,R23
01FD 92300134 STS g_DeltaEnc+1,R3
01FF 92200133 STS g_DeltaEnc,R2
0201 92500136 STS g_DeltaEnc+3,R5
0203 92400135 STS g_DeltaEnc+2,R4
0205 9180013B LDS R24,g_TotalEnc
0207 5081 SUBI R24,1
0208 9380013B STS g_TotalEnc,R24
020A 9020013B LDS R2,g_TotalEnc
020C 2022 TST R2
020D F6F9 BNE 0x01ED
(0072) }
(0073) /*
(0074) g_DeltaEnc *= 125;
(0075) g_DeltaEnc /=1000;
(0076) g_DeltaEnc *= 72;
(0077) g_DeltaEnc = 3 000 000 / g_DeltaEnc;
(0078)
(0079) //if (g_DeltaEnc > 6000)
(0080) //g_DeltaEnc = 6000;
(0081) //g_DeltaEnc *= 0xff;
(0082) //g_DeltaEnc /=6000;
(0083) */
(0084) g_TotalEnc = 0; //速度溢出标志清零
020E 2422 CLR R2
020F 9220013B STS g_TotalEnc,R2
(0085) g_CntOld = g_CntUpdate; //准备下次采样
0211 90200139 LDS R2,g_CntUpdate
0213 9030013A LDS R3,g_CntUpdate+1
0215 92300138 STS g_CntOld+1,R3
0217 92200137 STS g_CntOld,R2
0219 D63A RCALL pop_gset2
021A 9029 LD R2,Y+
021B BE2F OUT 0x3F,R2
021C 91E9 LD R30,Y+
021D 9199 LD R25,Y+
021E 9189 LD R24,Y+
021F 9099 LD R9,Y+
0220 9089 LD R8,Y+
0221 9059 LD R5,Y+
0222 9049 LD R4,Y+
0223 9039 LD R3,Y+
0224 9029 LD R2,Y+
0225 9518 RETI
_timer1_ovf_isr:
0226 938A ST R24,-Y
0227 939A ST R25,-Y
0228 B78F IN R24,0x3F
0229 938A ST R24,-Y
(0086) }
(0087)
(0088)
(0089)
(0090) #pragma interrupt_handler timer1_ovf_isr:14
(0091) void timer1_ovf_isr(void)
(0092) {
(0093) g_TotalEnc ++; //速度溢出标志
022A 9180013B LDS R24,g_TotalEnc
022C 5F8F SUBI R24,0xFF
022D 9380013B STS g_TotalEnc,R24
022F 9189 LD R24,Y+
0230 BF8F OUT 0x3F,R24
0231 9199 LD R25,Y+
0232 9189 LD R24,Y+
0233 9518 RETI
_det_err:
sign --> R20
0234 D62D 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)
0235 9020011F LDS R2,g_Err_Det_Disable
0237 2022 TST R2
0238 F009 BEQ 0x023A
(0033) return;
0239 C07B RJMP 0x02B5
(0034)
(0035) sign = 1;
023A E041 LDI R20,1
(0036)
(0037) if (det_err_over_flow())
023B D07B RCALL _det_err_over_flow
023C 2300 TST R16
023D F041 BEQ 0x0246
(0038) {
(0039) RED_ON();
023E B188 IN R24,0x08
023F 7088 ANDI R24,0x8
0240 B988 OUT 0x08,R24
(0040) GREEN_OFF();
0241 9A42 SBI 0x08,2
(0041) sign = 0;
0242 2744 CLR R20
(0042) g_Err_Det_Disable = 1;
0243 E081 LDI R24,1
0244 9380011F STS g_Err_Det_Disable,R24
(0043) }
(0044) if ( (det_err_inver_protect()) && sign )
0246 D079 RCALL _det_err_inver_protect
0247 2300 TST R16
0248 F051 BEQ 0x0253
0249 2344 TST R20
024A F041 BEQ 0x0253
(0045) {
(0046) led_flicker(1,2);
024B E022 LDI R18,2
024C E001 LDI R16,1
024D D0CA RCALL _led_flicker
(0047) GREEN_OFF();
024E 9A42 SBI 0x08,2
(0048) sign = 0;
024F 2744 CLR R20
(0049) g_Err_Det_Disable = 1;
0250 E081 LDI R24,1
0251 9380011F STS g_Err_Det_Disable,R24
(0050) }
(0051) if ((det_err_low_vol()) && sign )
0253 D079 RCALL _det_err_low_vol
0254 2300 TST R16
0255 F051 BEQ 0x0260
0256 2344 TST R20
0257 F041 BEQ 0x0260
(0052) {
(0053) led_flicker(1,3);
0258 E023 LDI R18,3
0259 E001 LDI R16,1
025A D0BD RCALL _led_flicker
(0054) GREEN_OFF();
025B 9A42 SBI 0x08,2
(0055) sign = 0;
025C 2744 CLR R20
(0056) g_Err_Det_Disable = 1;
025D E081 LDI R24,1
025E 9380011F STS g_Err_Det_Disable,R24
(0057) }
(0058) if (( det_err_no_stop_needle()) && sign)
0260 D077 RCALL _det_err_no_stop_needle
0261 2300 TST R16
0262 F051 BEQ 0x026D
0263 2344 TST R20
0264 F041 BEQ 0x026D
(0059) {
(0060) led_flicker(1,4);
0265 E024 LDI R18,4
0266 E001 LDI R16,1
0267 D0B0 RCALL _led_flicker
(0061) GREEN_OFF();
0268 9A42 SBI 0x08,2
(0062) sign = 0;
0269 2744 CLR R20
(0063) g_Err_Det_Disable = 1;
026A E081 LDI R24,1
026B 9380011F STS g_Err_Det_Disable,R24
(0064) }
(0065) if ((det_err_over_vol()) && sign )
026D D075 RCALL _det_err_over_vol
026E 2300 TST R16
026F F051 BEQ 0x027A
0270 2344 TST R20
0271 F041 BEQ 0x027A
(0066) {
(0067) led_flicker(1,5);
0272 E025 LDI R18,5
0273 E001 LDI R16,1
0274 D0A3 RCALL _led_flicker
(0068) GREEN_OFF();
0275 9A42 SBI 0x08,2
(0069) sign = 0;
0276 2744 CLR R20
(0070) g_Err_Det_Disable = 1;
0277 E081 LDI R24,1
0278 9380011F STS g_Err_Det_Disable,R24
(0071) }
(0072) if ((det_err_solenoid_short()) && sign )
027A D073 RCALL _det_err_solenoid_short
027B 2300 TST R16
027C F061 BEQ 0x0289
027D 2344 TST R20
027E F051 BEQ 0x0289
(0073) {
(0074) RED_ON();
027F B188 IN R24,0x08
0280 7088 ANDI R24,0x8
0281 B988 OUT 0x08,R24
(0075) led_flicker(0,1);
0282 E021 LDI R18,1
0283 2700 CLR R16
0284 D093 RCALL _led_flicker
(0076) sign = 0;
0285 2744 CLR R20
(0077) g_Err_Det_Disable = 1;
0286 E081 LDI R24,1
0287 9380011F STS g_Err_Det_Disable,R24
(0078) }
(0079) if ((det_err_syn_encoder()) && sign )
0289 D06D RCALL _det_err_syn_encoder
028A 2300 TST R16
028B F061 BEQ 0x0298
028C 2344 TST R20
028D F051 BEQ 0x0298
(0080) {
(0081) RED_ON();
028E B188 IN R24,0x08
028F 7088 ANDI R24,0x8
0290 B988 OUT 0x08,R24
(0082) led_flicker(0,2);
0291 E022 LDI R18,2
0292 2700 CLR R16
0293 D084 RCALL _led_flicker
(0083) sign = 0;
0294 2744 CLR R20
(0084) g_Err_Det_Disable = 1;
0295 E081 LDI R24,1
0296 9380011F STS g_Err_Det_Disable,R24
(0085) }
(0086) if ((det_err_motor_block()) && sign )
0298 D069 RCALL _det_err_motor_block
0299 2300 TST R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -