xiaoliumonitor 发表于 2014-7-19 13:13:22

外部中断中使用millis()

论坛上有写

注意事项

当中断函数发生时,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()的数值将不会继续变化”吻合。
不知我的测试程序是否科学。
按照我的理解,如果用寄存器的方式(IARICCAVR等)来编写avr的程序,外部中断程序执行时,不应打断定时器0继续计数的。millis()是怎么玩的,还没搞懂。

pathletboy 发表于 2014-7-19 16:26:40

首先 millis依赖中断,arduino中断未嵌套,在你中断服务例程时候,定时器的中断不会响应,所以数值不会增加,其次,任何中断服务程序均应该设计的短小精悍,不要有任何延时。像你这种程序,应该在中断处理程序中使用变量,然后在主循环中判断后处理。

xiaoliumonitor 发表于 2014-7-19 20:00:15

谢谢回复   
“在你中断服务例程时候,定时器的中断不会响应,所以数值不会增加”

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

pathletboy 发表于 2014-7-20 12:50:28

也不能说完全不影响,举个极端例子。
比如你定时器正好到30MS-1us的时候,进入你的中断服务例程,耗时10us,退出你的中断立即响应定时器中断,忽略中断响应时间,那么本次定时器触发时间就成了30MS+9us,只是这个9us一般可以忽略。

xiaoliumonitor 发表于 2014-7-20 21:18:14

谢谢      

451506709 发表于 2014-12-1 15:12:28

我看了一下那Arduino的IIC中断,中断任务程序挺长的,感觉会影响millis的计数

haoyutian1 发表于 2019-4-30 12:19:23

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

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

pathletboy 发表于 2019-5-30 15:09:06

haoyutian1 发表于 2019-4-30 12:19
你好,millis函数可以放在中断服务程序中记录一个时间点吗?

可以的,可以的,可以的。
页: [1]
查看完整版本: 外部中断中使用millis()