📄 icc_gmj.lst
字号:
(0018) #define K1 2
(0019) //1
(0020) #define INC_SPEED 2
(0021) //增速
(0022) #define K2 3
(0023) //2
(0024) #define DEC_SPEED 3
(0025) //减速
(0026) #define K3 4
(0027) //4
(0028) #define SET 4
(0029) //设定
(0030) #define K4 6
(0031) //4
(0032) #define SPEED 6
(0033) //速度
(0034) #define K5 7
(0035) //5
(0036) #define COUNT 7
(0037) //计数
(0038) #define K6 8
(0039) //8
(0040) #define SUM 8
(0041) //累计
(0042) #define K0 9
(0043) //9
(0044) #define CLEAR 9
(0045) //清零
(0046) #define K7 10
(0047) //7
(0048) #define MIAN_LENGTH 10
(0049) //面长
(0050) #define K8 11
(0051) //8
(0052) #define CUT_NUM 11
(0053) //刀数
(0054) #define K9 12
(0055) //9
(0056) #define JIGAN 12
(0057) //积杆
(0058) #define M_ZHUANBI 4000
(0059) //转刀一周步进电机的步数
(0060)
(0061) /////////////// 全局变量定义
(0062) unsigned char M_state=0; //步进电机的运行状态
(0063) /*
(0064) 0:停转
(0065) 1:启动
(0066) 2:减速至停转
(0067) 3:加速至随动
(0068) 4:减速至随动
(0069) 5:随动
(0070) 6:加速至碎刀
(0071) 7:碎刀
(0072) 8:转动至平行
(0073) */
(0074) unsigned int step_num=0; //步进电机相对平行点的占步数
(0075) //unsigned char M_maichong; //步进电机的脉冲
(0076) unsigned int tmp_t1=64536; //计时器1的当前数值
(0077) unsigned char qidong_num=0; //启动过程中步进电机所走的占步数
(0078) unsigned char dec_speed_bz=0; //启动减速标志
(0079) unsigned int dec_speed_num=0; //减速所走的步数
(0080) float DW_juli; //单位距离
(0081) float P_speed; //皮带速度
(0082) float juli; //切刀到杆切点的距离
(0083) unsigned char time0_chi; //计时器0的次数(256的倍数)
(0084) unsigned char time0_yu; //计时器0的余数(整除256后所得的余数)
(0085) unsigned char time0_fen; //如果余数太小,则从次数中分出一次来,和余数加在一起分担剩余的时间
(0086) unsigned char pidai_yunxing=0; //皮带运行:1表示正常运行,0表示停止运行
(0087) float set_speed; //设定的转速******
(0088) unsigned char dj_jibie=0; //电磁调速电动机速度增减的级别
(0089) unsigned char dj_fangxi=0; //电磁调速电动机调速的方向
(0090) unsigned char on_scr=0; //可控硅导通标志
(0091) unsigned int pre_jsq=2000; //上一次可控硅触发计时
(0092) unsigned char key=0; //按键的键值
(0093) unsigned char on_key=0; //有键按下的标志
(0094) unsigned char key_num=0; //计数,每计50查一次按键
(0095) unsigned char next_gan=0; //过下一杆标志
(0096) unsigned char guogan=0; //开始正式过杆的标志
(0097) float dw_speed=0.00000025; //一个时间单位所走的毫米数*******
(0098) float ganwei; //杆位:挂面杆相对于切点的位置
(0099) float next_ganwei; //下一杆的杆位
(0100) float juli_jcd; //检测点到切点的距离*******
(0101) float ganju; //两根挂面杆的距离*******
(0102) float longth_guamian; //切好的挂面的长度*******
(0103) float longth_zongmian; //一杆上挂面的总长度*******
(0104) unsigned char jidao; //一杆面共切几刀
(0105) unsigned char first_gan=1; //第一杆标志
(0106) unsigned char qidong=0; //步进电机是否起动
(0107) unsigned char jileigan=0; //累积的杆数
(0108) unsigned char max_ganshu=10; //积累杆数的上限
(0109) unsigned char caoshu=0; //高速标志
(0110) float current_speed; //当前速度
(0111) float caogan_speed; //高速时的速度
(0112) unsigned char menu_jb=0; //菜单级别
(0113) unsigned char menu_gn=0; //菜单功能码
(0114) char *string1;
(0115) char string2[]=" PASS";
(0116) char tmp_string[9]; //输入参数时,显示的数字
(0117) unsigned char cs_num=0; //当前参数的位数
(0118) char *str_dis;
(0119)
(0120) ///////////////
(0121) void port_init(void)
(0122) {
(0123) PORTA = 0x00;
_port_init:
0380 2422 CLR R2
0381 BA2B OUT 0x1B,R2
(0124) DDRA = 0x00;
0382 BA2A OUT 0x1A,R2
(0125) PORTB = 0xF0;
0383 EF80 LDI R24,0xF0
0384 BB88 OUT 0x18,R24
(0126) DDRB = 0xF0;
0385 BB87 OUT 0x17,R24
(0127) PORTC = 0x00; //m103 output only
0386 BA25 OUT 0x15,R2
(0128) DDRC = 0xC0;
0387 EC80 LDI R24,0xC0
0388 BB84 OUT 0x14,R24
(0129) PORTD = 0x00;
0389 BA22 OUT 0x12,R2
(0130) DDRD = 0x00;
038A BA21 OUT 0x11,R2
038B 9508 RET
_read_adc:
adc_jg --> R20
adc_L --> R20
adc_H --> R22
038C 940E0FB9 CALL push_gset2
(0131) }
(0132)
(0133) unsigned int read_adc(void) //读取模数转换的值,即测速发电机的电压值
(0134) {
(0135) unsigned char adc_H,adc_L;
(0136) unsigned int adc_jg;
(0137) adc_L=ADCL;
038E B144 IN R20,0x04
(0138) adc_H=ADCH;
038F B165 IN R22,0x05
(0139) adc_jg=adc_H*256+adc_L;
0390 2F26 MOV R18,R22
0391 2733 CLR R19
0392 E000 LDI R16,0
0393 E011 LDI R17,1
0394 940E0F97 CALL empy16s
0396 0118 MOVW R2,R16
0397 2E44 MOV R4,R20
0398 2455 CLR R5
0399 0C24 ADD R2,R4
039A 1C35 ADC R3,R5
039B 01A1 MOVW R20,R2
(0140) return adc_jg;
039C 0181 MOVW R16,R2
039D 940E0FA7 CALL pop_gset2
039F 9508 RET
(0141) }
(0142) //TIMER0 initialize - prescale:8
(0143) // WGM: Normal
(0144) // desired value: 1Hz
(0145) // actual value: Out of range
(0146) void timer0_init(void)
(0147) {
(0148) TCCR0 = 0x00; //stop
_timer0_init:
03A0 2422 CLR R2
03A1 BE23 OUT 0x33,R2
(0149) TCNT0 = 0x00 /*INVALID SETTING*/; //set count
03A2 BE22 OUT 0x32,R2
(0150) OCR0 = 0x00 /*INVALID SETTING*/; //set compare
03A3 BE2C OUT 0x3C,R2
(0151) TCCR0 = 0x02; //start timer
03A4 E082 LDI R24,2
03A5 BF83 OUT 0x33,R24
03A6 9508 RET
_timer0_ovf_isr:
i --> R16
03A7 922A ST R2,-Y
03A8 923A ST R3,-Y
03A9 930A ST R16,-Y
03AA 938A ST R24,-Y
03AB B62F IN R2,0x3F
03AC 922A ST R2,-Y
(0152) }
(0153)
(0154) #pragma interrupt_handler timer0_ovf_isr:10
(0155) void timer0_ovf_isr(void)
(0156) {
(0157) unsigned char i;
(0158) if (on_scr==1) //如果可控硅触发标志为1,则触发可控硅
03AD 9180006C LDS R24,on_scr
03AF 3081 CPI R24,1
03B0 F471 BNE 0x03BF
(0159) {
(0160) TCCR0=0;
03B1 2422 CLR R2
03B2 BE23 OUT 0x33,R2
(0161) PORTC=PORTC | 0b01000000;
03B3 9AAE SBI 0x15,6
(0162) for (i=0;i<20;i++) ;
03B4 2700 CLR R16
03B5 C001 RJMP 0x03B7
03B6 9503 INC R16
03B7 3104 CPI R16,0x14
03B8 F3E8 BCS 0x03B6
(0163) PORTC=PORTC & 0b10111111;
03B9 B385 IN R24,0x15
03BA 7B8F ANDI R24,0xBF
03BB BB85 OUT 0x15,R24
(0164) on_scr=0;
03BC 2422 CLR R2
03BD 9220006C STS on_scr,R2
(0165) }
(0166) if (time0_chi>0) //如果计数器0次数大于0,则重新开始(0-255)的计时
03BF 2422 CLR R2
03C0 90300110 LDS R3,time0_chi
03C2 1423 CP R2,R3
03C3 F440 BCC 0x03CC
(0167) {
(0168) TCNT0=0;
03C4 BE22 OUT 0x32,R2
(0169) TCCR0=2;
03C5 E082 LDI R24,2
03C6 BF83 OUT 0x33,R24
(0170) time0_chi--;
03C7 2D83 MOV R24,R3
03C8 5081 SUBI R24,1
03C9 93800110 STS time0_chi,R24
(0171) }
03CB C013 RJMP 0x03DF
(0172) else
(0173) {
(0174) if (time0_fen>0)
03CC 2422 CLR R2
03CD 9030010E LDS R3,time0_fen
03CF 1423 CP R2,R3
03D0 F430 BCC 0x03D7
(0175) {
(0176) TCNT0=time0_fen;
03D1 BE32 OUT 0x32,R3
(0177) TCCR0=2;
03D2 E082 LDI R24,2
03D3 BF83 OUT 0x33,R24
(0178) time0_fen=0;
03D4 9220010E STS time0_fen,R2
(0179) }
03D6 C008 RJMP 0x03DF
(0180) else
(0181) {
(0182) TCNT0=time0_yu;
03D7 9020010F LDS R2,time0_yu
03D9 BE22 OUT 0x32,R2
(0183) TCCR0=2;
03DA E082 LDI R24,2
03DB BF83 OUT 0x33,R24
(0184) on_scr=1;
03DC E081 LDI R24,1
03DD 9380006C STS on_scr,R24
(0185) }
(0186) }
03DF 9029 LD R2,Y+
03E0 BE2F OUT 0x3F,R2
03E1 9189 LD R24,Y+
03E2 9109 LD R16,Y+
03E3 9039 LD R3,Y+
03E4 9029 LD R2,Y+
03E5 9518 RETI
(0187)
(0188) }
(0189)
(0190) //TIMER1 initialize - prescale:8
(0191) // WGM: 0) Normal, TOP=0xFFFF
(0192) // desired value: 1Hz
(0193) // actual value: Out of range
(0194) void timer1_init(void)
(0195) {
(0196) TCCR1B = 0x00; //stop
_timer1_init:
03E6 2422 CLR R2
03E7 BC2E OUT 0x2E,R2
(0197) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
03E8 BC2D OUT 0x2D,R2
(0198) TCNT1L = 0x00 /*INVALID SETTING*/;
03E9 BC2C OUT 0x2C,R2
(0199) OCR1AH = 0x00 /*INVALID SETTING*/;
03EA BC2B OUT 0x2B,R2
(0200) OCR1AL = 0x00 /*INVALID SETTING*/;
03EB BC2A OUT 0x2A,R2
(0201) OCR1BH = 0x00 /*INVALID SETTING*/;
03EC BC29 OUT 0x29,R2
(0202) OCR1BL = 0x00 /*INVALID SETTING*/;
03ED BC28 OUT 0x28,R2
(0203) //OCR1CH = $OCR1CH$;
(0204) //OCR1CL = $OCR1CL$;
(0205) ICR1H = 0x00 /*INVALID SETTING*/;
03EE BC27 OUT 0x27,R2
(0206) ICR1L = 0x00 /*INVALID SETTING*/;
03EF BC26 OUT 0x26,R2
(0207) TCCR1A = 0x00;
03F0 BC2F OUT 0x2F,R2
(0208) TCCR1B = 0x02; //start Timer
03F1 E082 LDI R24,2
03F2 BD8E OUT 0x2E,R24
03F3 9508 RET
_timer1_ovf_isr:
avg_speed --> R12
time1_jsq --> R10
i --> R12
03F4 920A ST R0,-Y
03F5 921A ST R1,-Y
03F6 922A ST R2,-Y
03F7 923A ST R3,-Y
03F8 924A ST R4,-Y
03F9 925A ST R5,-Y
03FA 926A ST R6,-Y
03FB 927A ST R7,-Y
03FC 928A ST R8,-Y
03FD 929A ST R9,-Y
03FE 930A ST R16,-Y
03FF 931A ST R17,-Y
0400 932A ST R18,-Y
0401 933A ST R19,-Y
0402 938A ST R24,-Y
0403 939A ST R25,-Y
0404 93EA ST R30,-Y
0405 93FA ST R31,-Y
0406 B60F IN R0,0x3F
0407 920A ST R0,-Y
0408 940E0FB3 CALL push_gset5
040A 9724 SBIW R28,4
(0209) }
(0210)
(0211) #pragma interrupt_handler timer1_ovf_isr:9
(0212) void timer1_ovf_isr(void) //步进电机控制
(0213) {
(0214) unsigned char i; //循环变量
(0215) unsigned int time1_jsq; //time1的时间值
(0216) unsigned int avg_speed; //平均速度
(0217) if (M_state==0) //停止状态
040B 90200060 LDS R2,M_state
040D 2022 TST R2
040E F409 BNE 0x0410
(0218) {
(0219) return;
040F C22F RJMP 0x063F
(0220) }
(0221) //TIMER1 has overflowed
(0222) TCNT1 = tmp_t1; //计数器赋初值
0410 90200063 LDS R2,tmp_t1
0412 90300064 LDS R3,tmp_t1+1
0414 BC3D OUT 0x2D,R3
0415 BC2C OUT 0x2C,R2
(0223) PORTC |=0b10000000; //给出步进电机驱动脉冲
0416 9AAF SBI 0x15,7
(0224) for (i=0;i<5;i++);
0417 24CC CLR R12
0418 C001 RJMP 0x041A
0419 94C3 INC R12
041A 2D8C MOV R24,R12
041B 3085 CPI R24,5
041C F3E0 BCS 0x0419
(0225) PORTC &=0b01111111;
041D B385 IN R24,0x15
041E 778F ANDI R24,0x7F
041F BB85 OUT 0x15,R24
(0226) step_num++; //计步加一
0420 91800061 LDS R24,step_num
0422 91900062 LDS R25,step_num+1
0424 9601 ADIW R24,1
0425 93900062 STS step_num+1,R25
0427 93800061 STS step_num,R24
(0227) time1_jsq=65535-tmp_t1+1;;
0429 90200063 LDS R2,tmp_t1
042B 90300064 LDS R3,tmp_t1+1
042D EF8F LDI R24,0xFF
042E EF9F LDI R25,0xFF
042F 1982 SUB R24,R2
0430 0993 SBC R25,R3
0431 9601 ADIW R24,1
0432 015C MOVW R10,R24
(0228) switch (M_state)
0433 90E00060 LDS R14,M_state
0435 24FF CLR R15
0436 01C7 MOVW R24,R14
0437 3081 CPI R24,1
0438 E0E0 LDI R30,0
0439 079E CPC R25,R30
043A F121 BEQ 0x045F
043B 3082 CPI R24,2
043C E0E0 LDI R30,0
043D 079E CPC R25,R30
043E F409 BNE 0x0440
043F C034 RJMP 0x0474
0440 3083 CPI R24,3
0441 E0E0 LDI R30,0
0442 079E CPC R25,R30
0443 F409 BNE 0x0445
0444 C075 RJMP 0x04BA
0445 3084 CPI R24,4
0446 E0E0 LDI R30,0
0447 079E CPC R25,R30
0448 F409 BNE 0x044A
0449 C070 RJMP 0x04BA
044A 3085 CPI R24,5
044B E0E0 LDI R30,0
044C 079E CPC R25,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -