完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我编程的水平比较菜,最近碰到一个问题:用电容触摸来触发一个子程序。在这个子程序中,有几段100ms的延时。
现在发现这个子程序运行时会导致电容触摸子程序异常(出错,实际摸一次,程序却检测到摸了好多次)。想过用中断来做延时,但是只要进入子程序就必须要延时正好到100ms。否则,如果进入子程序后,延时还没到100ms,跳出子程序后,就没有办法在延时到100ms时回到该子程序的这个延时的地方了。不知道有没有一个好的程序结构可以解决这个问题?多谢! |
|
相关推荐
6个回答
|
|
定义一个全局变量,用来指示状态。条件满足时触发中断,在中断中改变这一变量的值。
在主程序不断循环判断,根据不同的值执行不同的操作。 当然,如果判断的东西多了,有可能一次循环下来,有多个状态满足条件,那下次循环的时候,还是该按顺序一个一个来,有可能时间就又难控制了。这时就需要更复杂一些的机制了。 |
|
|
|
需要延时的子程序结构是这样的:
void Function() { uchar i; A(); B(); __delay_ms(50); for(i=0;i<6;i++) { buf=DATA; } Send(buf,6); __delay_ms(100); C(); __delay_ms(100); D(); } 由于该驱动的时序要求,必须要有这些延时才能达到相应功能。而且只有A,B,C,D四个函数按照该顺序连续执行,才是有效命令。 现在问题是,如果我在执行到该子程序的中间时(比如到了B函数),如果延时没有到位,MCU就会跳出该子程序。等到我下次进入该子程序时,又是从头开始执行(A函数)。这样就没法跳过已经运行的A,B函数,直接运行C函数了。 |
|
|
|
所有延时用定时中断,在定时中断里做一个公共时标,在各个子程序里对时标计数判断,完成各自的动作. 这样再多的延时也不会相互影响.
时标取多小要统筹兼顾.原则是满足最小定时分辩率的前提下尽可能大点,以便让定时中断程序有足够时间处理. |
|
|
|
那你设个全局变量,执行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); ... |
|
|
|
|
|
|
|
用好定时器和中断,裸奔也基本没什么问题了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:44 , Processed in 0.468160 second(s), Total 50, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号