📄 m128_alky_touch_con1.lst
字号:
(0551) pp->SumError += Error; // 积分
6287 01CF MOVW R24,R30
6288 9609 ADIW R24,0x9
6289 01FC MOVW R30,R24
628A 8020 LDD R2,Z+0
628B 8031 LDD R3,Z+1
628C 0C2C ADD R2,R12
628D 1C3D ADC R3,R13
628E 8231 STD Z+1,R3
628F 8220 STD Z+0,R2
(0552) if(pp->SumError > 1000)
6290 EE88 LDI R24,0xE8
6291 E093 LDI R25,3
6292 01FA MOVW R30,R20
6293 8421 LDD R2,Z+9
6294 8432 LDD R3,Z+10
6295 1582 CP R24,R2
6296 0593 CPC R25,R3
6297 F41C BGE 0x629B
(0553) {pp->SumError = 1000;}
6298 8792 STD Z+10,R25
6299 8781 STD Z+9,R24
629A C00B RJMP 0x62A6
(0554) else
(0555) {
(0556) // TEMP=pp->SumError+Max;
(0557) if(pp->SumError < -1000)
629B 01FA MOVW R30,R20
629C 8581 LDD R24,Z+9
629D 8592 LDD R25,Z+10
629E 3188 CPI R24,0x18
629F EFAC LDI R26,0xFC
62A0 079A CPC R25,R26
62A1 F424 BGE 0x62A6
(0558) pp->SumError= -1000;
62A2 E188 LDI R24,0x18
62A3 EF9C LDI R25,0xFC
62A4 8792 STD Z+10,R25
62A5 8781 STD Z+9,R24
(0559) }
(0560) dError = pp->LastError - pp->PrevError; // 当前微分
62A6 01FA MOVW R30,R20
62A7 8027 LDD R2,Z+7
62A8 8430 LDD R3,Z+8
62A9 80A5 LDD R10,Z+5
62AA 80B6 LDD R11,Z+6
62AB 18A2 SUB R10,R2
62AC 08B3 SBC R11,R3
(0561) pp->PrevError = pp->LastError;
62AD 8025 LDD R2,Z+5
62AE 8036 LDD R3,Z+6
62AF 8630 STD Z+8,R3
62B0 8227 STD Z+7,R2
(0562) pp->LastError = Error;
62B1 82D6 STD Z+6,R13
62B2 82C5 STD Z+5,R12
(0563) return (pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError);
62B3 8521 LDD R18,Z+9
62B4 8532 LDD R19,Z+10
62B5 8103 LDD R16,Z+3
62B6 2711 CLR R17
62B7 940E 9BA2 CALL empy16s
62B9 0118 MOVW R2,R16
62BA 01FA MOVW R30,R20
62BB 8102 LDD R16,Z+2
62BC 2711 CLR R17
62BD 0196 MOVW R18,R12
62BE 940E 9BA2 CALL empy16s
62C0 0128 MOVW R4,R16
62C1 0C42 ADD R4,R2
62C2 1C53 ADC R5,R3
62C3 01FA MOVW R30,R20
62C4 8104 LDD R16,Z+4
62C5 2711 CLR R17
62C6 0195 MOVW R18,R10
62C7 940E 9BA2 CALL empy16s
62C9 0E40 ADD R4,R16
62CA 1E51 ADC R5,R17
62CB 0182 MOVW R16,R4
62CC 940C 9C2E JMP pop_xgset303C
(0564) }
(0565) //******************************************
(0566) void PIDInit (PID *pp)
(0567) { //初始化为0
(0568) pp->SetPoint=0;
_PIDInit:
pp --> R16
62CE 2422 CLR R2
62CF 2433 CLR R3
62D0 01F8 MOVW R30,R16
62D1 8231 STD Z+1,R3
62D2 8220 STD Z+0,R2
(0569) pp->Proportion=0;
62D3 8222 STD Z+2,R2
(0570) pp->Integral=0;
62D4 8223 STD Z+3,R2
(0571) pp->Derivative=0;
62D5 8224 STD Z+4,R2
(0572) pp->LastError=0;
62D6 8236 STD Z+6,R3
62D7 8225 STD Z+5,R2
(0573) pp->PrevError=0;
62D8 8630 STD Z+8,R3
62D9 8227 STD Z+7,R2
(0574) pp->SumError=0;
62DA 8632 STD Z+10,R3
62DB 8621 STD Z+9,R2
62DC 9508 RET
(0575) }
(0576)
(0577) //******************************************
(0578) void port_init(void)
(0579) {
(0580) PORTA = 0x0F;
_port_init:
62DD E08F LDI R24,0xF
62DE BB8B OUT 0x1B,R24
(0581) DDRA = 0xF0;
62DF EF80 LDI R24,0xF0
62E0 BB8A OUT 0x1A,R24
(0582) PORTB = 0x00;
62E1 2422 CLR R2
62E2 BA28 OUT 0x18,R2
(0583) DDRB = 0xFF;
62E3 EF8F LDI R24,0xFF
62E4 BB87 OUT 0x17,R24
(0584) PORTC = 0xFF; //m103 output only
62E5 BB85 OUT 0x15,R24
(0585) DDRC = 0xFF;
62E6 BB84 OUT 0x14,R24
(0586) PORTD = 0xFF;
62E7 BB82 OUT 0x12,R24
(0587) DDRD = 0xFF;
62E8 BB81 OUT 0x11,R24
(0588) PORTE = 0xC0;
62E9 EC80 LDI R24,0xC0
62EA B983 OUT 0x03,R24
(0589) DDRE = 0x3F;
62EB E38F LDI R24,0x3F
62EC B982 OUT 0x02,R24
(0590) PORTF = 0x00;
62ED 9220 0062 STS 0x0062,R2
(0591) DDRF = 0x00;
62EF 9220 0061 STS 0x0061,R2
(0592) PORTG = 0x1F;
62F1 E18F LDI R24,0x1F
62F2 9380 0065 STS 0x0065,R24
(0593) DDRG = 0x1B;
62F4 E18B LDI R24,0x1B
62F5 9380 0064 STS 0x0064,R24
62F7 9508 RET
(0594) }
(0595)
(0596) //******************************************
(0597) //TIMER0 initialize - prescale:32
(0598) // WGM: PWM Fast
(0599) // desired value: 1mSec
(0600) // actual value: 2.048mSec (-104.8%)
(0601) void timer0_init(void)
(0602) {
(0603) TCCR0 = 0x00; //stop
_timer0_init:
62F8 2422 CLR R2
62F9 BE23 OUT 0x33,R2
(0604) ASSR = 0x00; //set async mode
62FA BE20 OUT 0x30,R2
(0605) TCNT0 = 0x7D; //set count
62FB E78D LDI R24,0x7D
62FC BF82 OUT 0x32,R24
(0606) OCR0 = 0xFF;
62FD EF8F LDI R24,0xFF
62FE BF81 OUT 0x31,R24
(0607) //TCCR0 = 0x6B; //start timer
(0608) TCCR0 = 0x7B; //start timer
62FF E78B LDI R24,0x7B
6300 BF83 OUT 0x33,R24
6301 9508 RET
_timer0_ovf_isr:
6302 938A ST R24,-Y
6303 B78F IN R24,0x3F
6304 938A ST R24,-Y
(0609) }
(0610)
(0611) //******************************************
(0612) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0613) void timer0_ovf_isr(void)
(0614) {
(0615) TCNT0 = 0x7D; //reload counter value
6305 E78D LDI R24,0x7D
6306 BF82 OUT 0x32,R24
6307 9189 LD R24,Y+
6308 BF8F OUT 0x3F,R24
6309 9189 LD R24,Y+
630A 9518 RETI
(0616) }
(0617)
(0618) //******************************************
(0619) //TIMER1 initialize - prescale:256
(0620) // WGM: 14) PWM fast, TOP=ICRn
(0621) // desired value: 2Sec
(0622) // actual value: 2.000Sec (0.0%)
(0623) void timer1_init(void)
(0624) {
(0625) TCCR1B = 0x00; //stop
_timer1_init:
630B 2422 CLR R2
630C BC2E OUT 0x2E,R2
(0626) TCNT1H = 0x85; //setup
630D E885 LDI R24,0x85
630E BD8D OUT 0x2D,R24
(0627) TCNT1L = 0xEF;
630F EE8F LDI R24,0xEF
6310 BD8C OUT 0x2C,R24
(0628) OCR1AH = 0x7A;
6311 E78A LDI R24,0x7A
6312 BD8B OUT 0x2B,R24
(0629) OCR1AL = 0x11;
6313 E181 LDI R24,0x11
6314 BD8A OUT 0x2A,R24
(0630)
(0631) OCR1BH = 0x7A;
6315 E78A LDI R24,0x7A
6316 BD89 OUT 0x29,R24
(0632) OCR1BL = 0x11;
6317 E181 LDI R24,0x11
6318 BD88 OUT 0x28,R24
(0633)
(0634) OCR1CH = 0x7A;
6319 E78A LDI R24,0x7A
631A 9380 0079 STS 0x0079,R24
(0635) OCR1CL = 0x11;
631C E181 LDI R24,0x11
631D 9380 0078 STS 0x0078,R24
(0636)
(0637) ICR1H = 0x7A;
631F E78A LDI R24,0x7A
6320 BD87 OUT 0x27,R24
(0638) ICR1L = 0x11;
6321 E181 LDI R24,0x11
6322 BD86 OUT 0x26,R24
6323 9508 RET
_timer1_ovf_isr:
TEMP --> R10
rOut --> R20
6324 920A ST R0,-Y
6325 921A ST R1,-Y
6326 922A ST R2,-Y
6327 923A ST R3,-Y
6328 924A ST R4,-Y
6329 925A ST R5,-Y
632A 926A ST R6,-Y
632B 927A ST R7,-Y
632C 928A ST R8,-Y
632D 929A ST R9,-Y
632E 92AA ST R10,-Y
632F 92BA ST R11,-Y
6330 930A ST R16,-Y
6331 931A ST R17,-Y
6332 932A ST R18,-Y
6333 933A ST R19,-Y
6334 934A ST R20,-Y
6335 935A ST R21,-Y
6336 938A ST R24,-Y
6337 939A ST R25,-Y
6338 93AA ST R26,-Y
6339 93BA ST R27,-Y
633A 93EA ST R30,-Y
633B 93FA ST R31,-Y
633C B60F IN R0,0x3F
633D 920A ST R0,-Y
633E 940E 9C05 CALL push_xgset300C
(0639) //TCCR1A = 0xC2;
(0640) // TCCR1B = 0x1D; //start Timer
(0641) }
(0642)
(0643) //******************************************
(0644) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0645) void timer1_ovf_isr(void)
(0646) {
(0647) //TIMER1 has overflowed
(0648) //TCNT1H = 0x85; //reload counter high value
(0649) //TCNT1L = 0xEF; //reload counter low value
(0650) int rOut;
(0651) uint TEMP;
(0652)
(0653) rOut=PIDCalc(&LD_PID,DQ_LD_Value);
6340 9120 0141 LDS R18,DQ_LD_Value
6342 9130 0142 LDS R19,DQ_LD_Value+1
6344 E80C LDI R16,0x8C
6345 E011 LDI R17,1
6346 DEBB RCALL _PIDCalc
6347 01A8 MOVW R20,R16
(0654) if(rOut<0) rOut=0;
6348 3000 CPI R16,0
6349 E0E0 LDI R30,0
634A 071E CPC R17,R30
634B F414 BGE 0x634E
634C 2744 CLR R20
634D 2755 CLR R21
(0655) if(rOut>ICR1_TEMP) rOut=ICR1_TEMP;
634E 9020 010D LDS R2,ICR1_TEMP
6350 9030 010E LDS R3,ICR1_TEMP+1
6352 1624 CP R2,R20
6353 0635 CPC R3,R21
6354 F408 BCC 0x6356
6355 01A1 MOVW R20,R2
(0656) TEMP=ICR1_TEMP-rOut;
6356 90A0 010D LDS R10,ICR1_TEMP
6358 90B0 010E LDS R11,ICR1_TEMP+1
635A 1AA4 SUB R10,R20
635B 0AB5 SBC R11,R21
(0657) LDPWM_Value_XianShi = TEMP;
635C 92B0 0102 STS LDPWM_Value_XianShi+1,R11
635E 92A0 0101 STS LDPWM_Value_XianShi,R10
(0658) CLI();
6360 94F8 BCLR 7
(0659) // if(P_OK==1)
(0660) // {
(0661) OCR1A = TEMP;
6361 BCBB OUT 0x2B,R11
6362 BCAA OUT 0x2A,R10
(0662) ICR1 = ICR1_TEMP;
6363 9020 010D LDS R2,ICR1_TEMP
6365 9030 010E LDS R3,ICR1_TEMP+1
6367 BC37 OUT 0x27,R3
6368 BC26 OUT 0x26,R2
(0663) // }
(0664) // else
(0665) // OCR1A = ICR1_TEMP;
(0666) // OCR1AH = TEMP/256;
(0667) // OCR1AL = TEMP%256;
(0668) SEI();
6369 9478 BSET 7
636A 940E 9C0A CALL pop_xgset300C
636C 9009 LD R0,Y+
636D BE0F OUT 0x3F,R0
636E 91F9 LD R31,Y+
636F 91E9 LD R30,Y+
6370 91B9 LD R27,Y+
6371 91A9 LD R26,Y+
6372 9199 LD R25,Y+
6373 9189 LD R24,Y+
6374 9159 LD R21,Y+
6375 9149 LD R20,Y+
6376 9139 LD R19,Y+
6377 9129 LD R18,Y+
6378 9119 LD R17,Y+
6379 9109 LD R16,Y+
637A 90B9 LD R11,Y+
637B 90A9 LD R10,Y+
637C 9099 LD R9,Y+
637D 9089 LD R8,Y+
637E 9079 LD R7,Y+
637F 9069 LD R6,Y+
6380 9059 LD R5,Y+
6381 9049 LD R4,Y+
6382 9039 LD R3,Y+
6383 9029 LD R2,Y+
6384 9019 LD R1,Y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -