Hallo,
bei dem folgenden Progrämmchen würde ich erwarten, dass das UP alle 5 s angesprungen wird und die Konsole dann "Zeitueberlauf" schreibt.
Statt dessen finde ich da :Code:#include <SimpleTimer.h> // einbinden der Library SimpleTimer timer1; // Benennung der Timer int zeitId; boolean Zeitueberlauf = false; void setup() { Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein while (!Serial); } void loop() { Serial.print ("zeitId = "); Serial.println (zeitId); if (Zeitueberlauf = true) { timer1.disable(zeitId); // Timer1 löschen delay (1000); } zeitId = timer1.setInterval(5000, Zeitablauf1); // Endzeit und UP, wenn Endzeit erreicht ist timer1.run(); } //**************************** UP Zeitablauf1 ************************************** void Zeitablauf1() { // wird ausgeführt, wenn SimpleTimer timer 1 abgelaufen ist Zeitueberlauf = true; // Serial.println (" Zeitueberlauf "); } // *********** ENDE UP Zeitablauf1
zeitId = 0
zeitId = 0
zeitId = 1
zeitId = 2
zeitId = 3
zeitId = 4
zeitId = 5
zeitId = 6
zeitId = 7
zeitId = 8
zeitId = 9
zeitId = -1
zeitId = -1
und Zeitueberlauf kommt überhaupt nicht.
Was bedeuten die Zahlen hinter "zeitId" und wieso wird die plötzlich negativ und bleibt auch so?
Gruß
fredyxx
Genau!entspricht:Code:if (Zeitueberlauf = true) { timer1.disable(zeitId); delay (1000); }endspricht der unbedingten Code-Passage:Code:Zeitueberlauf = true; if (Zeitueberlauf) { timer1.disable(zeitId); delay (1000); }Code:timer1.disable(zeitId); delay (1000);
Blöder Flüchtigkeitsfehler. Schaut man 10 mal hin und erkennt ihn nicht.
Aber noch mal die Frage:
Was bedeuten die Zahlen hinter "zeitId" und wieso wird die plötzlich negativ und bleibt auch so? Das ist auch nach der Korrektur so.
Gruß
fredyxx
schwer zu beantworten bei der bescheidenen arduino lib doku ... sehr mangelhaft imho
aber aus dem GitHub Fork herausgelesen
würde ich sagen, er teilt dir mit WELCHEN Timer er benutzt hat und mit -1 sagt er dass er keinen freien Timer gefunden hatCode:int SimpleTimer::setTimer(long d, timer_callback f, int n) { int freeTimer; freeTimer = findFirstFreeSlot(); if (freeTimer < 0) { return -1; } if (f == NULL) { return -1; } delays[freeTimer] = d; callbacks[freeTimer] = f; maxNumRuns[freeTimer] = n; enabled[freeTimer] = true; prev_millis[freeTimer] = elapsed(); numTimers++; return freeTimer; }
soll dir sagen, dass du dich mit der lib nochmal befassen musst um heraus zu bekommen wie man einen belegten timer auch wieder freigibt oder wiederverwendet ... ich hab damit leider keine ERfahrug aber andere können dir sicher helfen
Dein COde macht allerdings auch irgendwie keinen richtigen Sinn, egal ob ein Timer "Überläuft" oder nciht, in deiner loop wird imer weider ein neuer Intervall gestartet und das verbrennt dir natürlich deine Reserven, was bezweckst du mit dem Code?!
Geändert von Ceos (09.06.2016 um 08:41 Uhr)
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Da ich in einem umfangreicheren Programm Probleme damit habe, wollte ich hier nur mal testen, ob das UP überhaupt durchlaufen wird.Dein COde macht allerdings auch irgendwie keinen richtigen Sinn, egal ob ein Timer "Überläuft" oder nciht, in deiner loop wird imer weider ein neuer Intervall gestartet und das verbrennt dir natürlich deine Reserven, was bezweckst du mit dem Code?!
Das andere Programm wollte ich aber keinem zumuten, um die Hilfsbereitschaft in diesem Forum nicht überzustrapazieren, zumal es noch logische Fehler enthält, an denen ich noch rumknabbere. Da habe ich die "==" aber richtig benutzt.
Gruß
fredyxx
- - - Aktualisiert - - -
Das ist wohl so, denn mit dem Befehl " Serial.println ( timer1.getNumTimers());" wird ab -1 immer 10 (=slots) ausgegeben.würde ich sagen, er teilt dir mit WELCHEN Timer er benutzt hat und mit -1 sagt er dass er keinen freien Timer gefunden hat
Habe ich gemacht und festgestellt, dass für meine Zwecke der Befehl:soll dir sagen, dass du dich mit der lib nochmal befassen musst um heraus zu bekommen wie man einen belegten timer auch wieder freigibt oder wiederverwendet
zeitId = timer1.setInterval(5000, Zeitablauf1);
der falsche war. Der Timer wird hier nach jeweils 5 s wieder neu gestartet und das geht wohl nur 10 (10 Slots) mal oder so ähnlich.
Mit diesem Befehl:
zeitId = timer1.setTimeout(5000, Zeitablauf1);
wird der Timer nur ein Mal gestartet und dann nicht mehr; und so wollte ich das auch haben.
Im Nachhinein eigentlich klar!!
Gruß
fredyxx
Lesezeichen