2016-11-10 30 views
0

私は自分の遅延機能を作ろうとしています。簡単にmydelay関数はsecs秒ごとにtoggled関数を呼び出しています。コードはうまく書かれていない、私は知っている(これは最初のバージョンです)。しかし、私はそれが正しく動作するようにしようとしています。それから私はそれをリファクタリングします。しかし、予期せぬバグがあります。初めてxのループが正常に機能しています。 「私は中にいる」という文字を1秒間印字してから、自分が望む動作である「Im ending mydelay」を印刷します。しかし、ループを終了した後にx。 2回目にループします。それは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のプログラムを開始しますので、ミリ秒を返し続けます**ミリ秒**、とあるかもしれないと思い、私は最終的にミリ秒-STARTTIMEは秒×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); 
} 
関連する問題