2016-11-10 171 views
0

我想让自己的延迟功能。简而言之,mydelay函数每secs秒调用toggled函数。代码写得不好,我知道(这是第一个版本)。但我只是想让它正常工作。然后我会重构它。但我有一些意想不到的错误。第一次在x函数循环中工作正常。它打印“我在同一时间”1秒钟,然后打印“即将结束mydelay”,这是我想要的行为。但在完成循环后在x。第二次循环时。它进入mydelay函数(没关系)。但是,它不是在印刷“我在同一时间”。它只是打印“Im ending mydelay”,这是不好的。Arduino创建延迟功能

下面是代码:

#include <Arduino.h> 
int led = 7; 
void setup() { 
    Serial.begin(9600); 
    pinMode(led, OUTPUT); 
} 

void loop() { 
    x(); 
    Serial.println("Im ending main loop"); 
} 

void x() { 
    for (int i = 0; i <= 10; i++) { 
    mydelay(led, 0, 1); 
    mydelay(led, 1, 1); 
    } 
} 

void mydelay(int pin, int hol, int secs) { 
    int starttime = millis(); 
    while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while"); 
    toggled(pin, hol); 
    Serial.println("Im ending mydelay"); 
} 

void toggled(int pin, int hol) { 
    digitalWrite(led, hol); 
} 
+0

我认为这个问题可能与** **米利斯,将回头率毫秒,因为Arduino的开始程序,我想最终米里斯,开始时间将比秒* 1000 – Josh

回答

2

变化int starttime = millis();unsigned long starttime = millis();。这可能是问题,因为如果你使用的是int,你的程序会在32秒后发疯。这是一个问题,因为int只能容纳一个从-32,768到32,767的数字。

另外,你不妨试试这个:

while ((millis() - starttime) <= (secs * 1000)) 
{ 
    Serial.println("I am in while"); 
} 
+0

是啊...较大我实际上打印了'(millis() - starttime)'并且在最后一次(当它开始疯狂时)最后一个值是65536,这是2^16。并且我想这与2^16有什么关系(我忘了arduino是16位)。不管怎样,谢谢! –

1

也许你可以尝试重置使用这样的事情米利斯,我没有一个Arduino所以它不是测试,但希望它可以提供帮助。

extern volatile unsigned long timer0_millis; 
unsigned long reset = 0; 

#include <Arduino.h> 
int led = 7; 
void setup() { 
    Serial.begin(9600); 
    pinMode(led, OUTPUT); 
} 

void loop(){ 
    x(); 
    Serial.println("Im ending main loop"); 

    setMillis(reset); 
} 

void setMillis(unsigned long new_millis){ 
    uint8_t oldSREG = SREG; 
    cli(); 
    timer0_millis = new_millis; 
    SREG = oldSREG; 
} 

void x() { 
    for (int i = 0; i <= 10; i++) { 
    mydelay(led, 0, 1); 
    mydelay(led, 1, 1); 
    } 
} 

void mydelay(int pin, int hol, int secs) { 
    int starttime = millis(); 
    while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while"); 
    toggled(pin, hol); 
    Serial.println("Im ending mydelay"); 
} 

void toggled(int pin, int hol) { 
    digitalWrite(led, hol); 
}