⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pidtext.s

📁 用ICC-AVR编译器编译适用与AVR系列单片机的PID库.
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module PIDTEXT.C
	.area data(ram, con, rel)
_Kp::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e Kp _Kp c
_Ki::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e Ki _Ki c
_Kd::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e Kd _Kd c
_s_e_0::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e s_e_0 _s_e_0 c
_s_e_1::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e s_e_1 _s_e_1 c
_s_e_2::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e s_e_2 _s_e_2 c
_Set_Target_Value::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e Set_Target_Value _Set_Target_Value i
_PID_OutValue::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e PID_OutValue _PID_OutValue i
_PID_OutValue_1::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e PID_OutValue_1 _PID_OutValue_1 i
_e_0::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e e_0 _e_0 i
_e_1::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e e_1 _e_1 i
_e_2::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e e_2 _e_2 i
_Check_Value::
	.blkb 2
	.area idata
	.word 7
	.area data(ram, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbsym e Check_Value _Check_Value i
	.area text(rom, con, rel)
	.dbfile D:\软件\PIDLIB\PIDTEXT.C
	.dbfunc e read_PID_E2P_Value _read_PID_E2P_Value fV
; set_Target_value_l -> y+6
; set_Target_value_h -> y+5
;           Kd_1 -> y+4
;           Ki_1 -> y+3
;           Kp_1 -> y+2
	.even
_read_PID_E2P_Value::
	sbiw R28,7
	.dbline -1
	.dbline 33
; /*------------------------------------------------------------
; ;------------------------------------------------------------
; ;		     PID  LIB  
; ;		     V0.1c
; ; 	  	     zhongwh
; ;		Copyright 2003-2005 
; ;   	Email: hfkj01@163.com
; ;        mtel : 13708004895
; ;		2005-9-28 15:38:52
; ;    ICC-AVR application builder
; ;-------------------------------------------------------------
; ;-------------------------------------------------------------
; ;   	Target : ALL AVR 
; ;		Crystal: 8Mhz					
; ;-------------------------------------------------------------
; ;-------------------------------------------------------------*/
; 
; #include <io8515v.h>
; #include <macros.h>
; #include <eeprom.h>
; #define	 uchar unsigned char
; #define	 uint  unsigned int
; //
; #define Kp_E2P_Addr		0x40
; #define Ki_E2P_Addr 	0x41
; #define Kd_E2P_Addr		0x42
; #define Set_E2P_TargetV_Addr_h	0x43
; #define Set_E2P_TargetV_Addr_l	0x44
; uchar	Kp=0,Ki=0,Kd=0 ,s_e_0=0,s_e_1=0,s_e_2=0;//状态=1为负数
; uint	Set_Target_Value=0,PID_OutValue=0,PID_OutValue_1=0,e_0=0,e_1=0,e_2=0,Check_Value=7;
; //v=v0+Kp[(e_0-e_1)+Ki*e_0+Kd(e_0-2*e_1+e_2)]
; void read_PID_E2P_Value(void)
; {
	.dbline 35
;  uchar set_Target_value_h,set_Target_value_l ,Kp_1,Ki_1,Kd_1;
;  EEPROM_READ(Kp_E2P_Addr,Kp_1);
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,254  ; offset = 2
	sbci R19,255
	ldi R16,64
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 36
	ldd R24,y+2
	cpi R24,100
	brlo L2
	.dbline 36
	.dbline 36
	ldi R24,100
	sts _Kp,R24
	.dbline 36
	rjmp L3
L2:
	.dbline 36
;  if (Kp_1>=100){Kp=100;}else{Kp=Kp_1;}
	.dbline 36
	ldd R2,y+2
	sts _Kp,R2
	.dbline 36
L3:
	.dbline 37
;  EEPROM_READ(Ki_E2P_Addr,Ki_1);
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,253  ; offset = 3
	sbci R19,255
	ldi R16,65
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 38
	ldd R24,y+3
	cpi R24,100
	brlo L4
	.dbline 38
	.dbline 38
	ldi R24,100
	sts _Ki,R24
	.dbline 38
	rjmp L5
L4:
	.dbline 38
;  if (Ki_1>=100){Ki=100;}else{Ki=Ki_1;}
	.dbline 38
	ldd R2,y+3
	sts _Ki,R2
	.dbline 38
L5:
	.dbline 39
;  EEPROM_READ(Kd_E2P_Addr,Kd_1);
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,66
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 40
	ldd R24,y+4
	cpi R24,100
	brlo L6
	.dbline 40
	.dbline 40
	ldi R24,100
	sts _Kd,R24
	.dbline 40
	rjmp L7
L6:
	.dbline 40
;  if (Kd_1>=100){Kd=100;}else{Kd=Kd_1;}
	.dbline 40
	ldd R2,y+4
	sts _Kd,R2
	.dbline 40
L7:
	.dbline 41
;  EEPROM_READ(Set_E2P_TargetV_Addr_h,set_Target_value_h);
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,251  ; offset = 5
	sbci R19,255
	ldi R16,67
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 42
;  EEPROM_READ(Set_E2P_TargetV_Addr_l,set_Target_value_l);
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,250  ; offset = 6
	sbci R19,255
	ldi R16,68
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 43
;  Set_Target_Value=set_Target_value_h;
	ldd R2,y+5
	clr R3
	sts _Set_Target_Value+1,R3
	sts _Set_Target_Value,R2
	.dbline 44
;  Set_Target_Value=(Set_Target_Value<<8)+set_Target_value_l;
	ldd R2,y+6
	lds R4,_Set_Target_Value
	lds R5,_Set_Target_Value+1
	mov R3,R4
	sts _Set_Target_Value+1,R3
	sts _Set_Target_Value,R2
	.dbline -2
	.dbline 47
;  
;  
; }	
L1:
	adiw R28,7
	.dbline 0 ; func end
	ret
	.dbsym l set_Target_value_l 6 c
	.dbsym l set_Target_value_h 5 c
	.dbsym l Kd_1 4 c
	.dbsym l Ki_1 3 c
	.dbsym l Kp_1 2 c
	.dbend
	.dbfunc e PID_Count _PID_Count fV
;             Ej -> y+6
;             Eh -> y+4
;             Ee -> y+2
;             Ei -> y+0
;           s_Ei -> R20
;           s_Eh -> R6
;           s_Eg -> y+13
;           s_Ef -> R8
;           s_Ee -> y+12
;           s_Ec -> y+11
;           s_Eb -> y+10
;             Eg -> R12,R13
;             Ef -> R10,R11
;             Ed -> R12,R13
;             Eb -> R14,R15
;             Ea -> R22,R23
;           s_Ed -> y+9
;           s_Ea -> y+8
;             Ec -> R10,R11
	.even
_PID_Count::
	rcall push_gset5
	sbiw R28,14
	.dbline -1
	.dbline 49
; void PID_Count(void)
; { uint Ea,Eb,Ec,Ed,Ee,Ef,Eg,Eh,Ei,Ej;
	.dbline 50
;   uchar s_Ea=0,s_Eb=0,s_Ec=0,s_Ed=0,s_Ee=0,s_Ef=0,s_Eg=0,s_Eh=0,s_Ei=0;
	clr R0
	std y+8,R0
	.dbline 50
	std y+10,R0
	.dbline 50
	std y+11,R0
	.dbline 50
	std y+9,R0
	.dbline 50
	std y+12,R0
	.dbline 50
	clr R8
	.dbline 50
	std y+13,R0
	.dbline 50
	clr R6
	.dbline 50
	clr R20
	.dbline 52
; //e_0
;  if (Set_Target_Value>=Check_Value)
	lds R2,_Check_Value
	lds R3,_Check_Value+1
	lds R4,_Set_Target_Value
	lds R5,_Set_Target_Value+1
	cp R4,R2
	cpc R5,R3
	brlo L9
	.dbline 53
;  {
	.dbline 54
;   e_0=Set_Target_Value-Check_Value;
	sub R4,R2
	sbc R5,R3
	sts _e_0+1,R5
	sts _e_0,R4
	.dbline 55
;   s_e_0=0;
	clr R2
	sts _s_e_0,R2
	.dbline 56
;  }
	rjmp L10
L9:
	.dbline 58
;  else
;  {
	.dbline 59
;   e_0=Check_Value-Set_Target_Value;
	lds R2,_Set_Target_Value
	lds R3,_Set_Target_Value+1
	lds R4,_Check_Value
	lds R5,_Check_Value+1
	sub R4,R2
	sbc R5,R3
	sts _e_0+1,R5
	sts _e_0,R4
	.dbline 60
;   s_e_0=1;
	ldi R24,1
	sts _s_e_0,R24
	.dbline 61
;  }
L10:
	.dbline 63
; //Ea=e_0-e_1
; if (e_0>=e_1)
	lds R2,_e_1
	lds R3,_e_1+1
	lds R4,_e_0
	lds R5,_e_0+1
	cp R4,R2
	cpc R5,R3
	brsh X0
	rjmp L11
X0:
	.dbline 64
; {
	.dbline 65
;    if (s_e_0==0)
	lds R2,_s_e_0
	tst R2
	brne L13
	.dbline 66
;    {
	.dbline 67
;    	  if (s_e_1==0)
	lds R2,_s_e_1
	tst R2
	brne L15
	.dbline 68
;  	  {
	.dbline 69
; 	  Ea=e_0-e_1;
	lds R2,_e_1
	lds R3,_e_1+1
	mov R22,R4
	mov R23,R5
	sub R22,R2
	sbc R23,R3
	.dbline 70
; 	  }
	rjmp L12
L15:
	.dbline 72
; 	  else
; 	  {
	.dbline 73
; 	  Ea=e_0+e_1;
	lds R2,_e_1
	lds R3,_e_1+1
	lds R22,_e_0
	lds R23,_e_0+1
	add R22,R2
	adc R23,R3
	.dbline 74
; 	  }
	.dbline 75
;    }
	rjmp L12
L13:
	.dbline 77
;    else
;    {
	.dbline 78
;    	  if (s_e_1==0)
	lds R2,_s_e_1
	tst R2
	brne L17
	.dbline 79
;  	  {
	.dbline 80
; 	   Ea=e_0+e_1;
	lds R2,_e_1
	lds R3,_e_1+1
	lds R22,_e_0
	lds R23,_e_0+1
	add R22,R2
	adc R23,R3
	.dbline 81
; 	   s_Ea=1;
	clr R0
	inc R0
	std y+8,R0
	.dbline 82
; 	  }
	rjmp L12
L17:
	.dbline 84
; 	  else
; 	  {
	.dbline 85
; 	   Ea=e_0-e_1;
	lds R2,_e_1
	lds R3,_e_1+1
	lds R22,_e_0
	lds R23,_e_0+1
	sub R22,R2
	sbc R23,R3
	.dbline 86
; 	   s_Ea=1;
	clr R0
	inc R0
	std y+8,R0
	.dbline 87
; 	  }
	.dbline 88
;    }
	.dbline 89
;  }
	rjmp L12
L11:
	.dbline 91
;  else
;  {
	.dbline 92
;     if (s_e_0==0)
	lds R2,_s_e_0
	tst R2
	brne L19
	.dbline 93
;    {
	.dbline 94
;    	  if (s_e_1==0)
	lds R2,_s_e_1
	tst R2
	brne L21
	.dbline 95
;  	  {
	.dbline 96
; 	   Ea=e_1-e_0;
	lds R2,_e_0
	lds R3,_e_0+1
	lds R22,_e_1
	lds R23,_e_1+1
	sub R22,R2
	sbc R23,R3
	.dbline 97
; 	   s_Ea=1;
	clr R0
	inc R0
	std y+8,R0
	.dbline 98
; 	  }
	rjmp L20
L21:
	.dbline 100
; 	  else
; 	  {
	.dbline 101
; 	   Ea=e_1+e_0;
	lds R2,_e_0
	lds R3,_e_0+1
	lds R22,_e_1
	lds R23,_e_1+1
	add R22,R2
	adc R23,R3
	.dbline 102
; 	   s_Ea=0;
	clr R0
	std y+8,R0
	.dbline 103
; 	  }
	.dbline 104
;    }
	rjmp L20
L19:
	.dbline 106
;    else
;    {
	.dbline 107
;    	  if (s_e_1==0)
	lds R2,_s_e_1
	tst R2
	brne L23
	.dbline 108
;  	  {
	.dbline 109
; 	  Ea=e_1+e_0;
	lds R2,_e_0
	lds R3,_e_0+1
	lds R22,_e_1
	lds R23,_e_1+1
	add R22,R2
	adc R23,R3
	.dbline 110
; 	  s_Ea=1;
	clr R0
	inc R0
	std y+8,R0
	.dbline 111
; 	  }
	rjmp L24
L23:
	.dbline 113
; 	  else
; 	  {
	.dbline 114
; 	   Ea=e_1-e_0;
	lds R2,_e_0
	lds R3,_e_0+1
	lds R22,_e_1
	lds R23,_e_1+1
	sub R22,R2
	sbc R23,R3
	.dbline 115
; 	   s_Ea=0;
	clr R0
	std y+8,R0
	.dbline 116
; 	  }
L24:
	.dbline 117
;    }
L20:
	.dbline 118
;  }
L12:
	.dbline 120
; //Eb=Ki*e_0 
;  if (s_e_0==0)
	lds R2,_s_e_0
	tst R2
	brne L25
	.dbline 121
;  {
	.dbline 122
;   	Eb=Ki*e_0;
	lds R18,_e_0
	lds R19,_e_0+1
	lds R16,_Ki
	clr R17
	rcall mpy16s
	mov R14,R16
	mov R15,R17
	.dbline 123
;  }
	rjmp L26
L25:
	.dbline 125
;  else
;  {
	.dbline 126
;    Eb=Ki*e_0;
	lds R18,_e_0
	lds R19,_e_0+1
	lds R16,_Ki
	clr R17
	rcall mpy16s
	mov R14,R16
	mov R15,R17
	.dbline 127
;    s_Eb=1;
	clr R0
	inc R0
	std y+10,R0
	.dbline 128
;  }
L26:
	.dbline 130
;  //Ec=2*e_1 
;  if (s_e_1==0)
	lds R2,_s_e_1
	tst R2
	brne L27
	.dbline 131
;  {
	.dbline 132
;   	Ec=2*e_1;
	lds R10,_e_1
	lds R11,_e_1+1
	lsl R10
	rol R11
	.dbline 133
;  }
	rjmp L28
L27:
	.dbline 135
;  else
;  {
	.dbline 136
;    Ec=2*e_1;
	lds R10,_e_1
	lds R11,_e_1+1
	lsl R10
	rol R11
	.dbline 137
;    s_Ec=1;
	clr R0
	inc R0
	std y+11,R0
	.dbline 138
;  }
L28:
	.dbline 140
; //Ed=e_0-2*e_1(Ed=e_0-Ec)
; if (e_0>=Ec)
	lds R2,_e_0
	lds R3,_e_0+1
	cp R2,R10
	cpc R3,R11
	brlo L29
	.dbline 141
; {
	.dbline 142
;    if (s_e_0==0)
	lds R2,_s_e_0
	tst R2
	brne L31
	.dbline 143
;    {
	.dbline 144
;    	  if (s_Ec==0)
	ldd R0,y+11
	tst R0
	brne L33
	.dbline 145
;  	  {
	.dbline 146
; 	  Ed=e_0-Ec;
	lds R12,_e_0
	lds R13,_e_0+1
	sub R12,R10
	sbc R13,R11
	.dbline 147
; 	  }
	rjmp L30
L33:
	.dbline 149
; 	  else
; 	  {
	.dbline 150
; 	  Ed=e_0+Ec;
	lds R12,_e_0
	lds R13,_e_0+1
	add R12,R10
	adc R13,R11
	.dbline 151
; 	  }
	.dbline 152
;    }
	rjmp L30
L31:
	.dbline 154
;    else
;    {
	.dbline 155
;    	  if (s_Ec==0)
	ldd R0,y+11
	tst R0
	brne L35
	.dbline 156
;  	  {
	.dbline 157
; 	   Ed=e_0+Ec;
	lds R12,_e_0
	lds R13,_e_0+1
	add R12,R10
	adc R13,R11
	.dbline 158
; 	   s_Ed=1;
	clr R0
	inc R0
	std y+9,R0
	.dbline 159
; 	  }
	rjmp L30
L35:
	.dbline 161
; 	  else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -