51定时中断的问题

[复制链接]
2639|4
 楼主| bit6019 发表于 2011-7-25 21:26 | 显示全部楼层 |阅读模式
这是一个多节点的数据采集系统, 各节点时时将采集到的数据“自主”上报到主机(采用一种总线仲裁的机制得到总线使用权),程序主流程如下:

    初始化
          |
数据采集处理(假定程序指针由ORG伪指令指定为0500H)
          |
   数据发送
          |
返回到数据采集处理(循环)


由于数据发送的时间受到网络上其他节点发送数据的限制而导致最终本节点的发送时间不定,有时甚至超过了采集数据的有效期,这时就要将数据作废,重新采集重新上报。我考虑采用定时器中断的方式。在数据发送的开始开启定时器,在“数据发送”的结束和“返回到数据采集处理”之前关闭定时器。如果在限定的时限内数据有效发送的话定时中断就不会起作用,如果数据发送的时间超过定时器限制,定时中断就会发生,就会进入中断服务程序中止此次数据的发送。
问题是:我想在定时器中断服务程序返回时回到“数据采集处理”而不是回到“数据发送”的中断现场,这可不可以通过修改中断时存入堆栈的数据来实现?即将中断时压入堆栈的PC值在中断服务程序内修改为“数据采集处理”的程序地址,这样返回时就可以直接回到“数据采集处理”而赶往下一轮的循环。程序如下:
intserv:
        中止发送过程...
        pop        r0                ;pch出堆栈
        pop        r1                ;pcl出堆栈
        mov        r0,#05H                ;修改pch
        mov        r1,#0H                ;修改pcl
        push        r1                ;pcl入堆栈
        push        r0                ;pch入堆栈
        reti                        ;中断返回

这样做有没有问题?
请高手指点,谢谢!
相见欢喜 发表于 2011-7-26 12:26 | 显示全部楼层
汇编好难,看不懂啊
-自己人 发表于 2011-7-26 20:37 | 显示全部楼层
讲解的很详细啊
思行合一 发表于 2011-7-28 23:56 | 显示全部楼层
好难啊,看的头大
delin17 发表于 2011-7-29 12:30 | 显示全部楼层
这样做是绝对有问题,首先你得了解是入中断时堆栈操作,他可能并不是单纯的只有PC入栈,可能还在状态入栈等,具体看单片机。
另,你这样做的话,有堆栈泄密,进中断100次,那么堆栈就有100*2个值是浪费了的。

建议,你了解中断入栈操作后,入栈操作中对应的中断发生点的地址,修改成你要返回的地址,如你所说的0x0500。
另一种方法就是通过中断设置,通过在发送的时候查标志来检查是否超时,这种方法更保险,只不过增加了时间和代码的开销
您需要登录后才可以回帖 登录 | 注册

本版积分规则

221

主题

1344

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部