找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1330|回复: 5
打印 上一主题 下一主题
收起左侧

大家好,单片机初学者一直有个定时器疑问望能给指点

[复制链接]
跳转到指定楼层
楼主
ID:493146 发表于 2020-7-19 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学单片机,在学定时器中断的时候有一个疑惑的地方,就是假如我要用定时器中断产生一个比较长的时间,需要定时器每隔10毫秒产生一次中断,但是在定时器运行的期间还要实时检测一个io口,有没有这种可能,就是在定时器产生中断的时候正好io口也来了一个信号,这个时候信号应该是检测不到的,不知道我分析的对不对,这种情况有什么好的解决方法吗?谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:362076 发表于 2020-7-19 22:56 | 只看该作者
是对的,所以设计程序的时候需要将中断服务函数设计的尽量短。而且对于IO的信号,如果想要在循环内容较多的情况下尽快响应,还是应该采用中断的方式代替查询。否则就要保证程序循环时间小于信号有效时间。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-7-20 06:01 | 只看该作者
分析很对,因此设计中断执行指令必须尽可能少,有些不需要中断去执行的就不用放中断中,采取措施就是设定中断优先级,最高外部中断0,次计数器0,外1,定1,串口。
回复

使用道具 举报

地板
ID:801957 发表于 2020-7-20 16:38 | 只看该作者
分析没错,中断服务的程序设计应该短一些,有的没必要就不用写
回复

使用道具 举报

5#
ID:388929 发表于 2020-7-20 17:21 | 只看该作者
用优先级解决,应该是可以这样的
回复

使用道具 举报

6#
ID:451718 发表于 2020-7-20 17:30 | 只看该作者
要看你对这个IO检测对象是什么,还有这个对象产生IO变化的时长是什么级别,毫秒级还是10毫秒级,或是更长。 一般来说,
1:毫秒级以下的IO变化,都应该采用外部中断来处理。
2:毫秒以上的到10毫秒以内,我一般是在毫秒的定时中断函数里面,做一个标志位检测,在主程序或者其它地方判断这个标志位。
3 : 10毫秒到200毫秒的级别,放在10ms的定时器中就好了。
4:大于200毫秒的级别,直接放主程序中就行。
刚做单片机的时候,也有你同样的问题,假如定义了2个定时器,分别是定时器0和定时器1,定时器0是1ms的,定时器1是10ms的。在系统时钟运行到第10ms时候,到底是先触发第10个定时器0,还是第一个定时器1?按照优先级,应该是理解为先触发定时器0,再触发定时器1。其实是同时触发的,只是硬件会先执行定时器0里面的程序,再执行定时器1里面的程序。 那么值得注意的问题来了,如果定时器0执行的时间消耗了900ns会怎么样呢?那么留给定时器1的资源时长就只有1ms了。这样,很容易就会跑飞。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表