📄 m128_alky_touch_con1.s
字号:
.dbline 530
std z+10,R25
std z+9,R24
.dbline 530
xjmp L3
L2:
.dbline 532
; else
; {
.dbline 534
; // TEMP=pp->SumError+Max;
; if(pp->SumError < -20000)
movw R30,R20
ldd R24,z+9
ldd R25,z+10
cpi R24,224
ldi R26,177
cpc R25,R26
brge L4
X1:
.dbline 535
; pp->SumError= -20000;
ldi R24,-20000
ldi R25,-79
std z+10,R25
std z+9,R24
L4:
.dbline 536
; }
L3:
.dbline 537
; dError = pp->LastError - pp->PrevError; // 当前微分
movw R30,R20
ldd R2,z+7
ldd R3,z+8
ldd R10,z+5
ldd R11,z+6
sub R10,R2
sbc R11,R3
.dbline 538
; pp->PrevError = pp->LastError;
ldd R2,z+5
ldd R3,z+6
std z+8,R3
std z+7,R2
.dbline 539
; pp->LastError = Error;
std z+6,R13
std z+5,R12
.dbline 540
; if(Set_LD_Value>299)
ldi R24,299
ldi R25,1
lds R2,_Set_LD_Value
lds R3,_Set_LD_Value+1
cp R24,R2
cpc R25,R3
brsh L6
X2:
.dbline 541
; return (pp->Proportion * Error + (pp->Integral * pp->SumError)/2 + pp->Derivative * dError);
ldd R18,z+9
ldd R19,z+10
ldd R16,z+3
clr R17
xcall empy16s
ldi R18,2
ldi R19,0
xcall div16s
movw R2,R16
movw R30,R20
ldd R16,z+2
clr R17
movw R18,R12
xcall empy16s
movw R4,R16
add R4,R2
adc R5,R3
movw R30,R20
ldd R16,z+4
clr R17
movw R18,R10
xcall empy16s
add R4,R16
adc R5,R17
movw R16,R4
xjmp L1
L6:
.dbline 543
; else
; return (pp->Proportion * Error + (pp->Integral * pp->SumError)/4 + pp->Derivative * dError);
movw R30,R20
ldd R18,z+9
ldd R19,z+10
ldd R16,z+3
clr R17
xcall empy16s
ldi R18,4
ldi R19,0
xcall div16s
movw R2,R16
movw R30,R20
ldd R16,z+2
clr R17
movw R18,R12
xcall empy16s
movw R4,R16
add R4,R2
adc R5,R3
movw R30,R20
ldd R16,z+4
clr R17
movw R18,R10
xcall empy16s
add R4,R16
adc R5,R17
movw R16,R4
.dbline -2
L1:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym l TEMP 1 I
.dbsym r dError 10 I
.dbsym r Error 12 I
.dbsym r NextPoint 10 i
.dbsym r pp 20 pS[PID]
.dbend
.dbfunc e PIDCalc_WD _PIDCalc_WD fI
; TEMP -> <dead>
; dError -> R10,R11
; Error -> R12,R13
; NextPoint -> R10,R11
; pp -> R20,R21
.even
_PIDCalc_WD::
xcall push_xgset303C
movw R10,R18
movw R20,R16
.dbline -1
.dbline 548
; }
; //******************************************
; //=============================PID计算部分==============================================
; int PIDCalc_WD( PID *pp, uint NextPoint)
; {
.dbline 550
; int dError,Error,TEMP;
; Error = pp->SetPoint - NextPoint; // 偏差
movw R30,R20
ldd R12,z+0
ldd R13,z+1
sub R12,R10
sbc R13,R11
.dbline 551
; pp->SumError += Error; // 积分
movw R24,R30
adiw R24,9
movw R30,R24
ldd R2,z+0
ldd R3,z+1
add R2,R12
adc R3,R13
std z+1,R3
std z+0,R2
.dbline 552
; if(pp->SumError > 1000)
ldi R24,1000
ldi R25,3
movw R30,R20
ldd R2,z+9
ldd R3,z+10
cp R24,R2
cpc R25,R3
brge L9
X3:
.dbline 553
; {pp->SumError = 1000;}
.dbline 553
std z+10,R25
std z+9,R24
.dbline 553
xjmp L10
L9:
.dbline 555
; else
; {
.dbline 557
; // TEMP=pp->SumError+Max;
; if(pp->SumError < -1000)
movw R30,R20
ldd R24,z+9
ldd R25,z+10
cpi R24,24
ldi R26,252
cpc R25,R26
brge L11
X4:
.dbline 558
; pp->SumError= -1000;
ldi R24,-1000
ldi R25,-4
std z+10,R25
std z+9,R24
L11:
.dbline 559
; }
L10:
.dbline 560
; dError = pp->LastError - pp->PrevError; // 当前微分
movw R30,R20
ldd R2,z+7
ldd R3,z+8
ldd R10,z+5
ldd R11,z+6
sub R10,R2
sbc R11,R3
.dbline 561
; pp->PrevError = pp->LastError;
ldd R2,z+5
ldd R3,z+6
std z+8,R3
std z+7,R2
.dbline 562
; pp->LastError = Error;
std z+6,R13
std z+5,R12
.dbline 563
; return (pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError);
ldd R18,z+9
ldd R19,z+10
ldd R16,z+3
clr R17
xcall empy16s
movw R2,R16
movw R30,R20
ldd R16,z+2
clr R17
movw R18,R12
xcall empy16s
movw R4,R16
add R4,R2
adc R5,R3
movw R30,R20
ldd R16,z+4
clr R17
movw R18,R10
xcall empy16s
add R4,R16
adc R5,R17
movw R16,R4
.dbline -2
L8:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym l TEMP 1 I
.dbsym r dError 10 I
.dbsym r Error 12 I
.dbsym r NextPoint 10 i
.dbsym r pp 20 pS[PID]
.dbend
.dbfunc e PIDInit _PIDInit fV
; pp -> R16,R17
.even
_PIDInit::
.dbline -1
.dbline 567
; }
; //******************************************
; void PIDInit (PID *pp)
; { //初始化为0
.dbline 568
; pp->SetPoint=0;
clr R2
clr R3
movw R30,R16
std z+1,R3
std z+0,R2
.dbline 569
; pp->Proportion=0;
std z+2,R2
.dbline 570
; pp->Integral=0;
std z+3,R2
.dbline 571
; pp->Derivative=0;
std z+4,R2
.dbline 572
; pp->LastError=0;
std z+6,R3
std z+5,R2
.dbline 573
; pp->PrevError=0;
std z+8,R3
std z+7,R2
.dbline 574
; pp->SumError=0;
std z+10,R3
std z+9,R2
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbsym r pp 16 pS[PID]
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 579
; }
;
; //******************************************
; void port_init(void)
; {
.dbline 580
; PORTA = 0x0F;
ldi R24,15
out 0x1b,R24
.dbline 581
; DDRA = 0xF0;
ldi R24,240
out 0x1a,R24
.dbline 582
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 583
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 584
; PORTC = 0xFF; //m103 output only
out 0x15,R24
.dbline 585
; DDRC = 0xFF;
out 0x14,R24
.dbline 586
; PORTD = 0xFF;
out 0x12,R24
.dbline 587
; DDRD = 0xFF;
out 0x11,R24
.dbline 588
; PORTE = 0xC0;
ldi R24,192
out 0x3,R24
.dbline 589
; DDRE = 0x3F;
ldi R24,63
out 0x2,R24
.dbline 590
; PORTF = 0x00;
sts 98,R2
.dbline 591
; DDRF = 0x00;
sts 97,R2
.dbline 592
; PORTG = 0x1F;
ldi R24,31
sts 101,R24
.dbline 593
; DDRG = 0x1B;
ldi R24,27
sts 100,R24
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 602
; }
;
; //******************************************
; //TIMER0 initialize - prescale:32
; // WGM: PWM Fast
; // desired value: 1mSec
; // actual value: 2.048mSec (-104.8%)
; void timer0_init(void)
; {
.dbline 603
; TCCR0 = 0x00; //stop
clr R2
out 0x33,R2
.dbline 604
; ASSR = 0x00; //set async mode
out 0x30,R2
.dbline 605
; TCNT0 = 0x7D; //set count
ldi R24,125
out 0x32,R24
.dbline 606
; OCR0 = 0xFF;
ldi R24,255
out 0x31,R24
.dbline 608
; //TCCR0 = 0x6B; //start timer
; TCCR0 = 0x7B; //start timer
ldi R24,123
out 0x33,R24
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 64
jmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile D:\Program\M128_ALKY_Touch_CON1\M128_ALKY_Touch_CON1.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
_timer0_ovf_isr::
st -y,R24
in R24,0x3f
st -y,R24
.dbline -1
.dbline 614
; }
;
; //******************************************
; #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
; void timer0_ovf_isr(void)
; {
.dbline 615
; TCNT0 = 0x7D; //reload counter value
ldi R24,125
out 0x32,R24
.dbline -2
L16:
.dbline 0 ; func end
ld R24,y+
out 0x3f,R24
ld R24,y+
reti
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 624
; }
;
; //******************************************
; //TIMER1 initialize - prescale:256
; // WGM: 14) PWM fast, TOP=ICRn
; // desired value: 2Sec
; // actual value: 2.000Sec (0.0%)
; void timer1_init(void)
; {
.dbline 625
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 626
; TCNT1H = 0x85; //setup
ldi R24,133
out 0x2d,R24
.dbline 627
; TCNT1L = 0xEF;
ldi R24,239
out 0x2c,R24
.dbline 628
; OCR1AH = 0x7A;
ldi R24,122
out 0x2b,R24
.dbline 629
; OCR1AL = 0x11;
ldi R24,17
out 0x2a,R24
.dbline 631
;
; OCR1BH = 0x7A;
ldi R24,122
out 0x29,R24
.dbline 632
; OCR1BL = 0x11;
ldi R24,17
out 0x28,R24
.dbline 634
;
; OCR1CH = 0x7A;
ldi R24,122
sts 121,R24
.dbline 635
; OCR1CL = 0x11;
ldi R24,17
sts 120,R24
.dbline 637
;
; ICR1H = 0x7A;
ldi R24,122
out 0x27,R24
.dbline 638
; ICR1L = 0x11;
ldi R24,17
out 0x26,R24
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 56
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile D:\Program\M128_ALKY_Touch_CON1\M128_ALKY_Touch_CON1.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
; TEMP -> R10,R11
; rOut -> R20,R21
.even
_timer1_ovf_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R10
st -y,R11
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R20
st -y,R21
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_xgset300C
.dbline -1
.dbline 646
; //TCCR1A = 0xC2;
; // TCCR1B = 0x1D; //start Timer
; }
;
; //******************************************
; #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
; void timer1_ovf_isr(void)
; {
.dbline 653
; //TIMER1 has overflowed
; //TCNT1H = 0x85; //reload counter high value
; //TCNT1L = 0xEF; //reload counter low value
; int rOut;
; uint TEMP;
;
; rOut=PIDCalc(&LD_PID,DQ_LD_Value);
lds R18,_DQ_LD_Value
lds R19,_DQ_LD_Value+1
ldi R16,<_LD_PID
ldi R17,>_LD_PID
xcall _PIDCalc
movw R20,R16
.dbline 654
; if(rOut<0) rOut=0;
cpi R16,0
ldi R30,0
cpc R17,R30
brge L19
X5:
.dbline 654
clr R20
clr R21
L19:
.dbline 655
; if(rOut>ICR1_TEMP) rOut=ICR1_TEMP;
lds R2,_ICR1_TEMP
lds R3,_ICR1_TEMP+1
cp R2,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -