51高手进来看 点击:483 | 回复:12



伏牛

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:37帖 | 176回
  • 年度积分:0
  • 历史总积分:497
  • 注册:2005年6月26日
发表于:2008-10-12 14:33:34
楼主
下面为一编码器计数处理程序,在运行中数据偶尔会跳变,如76h,77h计到180(bcd)突然会跳到90,程序中74h,75h为计数当前值寄存器,在74h,75h使用前先于备份数据进行表决,表决通不过将置位错误标志ERR,同时显示器显示ERR,ERR只有在冷启动后才可被复位,74H,75H在使用后立即更新备份。现搞不清楚74H,75H数据被干扰 而数据表决时也没有恢复,也没提示ERR。

请朋友们帮忙分析一下,看程序哪个地方有错误,小弟在此表示感谢。

WBZD10: RETI
NOP
NOP
LJMP START                     ;软件陷阱

WBZD1: NOP                     ;A1编码器A相信号,接P3.3外部中断1
NOP
LCALL YS50US                  ;调用延时50us,滤波
JB A1,WBZD10                    ;A1=1,退出中断,A1=0,执行中断1处理子程序

;中断1处理子程序
PUSH ACC
PUSH PSW
SETB RS1                         ;使用工作寄存器组2
CLR RS0
NOP
NOP
CLR C
MOV A,77H                       ;90(BCD)≤76H,77H≤520(BCD)
SUBB A,#08H                  ;判76H,77H是否超限,0208(HEX)=520(BCD)
MOV A,76H
SUBB A,#02H
NOP
NOP
JC WBZD25                        ;76H,77H≥#0208H,置位上限标志K2
SETB K2
NOP
NOP
SJMP WBZD30
NOP
NOP
LJMP START

WBZD25: CLR K2               ;76H,77H<#0208H,清上限标志K2
WBZD30: CLR C
MOV A,#90                           ;下限比较
SUBB A,77H
MOV A,#00H
SUBB A,76H
NOP
NOP
JC WBZD35                           ;76H,77H<90,置位下限标志K3
SETB K3
NOP
NOP
SJMP WBZD36
NOP
NOP
LJMP START

WBZD35: CLR K3                 ;76H,77H≥90,清零下限标志K3

WBZD36: MOV R2,74H            ;74H内容备份在0A4H和0C4H中
MOV R0,#0A4H
MOV R1,#0C4H
NOP
NOP
LCALL D3SUB                           ;调用检错程序,判断74H是否正确
MOV 74H,R2

MOV R2,75H                               ;75H内容备份在0A5H和0C5H中
MOV R0,#0A5H
MOV R1,#0C5H
NOP
NOP
LCALL D3SUB                           ;调用检错程序,判断75H是否正确
MOV 75H,R2
NOP                                              ;74H,75H为脉冲计数当前值
NOP
JB B1,WB


楼主最近还看过



蓝海华腾

  • 精华:17帖
  • 求助:0帖
  • 帖子:77帖 | 3116回
  • 年度积分:0
  • 历史总积分:7271
  • 注册:2005年11月04日
发表于:2008-10-13 15:26:34
1楼
高手进来看看,看不懂.

norris_lee

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 194回
  • 年度积分:0
  • 历史总积分:536
  • 注册:2008年8月12日
发表于:2008-10-14 18:16:02
2楼

不会用汇编,抱歉,用C可以帮你

?

yuzhenghuk

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 14回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2008年7月26日
发表于:2008-10-14 21:23:41
3楼
大哥,这么长的汇编,看的太痛苦了

zjtzdzw

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2008年10月16日
发表于:2008-10-16 10:17:23
4楼
大哥 你就不能在附加个流程图吗 看的好累呀

老狼

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 821回
  • 年度积分:0
  • 历史总积分:1588
  • 注册:2008年3月01日
发表于:2008-10-21 19:41:24
5楼
你如果加个流程图,把整个程序发过来,可以帮帮你

伏牛

  • 精华:1帖
  • 求助:0帖
  • 帖子:26帖 | 176回
  • 年度积分:0
  • 历史总积分:515
  • 注册:2005年6月26日
发表于:2008-12-04 17:03:55
6楼

 上面问题有了新的发现,系统被干扰后程序跳过了一段,
MOV R2,60H
MOV R0,#090H
MOV R1,#0B0H
NOP
NOP
位置0: LCALL D3SUB
位置1: MOV 60H,R2

MOV R2,61H
MOV R0,#091H
MOV R1,#0B1H
NOP
NOP
LCALL D3SUB
位置2: MOV 61H,R2
。。。。。。

LCALL HDAJCL
位置3: NOP
NOP
。。。。。。

干扰过后程序在执行了 LCALL D3SUB后没有回到“位置1”,而回到了“位置3”,
每次都如此。将子程序直接写在“位置0”替换掉 LCALL D3SUB,受到干扰后程序
在执行了第二个 LCALL D3SUB后没有回到“位置2”,仍然回到“位置3”。
将全部的 LCALL D3SUB替换掉,干扰后程序运行正常。

另一个处理办法是上面程序不改,将主程序修改了一下,
原来的主程序为:
START: NOP
NOP
MOV PCON,#1
NOP
NOP
SJMP START
NOP
NOP
SJMP START
主程序改为:
START: NOP
NOP
SJMP START
NOP
NOP
SJMP START
所有的处理程序都放在定时中断程序中,10ms处理一次,处理完后单片机进入休闲状态,
现主程序改为死循环,单片机一直运行。按此修改后也能保证系统手干扰后仍能正常运行。
请大家帮忙分析一下。

 

电工学徒

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 939回
  • 年度积分:0
  • 历史总积分:1127
  • 注册:2002年9月20日
发表于:2008-12-05 12:13:55
7楼

关注!!!!!!!!

蚂蚁牙黑

  • 精华:0帖
  • 求助:0帖
  • 帖子:22帖 | 174回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2008年4月01日
发表于:2008-12-05 13:00:23
8楼

只能你自己试了~~这儿51高手不多的,

才大器粗

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 299回
  • 年度积分:0
  • 历史总积分:1705
  • 注册:2007年10月19日
发表于:2008-12-05 23:17:27
9楼

确实痛苦。。。。。。。。。

变幻莫测

  • 精华:0帖
  • 求助:0帖
  • 帖子:23帖 | 1337回
  • 年度积分:0
  • 历史总积分:1937
  • 注册:2008年11月09日
发表于:2008-12-06 02:42:17
10楼

汇编不行,看着头痛。帮不了、

 

 

 

 

 

qixiaojin2002

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2009年1月13日
发表于:2009-01-13 17:16:04
11楼

大致看了一下。好像在77,76的上限以及75,74下限比较时.低位减法的借位应该带入高位减法。SUBB应该用带借位的SUBC。所以结果不对造成错误跳转。

qixiaojin2002

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2009年1月13日
发表于:2009-01-13 17:18:50
12楼
因为使用51是十年前的事情,个别指令记得不是很清。

热门招聘
相关主题

官方公众号

智造工程师