打印

如何达到延时目的而不影响单片机的其他功能

[复制链接]
2452|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
erichuolo|  楼主 | 2012-4-26 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我编程的水平比较菜,最近碰到一个问题:用电容触摸来触发一个子程序。在这个子程序中,有几段100ms的延时。
现在发现这个子程序运行时会导致电容触摸子程序异常(出错,实际摸一次,程序却检测到摸了好多次)。想过用中断来做延时,但是只要进入子程序就必须要延时正好到100ms。否则,如果进入子程序后,延时还没到100ms,跳出子程序后,就没有办法在延时到100ms时回到该子程序的这个延时的地方了。不知道有没有一个好的程序结构可以解决这个问题?多谢!

相关帖子

沙发
PowerAnts| | 2012-4-26 17:57 | 只看该作者
没有寄存器、可编程分频器、硬件计数器么?

使用特权

评论回复
板凳
diweo| | 2012-4-26 22:13 | 只看该作者
定义一个全局变量,用来指示状态。条件满足时触发中断,在中断中改变这一变量的值。
在主程序不断循环判断,根据不同的值执行不同的操作。
当然,如果判断的东西多了,有可能一次循环下来,有多个状态满足条件,那下次循环的时候,还是该按顺序一个一个来,有可能时间就又难控制了。这时就需要更复杂一些的机制了。

使用特权

评论回复
地板
erichuolo|  楼主 | 2012-4-27 09:21 | 只看该作者
需要延时的子程序结构是这样的:
void Function()
{
  uchar i;
  A();
  B();  
__delay_ms(50);
  for(i=0;i<6;i++)
  {
    buf[i]=DATA[i];       
  }       
  Send(buf,6);
  __delay_ms(100);
  C();      
__delay_ms(100);
  D();
}
由于该驱动的时序要求,必须要有这些延时才能达到相应功能。而且只有A,B,C,D四个函数按照该顺序连续执行,才是有效命令。
现在问题是,如果我在执行到该子程序的中间时(比如到了B函数),如果延时没有到位,MCU就会跳出该子程序。等到我下次进入该子程序时,又是从头开始执行(A函数)。这样就没法跳过已经运行的A,B函数,直接运行C函数了。

使用特权

评论回复
5
tyw| | 2012-4-27 09:45 | 只看该作者
本帖最后由 tyw 于 2012-4-27 09:51 编辑

所有延时用定时中断,在定时中断里做一个公共时标,在各个子程序里对时标计数判断,完成各自的动作. 这样再多的延时也不会相互影响.
时标取多小要统筹兼顾.原则是满足最小定时分辩率的前提下尽可能大点,以便让定时中断程序有足够时间处理.

使用特权

评论回复
6
diweo| | 2012-4-28 07:00 | 只看该作者
那你设个全局变量,执行B了,就设定一个值,下次进入函数时,首先判断这个变量,再执行相应操作。程序大概是这样
uchar is_A_executed;
uchar is_B_executed;
....
void Function()
{
  uchar i;
if(! is_A_executed)
{
    A();
    is_A_executed=1;
}
if(! is_B_executed)
{
  B();  
    is_B_executed=1;
}
__delay_ms(50);
...

使用特权

评论回复
7
airwill| | 2012-4-28 09:07 | 只看该作者
这是我们的教材惹的祸.
光教人家 LoopDelay() 式的延时.
定时时标这种真正实用的定时方法, 却从来不见正规的教材介绍!

使用特权

评论回复
8
erichuolo|  楼主 | 2012-5-2 16:51 | 只看该作者
多谢各位的指导!最后改了一下程序结构,用定时器做好了。

使用特权

评论回复
9
zjp8683463| | 2012-5-2 22:27 | 只看该作者
用好定时器和中断,裸奔也基本没什么问题了

使用特权

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

本版积分规则

个人签名:有心皆苦,无心即乐

9

主题

142

帖子

1

粉丝