发新帖我要提问
12
返回列表
打印

定时中断每隔1s调用一次显示程序

[复制链接]
楼主: wdyang
手机看帖
扫描二维码
随时随地手机跟帖
21
wdyang|  楼主 | 2010-7-16 23:22 | 只看该作者 回帖奖励 |倒序浏览

RE: 感谢LS的指点

21# awmc_m
谢谢您的指点。标红字的地方MOV R7,#20 我确实忘记重新赋值了。我程序中确实也把所有的SJMP改为了LJMP,同理也把ACALL 改为 LCALL。按照您的方法我运行了,依旧不行。
但是我有个问题就是, 您说
另外在中断程序中作显示是不可取的。就算要在里面显示,你也应该先将定时器关掉,显示完再开定时器。

但是我是这样想的,先开定时再调显示是为了定时能够更准确,如果先调显示,再开定时,那么显示程序所耗费的时间就会成为时钟误差,累计起来误差就肯定有影响。但是您说的一定有您的道理。我也试了先显示后开定时。也没有效果.不知道是什么原因.......可能还是其他原因导致的.....

使用特权

评论回复
22
new1988| | 2010-7-17 09:25 | 只看该作者
本帖最后由 new1988 于 2010-7-17 09:37 编辑

22# wdyang
你显示 的时钟和你多久显示有什么关系,显示的时间是由你的1302出来的,就算你两秒显示一次也不会有什么关系。何必那么精确,你在中断里面调用子程序,是很危险的。一般中断服务程序尽可能的精简。想你这种要按时间来处理子程序的话,最好的方法是在中断里面设置个时标。例如我的那个程序
中断为10ms一次,为每个任务都分配个寄存器,当定时器用。
TIMER1 >=任务1间隔的时间 ,任务1,TIMER1 清 0
TIMER2 >=任务2间隔的时间 ,任务2,   TIMER2 清 0
........
TIMERn >= 任务3间隔的时间, 任务n, TIMERn 清 0
前提是每个任务执行的时间必须小于10ms。这就是最简单的任务调度器。

使用特权

评论回复
23
awmc_m| | 2010-7-17 18:52 | 只看该作者
21# awmc_m
谢谢您的指点。标红字的地方MOV R7,#20 我确实忘记重新赋值了。我程序中确实也把所有的SJMP改为了LJMP,同理也把ACALL 改为 LCALL。按照您的方法我运行了,依旧不行。
但是我有个问题就是, 您说

但是 ...
wdyang 发表于 2010-7-16 23:22


因为不知道你的display函数执行的时间,如果超过你的定时时间(50ms?)那就必须先关掉定时器,显示完再打开。不然还没有显示完又再一次进入中断了。

使用特权

评论回复
24
wdyang|  楼主 | 2010-7-21 17:25 | 只看该作者
谢谢各位这几天对本帖的关注,问题已经解决了。

使用特权

评论回复
25
望断云山| | 2010-7-21 22:48 | 只看该作者
timer0:     '定时器0中断入口
push acc
.
.
.
mov th0,#xx
mov tl0,#xx
.
.
.

(一堆保护现场、定时器重新赋值的东西)
djnz r7,exit_timer0
(在这里刷新显示)
mov r7,#20
...
exit_timer0:

pop acc
.
.
(一堆恢复现场的东西)
reti

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则