pliangpalm 发表于 2014-4-15 00:42:03

最近在学习arduino 想请教前辈一个问题 millis()开机时间如何清零,有没有对应的.

millis()该怎么清零有没有什么函数可以清掉的?如果可以的话我们开发一些东西就很好进行任务调度了
另外系统运行起来后如何软复位?
谢谢各位前辈了

春泥蛋炒饭 发表于 2014-4-15 03:24:38

millis()实际读取的是一个名为 timer0_overflow_count 的系统变量,用这两行可以清零:

extern volatile unsigned long timer0_overflow_count;
timer0_overflow_count = 0;

但是你这样做会破坏掉使用millis的arduino内部函数和库的运行,所以不建议这样做。
我估计你担心millis在49天后会溢出,其实可以使用一个记住时间差值的变量就可以了,你可以随便清零。

简单的软件复位方法是把reset引脚连到一个数字引脚,然后输出低电位就可以复位了。

pliangpalm 发表于 2014-4-15 12:31:13

嗯,这样也行,听君一席话豁然开朗,谢谢

pliangpalm 发表于 2014-4-15 12:35:59

春泥蛋炒饭 发表于 2014-4-15 03:24
millis()实际读取的是一个名为 timer0_overflow_count 的系统变量,用这两行可以清零:

extern volatile ...

对了,有木有,指令让CPU软复位的指令,有的话就不用外接了,毕竟接io口去复位脚,总觉得有点不安全

万马奔腾 发表于 2014-4-15 13:08:01

春泥蛋炒饭 发表于 2014-4-15 03:24 static/image/common/back.gif
millis()实际读取的是一个名为 timer0_overflow_count 的系统变量,用这两行可以清零:

extern volatile ...

这也算是一种方法

春泥蛋炒饭 发表于 2014-4-15 13:21:34

pliangpalm 发表于 2014-4-15 12:35 static/image/common/back.gif
对了,有木有,指令让CPU软复位的指令,有的话就不用外接了,毕竟接io口去复位脚,总觉得有点不安全

如果你不喜欢接线,纯软件方法也有,不容易懂而已。

定义一个reset函数:
void(* resetFunc) (void) = 0;

需要复位时这样调用:
resetFunc();

pliangpalm 发表于 2014-4-15 18:14:03

春泥蛋炒饭 发表于 2014-4-15 13:21 static/image/common/back.gif
如果你不喜欢接线,纯软件方法也有,不容易懂而已。

定义一个reset函数:


我试试哈!谢谢您:handshake

xiaoliumonitor 发表于 2014-7-5 15:12:11

刚才试验了一下

extern volatile unsigned long timer0_overflow_count;
void (*zero)(void)=0;
void setup()
{
Serial.begin(9600);
delay(5000);
Serial.print(millis());
}
void loop()
{

   delay(15000);
   Serial.print(millis());
   delay(10);
   zero();
// pinMode(5,OUTPUT);
    //timer0_overflow_count = 0;

}
春泥蛋炒饭提到的IO口重启和程序指针归零都可以用,



extern volatile unsigned long timer0_overflow_count;
timer0_overflow_count = 0;这种方法不可用
我用的是1.0.5
谢谢春泥蛋炒饭

xiaoliumonitor 发表于 2014-7-5 15:17:49

接上面
IO口复位会执行bootloader程序
而PC值归零不会执行bootloader    直接从零地址开始干活了

aszhongjian 发表于 2016-3-13 11:19:40

mark 一个,谢谢
页: [1]
查看完整版本: 最近在学习arduino 想请教前辈一个问题 millis()开机时间如何清零,有没有对应的.