极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24132|回复: 7

外部中断中使用millis()

[复制链接]
发表于 2014-7-19 13:13:22 | 显示全部楼层 |阅读模式
论坛上有写

注意事项

当中断函数发生时,delya()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。



volatile unsigned long count;
volatile unsigned long time;
void setup()
{
  pinMode(2,INPUT_PULLUP);
  pinMode(13,OUTPUT);
  attachInterrupt(0,test,FALLING);
  
}
void loop()
{
      
}
void test()
{
for(count=0;count<100000;count++);
if(millis()-time>10000)
  digitalWrite(13,HIGH);
}


我写了上面测试程序,然后用插针碰触2脚,(插针另一脚接地)。
发现可以与“当中断函数发生时millis()的数值将不会继续变化”吻合。
不知我的测试程序是否科学。
按照我的理解,如果用寄存器的方式(IAR  ICCAVR等)来编写avr的程序,外部中断程序执行时,不应打断定时器0继续计数的。millis()是怎么玩的,还没搞懂。
回复

使用道具 举报

发表于 2014-7-19 16:26:40 | 显示全部楼层
首先 millis依赖中断,arduino中断未嵌套,在你中断服务例程时候,定时器的中断不会响应,所以数值不会增加,其次,任何中断服务程序均应该设计的短小精悍,不要有任何延时。像你这种程序,应该在中断处理程序中使用变量,然后在主循环中判断后处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-19 20:00:15 | 显示全部楼层
谢谢回复   
“在你中断服务例程时候,定时器的中断不会响应,所以数值不会增加”

按照我的理解是中断服务执行时(例如外部中断0),定时器的数值(TCNT0  例如定时器0定时30ms,执行外部中断时它刚计到10ms)依旧会增加。哪怕外部中断只有几微秒,但是这几微妙也丝毫不会影响定时器的30ms定时,定时器不会在“30ms+ 几微秒”再响应。 不知我理解的是否正确?
回复 支持 反对

使用道具 举报

发表于 2014-7-20 12:50:28 | 显示全部楼层
也不能说完全不影响,举个极端例子。
比如你定时器正好到30MS-1us的时候,进入你的中断服务例程,耗时10us,退出你的中断立即响应定时器中断,忽略中断响应时间,那么本次定时器触发时间就成了30MS+9us,只是这个9us一般可以忽略。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-20 21:18:14 | 显示全部楼层
谢谢        
回复 支持 反对

使用道具 举报

发表于 2014-12-1 15:12:28 | 显示全部楼层
我看了一下那Arduino的IIC中断,中断任务程序挺长的,感觉会影响millis的计数
回复 支持 反对

使用道具 举报

发表于 2019-4-30 12:19:23 | 显示全部楼层
pathletboy 发表于 2014-7-20 12:50
也不能说完全不影响,举个极端例子。
比如你定时器正好到30MS-1us的时候,进入你的中断服务例程,耗时10us ...

你好,millis函数可以放在中断服务程序中记录一个时间点吗?
回复 支持 反对

使用道具 举报

发表于 2019-5-30 15:09:06 | 显示全部楼层
haoyutian1 发表于 2019-4-30 12:19
你好,millis函数可以放在中断服务程序中记录一个时间点吗?

可以的,可以的,可以的。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 05:44 , Processed in 0.038722 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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