Danke für eure Vorschläge. jetzt muss ich warten, bis das Teil da ist. Danach bin ich erst mal unterwegs. Ich werde mich später sicher nochmal melden, wenn ich vielleicht noch nen Tipp brauche.
Lg Funky
Danke für eure Vorschläge. jetzt muss ich warten, bis das Teil da ist. Danach bin ich erst mal unterwegs. Ich werde mich später sicher nochmal melden, wenn ich vielleicht noch nen Tipp brauche.
Lg Funky
mit Arduino API Funktionen (millis, delay) geht das doch wirklich noch 1000mal einfacher....!
Wenn man kein retriggerbares Monoflop braucht, geht natürlich auch delay().
Sobald der Trigger ausgelöst ist, wird das stur abgearbeitet.Code:// Digispark Mini, ATtiny85, USB // Test 1 - Feste Zeiten mit Delay void setup() { pinMode(0, INPUT); pinMode(1, OUTPUT); } void loop() { int trigger = digitalRead(0); if (trigger <> 0) { digitalWrite(1, HIGH); delay(1000); //1 Sekunde an digitalWrite(1, LOW); delay(10000); //10 Sekunden aus digitalWrite(1, HIGH); delay(1000); //1 Sekunde an digitalWrite(1, LOW); } }
Ob währenddessen ein zweiter Trigger kommt, der den Zyklus verlängern soll, wird nicht registriert.
Bei Retriggerbarkeit, wird der erste 1 Sekunden Puls erzeugt, wenn während oder nach dem Impuls ein neuer Trigger kommt wird die Zeit für das Monoflop zurückgesetzt und die Gesammtzeit ist dann die schon verstrichene Zeit plus die Zeit auf die der Timer eingestellt ist. Wie bei einem Treppenhauslicht kann man damit die Zeit bis zum zweiten 1 Sekunden Puls beliebig verlängern, wenn mann innerhalb der Zeit immer wieder neu triggert.
Es kommt halt auf die exakte Aufgabenstellung an, was man benötigt.
genau, zum Retriggern verwendet man nicht delay sondern stoppt/überwacht millis() in einer eigenen while() loop:
zum Retriggern wird einfach vorher die Systemzeit millis gestoppt,
dann wird ein Zielwert der gestoppten Zeit + 10000 milli-sek (oder was auch immer) zwischengespeichert.
In der while-Schleife wird dann solange geloopt, bis millis den Zielwert erreicht oder überschritten hat.
In der Loop wird parallel weiterhin trigger=digitalRead(0) abgefragt, und wenn ein Tastendruck erfolgt ist, wird erneut der Zielwert um 10000milli-sek erhöht.
Die Version mit delay sieht doch recht überschaubar aus. Wenns damit erst mal klappt, kann man doch weiter experimentieren.
Ganz so einfach ist das nicht.
Der erste 1 Sekunden Puls soll ja nur einmal ausgeführt werden und darf sich auch nicht verlängern.
Und der zweite 1 Sekunden Puls soll auch nur einmal kommen, am Ende kommen und darf sich auch nicht verlängern.
Also muß durch Verriegelung verhindert werden das erneute Trigger diese Impulse mehrfach erzeugen oder verlängern.
Und der zweite 1 Sekunden Puls muß ein Retriggern verhindern während er läuft.
Man muß sich halt klar machen, das selbst bei kurzen Ereignissen, die Programmschleife x mal durchlaufen wird und ohne Verriegelungen und Zustandsmerker, der ganze Ablauf durcheinander kommen kann.
Nachdem der Vorgang gestartet worden ist, kann es zum erneuten Triggern kommen
1- während der erste Puls läuft
2- Zwichen den Pulsen
3- während der zweite Puls läuft
4- nach dem der Zyklus beendet ist.
Bei 1- darf sich nur die Zeit verlängern.
Bei 2- darf sich nur die Zeit verlängern.
Bei 3- darf gar nichts passieren.
Bei 4- wird der Zyklus neu gestarted.
und wie könnte das programmtechnisch aussehen?
Lesezeichen