2016-11-10 165 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); 
}