标题: 大家好,单片机初学者一直有个定时器疑问望能给指点 [打印本页]

作者: zcwjzwd    时间: 2020-7-19 21:22
标题: 大家好,单片机初学者一直有个定时器疑问望能给指点
初学单片机,在学定时器中断的时候有一个疑惑的地方,就是假如我要用定时器中断产生一个比较长的时间,需要定时器每隔10毫秒产生一次中断,但是在定时器运行的期间还要实时检测一个io口,有没有这种可能,就是在定时器产生中断的时候正好io口也来了一个信号,这个时候信号应该是检测不到的,不知道我分析的对不对,这种情况有什么好的解决方法吗?谢谢

作者: 凌净清河    时间: 2020-7-19 22:56
是对的,所以设计程序的时候需要将中断服务函数设计的尽量短。而且对于IO的信号,如果想要在循环内容较多的情况下尽快响应,还是应该采用中断的方式代替查询。否则就要保证程序循环时间小于信号有效时间。
作者: xianfajushi    时间: 2020-7-20 06:01
分析很对,因此设计中断执行指令必须尽可能少,有些不需要中断去执行的就不用放中断中,采取措施就是设定中断优先级,最高外部中断0,次计数器0,外1,定1,串口。
作者: 556cv    时间: 2020-7-20 16:38
分析没错,中断服务的程序设计应该短一些,有的没必要就不用写
作者: billaj    时间: 2020-7-20 17:21
用优先级解决,应该是可以这样的
作者: robinsonlin    时间: 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了。这样,很容易就会跑飞。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1