| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1886 人关注过本帖
标题:[求助]请大家看看这个8086汇编程序子程序跳转部分如何正确实现~~
只看楼主 加入收藏
demontt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-27
收藏
 问题点数:0 回复次数:13 
[求助]请大家看看这个8086汇编程序子程序跳转部分如何正确实现~~

要求是获取偏差之后取绝对值与预值相比较,如果比预值大就跳PD子程序,比预值小就跳PID子程序。似乎子程序跳转的地方有点问题,请大家帮我看看,谢谢~~~~

D8251 EQU 8000H ;8251数据寄存器
C8251 EQU 8002H ;8251控制状态寄存器
CSAD1_0 EQU 80H ;软件示波器通道1
CSAD2_7 EQU 00A7H ;实验用AD,通道7,双极性接法-5V到5V
CS0832 EQU 00H ;DA0832
Ts EQU 03H ;采样周期=Ts*5ms,默认为15毫秒
Kp EQU 60 ;比例的100倍,精度为小数点后两位
Ti EQU 100 ;积分时间常数
Td EQU 30 ;微分时间常数
A EQU 250 ;预值的100倍

DATA SEGMENT ;数据段为空,不可定义数据段
DATA ENDS ;变量和常数请放在程序段或段地址8500H

STACK SEGMENT ;堆栈段为空,不可定义堆栈段
STACK ENDS ;堆栈监控程序已经设置好

CODE SEGMENT
ASSUME CS:CODE
START: ;代码段开始
MOV AX,8100H
MOV DS,AX ;数据在代码段内
MOV AX,7000H ;ES寻址8251
MOV ES,AX


mov dx, 0020h
mov al, 13h ;ICW1,边缘触发,一片8259
out dx, al

CALL DELAY2

mov dx, 0021h ;ICW2,IR0-IR7,08H-0FH
mov al, 08h ;注意8253定时器0接到8259的IR0
out dx, al ;中断号为8,中断矢量为32-35,即20H-21H放PC,22H-23H放CS

CALL DELAY2

mov dx, 0021h ;ICW4,缓冲方式
mov al, 0Fh
out dx, al

CALL DELAY2

mov dx, 0021h ;OCW1,开8253,timer0中断,屏蔽其他
mov al, 0FEH
out dx, al

CALL DELAY2

mov dx, 0020h ;OCW2,普通中断结束命令
mov al, 20h
out dx, al

mov dx, 0043H
mov al, 36H ;8253,mode3,timer0,先写低8位再写高8位,方波发生器
out dx, al

mov dx, 0040H
mov al, 000H ;低八位
out dx, al
mov al, 018H ;高八位
out dx, al ;8253,timer0,1800h,5ms

xor ax,ax
mov ds,ax ;中断向量的段地址为0000H
mov si, 0020H ;15号中断向量的PC
LEA AX,T0_INTERRUPT ;取中断服务子程序的有效地址
mov [si], ax
mov si, 0022H ;15号中断向量的CS
mov ax, 8100h ;中断服务子程序的段地址
mov [si], ax
mov ds,ax ;恢复数据段地址

MOV AX,Ts
MOV BX,Kp
IMUL BX
MOV BX,05H
IMUL BX
MOV BX,Ti
XOR DX,DX
DIV BX ;计算Ki=Kp*(Ts*5)/Ti
MOV WORD PTR DS:[Ki],AX ;其中Kp是比例系数的100倍,Ts的单位是5ms,

MOV AX,Td
MOV BX,Kp
IMUL BX
MOV BX,Ts
XOR DX,DX
DIV BX
MOV BX,5
XOR DX,DX
DIV BX
MOV WORD PTR DS:[Kd],AX ;计算Kd=Kp*Td/(Ts*5)
STI
WAIT_HERE:
JMP WAIT_HERE


T0_INTERRUPT: ;中断服务子程序
CLI ;关中断
DEC BYTE PTR DS:[COUNT]
JNZ L3
MOV BYTE PTR DS:[COUNT],Ts ;采样周期到
CALL KONGZHI ;进行PID控制
L3:
MOV DX, CSAD1_0 ;写虚拟示波器CH1
OUT DX, AL
CALL DELAY2
IN AL, DX ;读虚拟示波器CH1
MOV ES:[D8251],AL ;回送数据
W_TXREADY:
MOV AL,ES:[C8251]
AND AL,01H
JZ W_TXREADY ;等待8251发送完成

INC DX
OUT DX, AL ;写虚拟示波器CH2
CALL DELAY2
IN AL, DX ;读虚拟示波器CH2
MOV ES:[D8251],AL ;回送数据
IRET
DELAY2:
MOV CX,64h ;延时子程序大于AD0809的转换时间100us
L2: LOOP L2
RET


KONGZHI:
MOV DX,CSAD2_7
OUT DX,AL
CALL DELAY2
IN AL,DX ;采样偏差e(k)
XOR AH,AH
ADD AX,0FF80H ;双极性接法,相当于SUB AX,80H

MOV WORD PTR DS:[E0],AX ;保存e(k)
ADD AX,WORD PTR DS:[ESUM] ;累加e(j)

MOV WORD PTR DS:[ESUM],AX
IMUL WORD PTR DS:[Ki] ;Ki*SUM(e(J))
MOV WORD PTR DS:[P_i],AX

MOV AX,WORD PTR DS:[E0]
MOV BX,Kp
IMUL BX ;Kp*e(k)
MOV WORD PTR DS:[P_p],AX

MOV AX,WORD PTR DS:[E0] ;Kd*[e(k)-e(k-1)]
SUB AX,WORD PTR DS:[E_1]
IMUL WORD PTR DS:[Kd]
MOV WORD PTR DS:[P_d],AX

MOV AX,WORD PTR DS:[E0]
TEST AX,8000H
JZ OK
NEG AX
MOV BX,64H
IMUL BX
CMP AX,A
JG PD
JMP PID
OK:
PD:
MOV AX,WORD PTR DS:[P_p]
ADD AX,WORD PTR DS:[P_D] ;相加P、D

MOV BX,64H ;刚才Kp是比例的100倍,现在除以100
CWD
IDIV BX

ADD AX,80H ;双极性接法
CMP AX,0FFH
JLE L4
MOV AX,0FFH ;抗积分饱和
L4:
CMP AX,00H
JGE L5
XOR AX,AX ;抗积分饱和
L5:
XOR DX,DX
OUT DX,AL ;输出控制量
MOV AX,WORD PTR DS:[E0] ;更新e(k-1)
MOV WORD PTR DS:[E_1],AX
PID:
MOV AX,WORD PTR DS:[P_p] ;相加P、I、D
ADD AX,WORD PTR DS:[P_i]
ADD AX,WORD PTR DS:[P_D]

MOV BX,64H ;刚才Kp是比例的100倍,现在除以100
CWD
IDIV BX

ADD AX,80H ;双极性接法
CMP AX,0FFH
JLE L6
MOV AX,0FFH ;抗积分饱和
L6:
CMP AX,00H
JGE L7
XOR AX,AX ;抗积分饱和
L7:
XOR DX,DX
OUT DX,AL ;输出控制量
MOV AX,WORD PTR DS:[E0] ;更新e(k-1)
MOV WORD PTR DS:[E_1],AX
RET

COUNT: DB Ts ;临时计数
ESUM: DW 0 ;累加误差
Ki: DW 0
Kd: DW 0
E0: DW 0 ;e(k)
E_1: DW 0 ;e(k-1)
P_p:DW 0
P_i:DW 0
P_d:DW 0
CODE ENDS
END START


搜索更多相关主题的帖子: 子程序 汇编程序 示波器 EQU 寄存器 
2007-05-17 12:34
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
太多拉 难得看
我调拉一哈 他说reserved word used as synbol :stack
不过能调过去 但是不能运行 运行就是遇到无效指令

   好好活着,因为我们会死很久!!!
2007-05-17 13:04
demontt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-27
收藏
得分:0 
无效指令么?是不能编译?
2007-05-17 13:08
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
不是 哈 是编译成功拉的
但是由于cup遇到拉一个无效的指令 如 数太大 放不下 益处拉
等等

   好好活着,因为我们会死很久!!!
2007-05-17 13:10
demontt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-27
收藏
得分:0 
数太大?应该不会出现这个情况吧,我是能执行的,就是好像达不到要求的效果。
2007-05-17 13:17
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
不是那个意思 我是说的在寄存储器里
一个数 这样有时会发生 我遇到过的

   好好活着,因为我们会死很久!!!
2007-05-17 13:21
demontt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-27
收藏
得分:0 
那还真奇怪了,不过我是能运行的。我觉得子程序跳转那边好像出了点问题,我又看不出来,能指点一下不~~~
2007-05-17 13:25
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
是什么问题  你说说看

   好好活着,因为我们会死很久!!!
2007-05-17 13:30
demontt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-27
收藏
得分:0 
运行的结果似乎是一直只跳到下面那个PID程序而没有运行过PD子程序~~
2007-05-17 13:33
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
哦 意思说你也能运行出来拉哦
那你看看在调用的时候是不是有什么错

[此贴子已经被作者于2007-5-17 13:40:32编辑过]


   好好活着,因为我们会死很久!!!
2007-05-17 13:40
快速回复:[求助]请大家看看这个8086汇编程序子程序跳转部分如何正确实现~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033586 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved