Aufruf einer Funktion

Guten Tag,

ich komme ja eher von Delphi, deshalb habe ich nicht so viel Erfahrung mit C.
Ich habe nun eine kleine Funktion geschrieben welche sich m. E. sehr merkwürdig verhält. Für mich ergibt das Verhalten überhaupt keinen Sinn. Was mache ich falsch?

Grüße

Matias

unsigned long delayStart_outPin0 = 0;
unsigned long delayStart_outPin1 = 0;

unsigned long delayStart_outPin01 = 0;
unsigned long delayStart_outPin11 = 0;

int inPin0 = 4;   
int inPin1 = 5;   

int outPin0 = 8;  
int outPin1 = 9;  

boolean checkDelay(unsigned long& adelayStart, unsigned long adelay);

void setup() 
{
  Serial.begin(9600);
  
  pinMode(inPin0, INPUT);
  pinMode(inPin1, INPUT);

  pinMode(outPin0, OUTPUT);
  pinMode(outPin1, OUTPUT);

  digitalWrite(outPin0, true);
}

void loop() 
{
  if (digitalRead(inPin0) == true
  && digitalRead(outPin1) == true
  && delayStart_outPin1 == 0)
  { // Ausschalt-Verzögerung für outPin1 starten
    delayStart_outPin1 = millis(); // start delay
  }

  // if (delayStart_outPin1 != 0 && millis() >=  delayStart_outPin1 + 400) // <- das funktioniert
  if (checkDelay(delayStart_outPin1, 400)) // <- das funktioniert nicht, sobald delayStart_outPin1 > 65535 wird (ist ja wohl die Grenze für Word)
  { // outPin1 ausschalten
    delayStart_outPin1 = 0;
    digitalWrite(outPin1, false);
  }
  
  if (digitalRead(outPin0) == false
  && digitalRead(inPin0) == true
  && digitalRead(outPin1) == false
  && delayStart_outPin01 == 0)
  { // Einschalt-Verzögerung für outPin0 starten
    delayStart_outPin01 = millis(); // start delay
  }

  // if (delayStart_outPin01 != 0 && millis() >= delayStart_outPin01 + 800)
  if (checkDelay(delayStart_outPin01, 800))
  { // outPin0 einschalten
    Serial.println(delayStart_outPin01);
    delayStart_outPin01 = 0;
    Serial.println(delayStart_outPin01);
    digitalWrite(outPin0, true);
  }
  
  // ---
  
  if (digitalRead(inPin1) == true
  && digitalRead(outPin0) == true
  && delayStart_outPin0 == 0)
  { // Ausschalt-Verzögerung für outPin0 starten
    delayStart_outPin0 = millis(); // start delay
  }

  // if (delayStart_outPin0 != 0 && millis() >=  delayStart_outPin0 + 400)
  if (checkDelay(delayStart_outPin0, 400))
  { // outPin0 ausschalten
    delayStart_outPin0 = 0;
    digitalWrite(outPin0, false);
  }
  
  if (digitalRead(outPin1) == false
  && digitalRead(inPin1) == true
  && digitalRead(outPin0) == false
  && delayStart_outPin11 == 0)
  { // Einschalt-Verzögerung für outPin1 starten
    delayStart_outPin11 = millis(); // start delay
  }
  
  // if (delayStart_outPin11 != 0 && millis() >=  delayStart_outPin11 + 800)
  if (checkDelay(delayStart_outPin11, 800))
  { // outPin1 einschalten
    delayStart_outPin11 = 0;
    digitalWrite(outPin1, true);
  }
  
}

// das funktioniert nicht:
// sobald adelayStart den Wert 65535 überschreitet liefert die Funktion 
// immer sofort true?
// wenn man die Zeile Serial.println(adelay); aktiviert bekommt man immer true 
// unter allen Umständen?
// adelayStart = 0; funktioniert dann ja auch nicht
boolean checkDelay(unsigned long& adelayStart, unsigned long adelay)
{
  unsigned long MyMillis = millis();
  if (adelayStart == 0)
  {
    return false;
  }
  
  if (adelayStart != 0 && MyMillis >= adelayStart + adelay)
  {
    // Serial.println(adelay);
    adelayStart = 0;
    return true;
  }
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Bitte ganzen Sketch zeigen. Auch die Variablendeklarationen.

Bitte überprüfe noch mal Deine Code-Tags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Millis überprüft man generell so:

aktuelleMillis = millis();
if (aktuelleMillis - letzteMillis >= intervall) {
  letzteMillis = aktuelleMillis; // nicht = 0!
  // tue etwas
}

Gruß Tommy

1 Like

Danke für die Antworten. Ich habe jetzt den kompletten Sketch angegeben.

So wie es aussieht kann die Funktion mit einem Wert größer 65535 (also Word) nichts anfangen. Ergibt einfach keinen Sinn für mich. Bin aber auch nur ein armer Pascal-Programmierer. :wink:

Hast Du meinen Beitrag #4 gelesen und verstanden?

Gruß Tommy

Nein, ich verstehe nicht was das mit dem Problem zu tun hat.

Weil Du die Auswertung von millis() falsch machst.
Millis ist ein fortlaufender Zähler, deshalb ist ein Rücksetzen von adelayStart auf 0 nicht zielführend.
Schau Dir in der IDE mal das Beispiel BlinkWithoutDelay an und verstehe es. Es geht nicht ums Blinken, sondern um Zeitabläufe.

Gruß Tommy

Das Problem ist doch nicht mein Code. Wenn ich genau den gleichen Code ausführe, ohne die Function aufzurufen, funktioniert das einwandfrei. Habe extra den ganzen Sketch gepostet mit Kommentar.

  1. Wenn deine diagnostischen Fähigkeiten so ausgeprägt wären, wie du glaubst, bräuchtest du nicht zu fragen.
  2. Dein Verfahren ist defekt. Glaube es, oder glaube es nicht. Meine Sorge soll es nicht sein.

Und ja: Ich kenne mich etwas mit den Arduino typischen Zeitsteuerungen aus!
Beispiel: