5639|10

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

定时计数器延时,中断 [复制链接]

用定时计数器进行延时,到时间后产生中断进入中断程序,最简单的那种延时一段时间,时间到进入一个中断程序可以搞定,但是想着有不同的延时时间(假设有延时1,2,3,4,5,6),不同的中断程序(假设有7,8),延时1,2,3到时间后进入的是中断7,延时4,5,6,到了进入的是中断8,程序方面该如何调整呢?我用的LPC1768的板子,
此帖出自ARM技术论坛

最新回复

做个全局变量的状态机计数器:state←0; ①.启动时对定时器设第1次延迟时间(300us),置state←1; ②.300us后发生中断,处理后见state=1,设第2次延迟时间(700us),置state←2; ③.700us后发生中断,处理后见state=2,设第3次延迟时间(300us),置state←3; ……… ……… 全部完成那个后,置state←0复位。 当然上述只是供参考的思路,可以设法写得简洁一些。   详情 回复 发表于 2014-6-9 10:39
点赞 关注
 

回复
举报

3138

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
如果不是时间特别短的延迟,用一个定时器中断就够了。

【例】
1毫秒中断服务程序
{
 if (计数器1 != 0) {
  if (--计数器1 == 0) {
   处理1;
  }
 }

 if (计数器2 != 0) {
  if (--计数器2 == 0) {
   处理2;
  }
 }

 ......
}

应用程序
{
 ......
 计数器1 = 500;  // 启动0.5秒定时器,延迟后做处理1
 ......

 计数器2 = 2000;  // 启动2秒定时器,延迟后做处理2
 ......
}
此帖出自ARM技术论坛

点评

延时大部分都是微秒精度的,LPC1768就四个定时器,而我想要的延时有6个或更多,中断执行程序只有两个。我知道同一个定时器可以改变参数达到不同的延时时间,可是在同一程序框架中如何控制执行哪一个延时时间呢?我是  详情 回复 发表于 2014-6-8 21:55
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

板凳
 
不过当“处理1”或“处理2”可能会占用时间较多时,中断服务程序可以只设置flag,处理的实体放到外面来做。
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
很高级的样子
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
很高级的样子
此帖出自ARM技术论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 
仙猫 发表于 2014-6-8 10:53
如果不是时间特别短的延迟,用一个定时器中断就够了。

【例】

延时大部分都是微秒精度的,LPC1768就四个定时器,而我想要的延时有6个或更多,中断执行程序只有两个。我知道同一个定时器可以改变参数达到不同的延时时间,可是在同一程序框架中如何控制执行哪一个延时时间呢?我是新手,大神请说详细点,谢谢。下边是最简单的定时计数延时,到时间然后产生中断的大致程序框架。要怎么改进呢?谢谢了
#include ...
#include ...

/*定时器0初始化*/
void timer0Init(void)
{
...
}
/*定时器0中断执行函数*/
void timer0_IRQHandler(void)
{
...
}

int main(void)
{
    各种初始化部分;
    引脚配置等等;
    while(1)
    {  }
}
此帖出自ARM技术论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

7
 

 其实CPU最怕的就是微秒级的延迟——用loop等待微秒太长,用中断做又太过频繁出入中断,CPU负担太重。
 在这种情况下,对指标仔细推敲就变得非常必要,光说“大部分”“微秒级”太笼统了,因为几百μs和几μs有天壤之别,而且定时器资源有限,不合理分配就不够用。另外除延迟时间的长短外,可能还有一个需要考虑的指标是:这些延迟有多高的精度要求?
 首先从硬件设计看,应尽量为软件创造条件,利用片内的PLL把时钟提到极限(1768好像是100MHz?如果不太在乎费电的话),这样在100MHz时钟下运行做数十μs的定时中断还是可能的。
 让间隔较长的延迟合用一个中断(参照俺楼上说的办法),而对实在太短的,比如仅数μs的延迟,则可采用查询的办法:腾出一个定时器来专用于查询,虽不如中断做法漂亮但实属无奈。
 以上仅供参考,因为毕竟对要求不甚了了。
此帖出自ARM技术论坛

点评

哎,蒙圈了。信号输出是300微秒,延时700微秒,然后再输出信号,再延时,重复8次,然后延时1700微秒,再输出信号。然后再延时6700微秒,再输出信号。精度约为0.2微秒,当然越高越好。如果总是延时700微秒,这倒是简  详情 回复 发表于 2014-6-9 08:43
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

8
 
仙猫 发表于 2014-6-8 22:54
 其实CPU最怕的就是微秒级的延迟——用loop等待微秒太长,用中断做又太过频繁出入中断,CPU负担太重。
...

哎,蒙圈了。信号输出是300微秒,延时700微秒,然后再输出信号,再延时,重复8次,然后延时1700微秒,再输出信号。然后再延时6700微秒,再输出信号。精度约为0.2微秒,当然越高越好。如果总是延时700微秒,这倒是简单了,可是怎么让他延时8次700微秒之后转换为延时1700微秒?然后再转换为6700微秒呢?延时时间如何转换这是难住小弟的地方,,,,
此帖出自ARM技术论坛

点评

原来只是对一个输出做顺序处理,这就好办了:用状态机的办法,每走一步都重设定时器就行了。 不过你说的倒真是有个难点,那就是0.2μs精度! 200ns的精度不该寄托于软件,而应由硬件来确保,软件一个中断响应进  详情 回复 发表于 2014-6-9 09:29
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

9
 
xiaoqiao2395 发表于 2014-6-9 08:43
哎,蒙圈了。信号输出是300微秒,延时700微秒,然后再输出信号,再延时,重复8次,然后延时1700微秒,再 ...


原来只是对一个输出做顺序处理,这就好办了:用状态机的办法,每走一步都重设定时器就行了。
不过你说的倒真是有个难点,那就是0.2μs精度!
200ns的精度不该寄托于软件,而应由硬件来确保,软件一个中断响应进去出来,200ns早没了。
此帖出自ARM技术论坛

点评

精度可以先忽略,只要可以延时那么长时间就可以了。但是走完一步如何重新设置啊?方法基本可以理解,但是程序框架这一块,,,,真是头疼  详情 回复 发表于 2014-6-9 10:09
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

10
 
仙猫 发表于 2014-6-9 09:29
原来只是对一个输出做顺序处理,这就好办了:用状态机的办法,每走一步都重设定时器就行了。
不过你说 ...

精度可以先忽略,只要可以延时那么长时间就可以了。但是走完一步如何重新设置啊?方法基本可以理解,但是程序框架这一块,,,,真是头疼
此帖出自ARM技术论坛

点评

做个全局变量的状态机计数器:state←0; ①.启动时对定时器设第1次延迟时间(300us),置state←1; ②.300us后发生中断,处理后见state=1,设第2次延迟时间(700us),置state←2; ③.700us后发生中断,处理后见  详情 回复 发表于 2014-6-9 10:39
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

11
 
xiaoqiao2395 发表于 2014-6-9 10:09
精度可以先忽略,只要可以延时那么长时间就可以了。但是走完一步如何重新设置啊?方法基本可以理解,但是 ...

做个全局变量的状态机计数器:state←0;
①.启动时对定时器设第1次延迟时间(300us),置state←1;
②.300us后发生中断,处理后见state=1,设第2次延迟时间(700us),置state←2;
③.700us后发生中断,处理后见state=2,设第3次延迟时间(300us),置state←3;
………
………
全部完成那个后,置state←0复位。
当然上述只是供参考的思路,可以设法写得简洁一些。
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表