
Zitat von
Rabenauge
Wenn du dieses Flag in der selben Sekunde zurückstellst, in der die Aufgabe erledigt werden soll, wird die die ganze Sekunde über endlos oft erledigt, ist doch klar.
Der Ablauf sollte so sein:
- der Sekundenzeiger springt auf "erledigeDas"
-die Aufgabe wird erledigt, das Flag auf 1 gesetzt
-der Sekundenzeiger springt auf die nächste Sekunde- und hier wird das Flag wieder auf 0 gestellt, damit es bei der nächsten "erledigeDas"-Sekunde wieder greifen kann.
Du musst bedenken, dass der Timer ...zigmal pro Sekunde aufgerufen wird- wenn er also in der gleichen Sekunde das Flag wieder auf 0 stellt, klappt das nich.
so ganz genau weiss ich ja wirklich nicht (beim weiterschreiben habe ich begriffen was da abläuft) warum das jetzt funktioniert
, es tut's aber - und - ich hab ja für jedes ereignis was über die sekundenaufgaben läuft ja ein eigenes flag...
Mit dem flag alleine hat es ja vorher schon funktioniert, allerdings mit dem nachteil des 100fachen aufrufs und auch des 100fachen drucks des wertes. Das ist nun mit der entprellten ping variante weg...
Ich hab jetzt die ersten versuche mit dem servo-sweep hinter mir. Das hier:
Code:
void servo_sweep (void)
{
gemacht_servo_sweep_flag = 1;
for (pos = 0; pos < 100; pos += 1)
{
myservo.write(pos);
delay(50);
}
for (pos = 100; pos >= 0; pos -= 1)
{
myservo.write(pos);
delay(50);
}
}
funktioniert natürlich nicht, das blockiert die stepper. Aber das hier:
funktioniert schon, und auch mit dem gesetzten flag für den sweep. Möglichrweise wird der sweep-task ja auch 100x schnell hintereinander aufgerufen, das macht aber nix, weil ja der servo schon in der position ist, bzw. dorthin unterwegs...
Ich denke ich könnte auch mehrere solche timer benutzen, oder? z.b. mit unterschiedlichen intervallen...
Lesezeichen