hat jemand eine Idee, wie man ein retriggerbares Monoflop im Sekunden-/Minutenbereich mit dem Arduino lösen kann? Der Timer soll während der Laufzeit retriggerbar sein, z.B. über einen kurzen Low-Pegel an einem Eingangspin.
Über einen "normalen" Timerüberlauf (Interrupt) bekommt man ja nur einige Sekunden hin, wenn ich das richtig verstanden habe. Das "Nullen" des Timers könnte man doch mit TCNT2=0 (für den Timer 2) machen, oder?
Die Metro-Funktion habe ich mir angesehen - leider steht da folgendes dabei:
"Because Metro does not use interrupts, you have to "check" the Metro regularly (at least every millisecond). "
Das bedeutet -wenn ich das richtig verstehe- dass im ganzen anderen Programmcode nicht ein einziges delay() enthalten sein darf, sonst funktioniert die Funktion nicht mehr richtig.
Ich werde versuchen, das mit den millis() zu probieren...das mit dem Ändern der Endzeit hört sich super an. Vielleicht kann ich da auch einfach etwas in der Form ">Endzeit" verwenden, dann machen ein paar Delays im Code auch nichts. Muss nur schauen, wie ich den Überlauf nach 49 Tage handle, da dann die Millis wieder bei 0 beginnen
Ich glaube das siehst Du richtig.
Das gleich Problem hast Du aber auch mit milli(). Wenn Du delays verwendest wird unter umständen die Zeir ungenau. Den Taster (retiggerbar) mußt Du sowieso immer wieder abfragen, da kannst Du aucht die Metro Funkton abfragen und delay stört auch bei der Tastaturabfrage..
Überlauf: Wenn Du die Zeitdifferenz so berechnest: vergangeneZeit = millis() - Startzeit bekommst Du trotz eines Überlaufs die richtige Zeutdifferenz; das einzige Limit ist, daß die Zeitdifferenz kleiner als 49 Tage sein muß.
Als variable für millis() mußt Du eine unsigned long verwenden, weil die Funktion ein solches Format verwendet. Dadurch gibt es keine negativen Zahlen, sondern wenn Du zur größten Zahl (2 hoch 32-1 = 4 194 967 296) 1 dazuzählst erhälst Du 0.
Den Taster zum retiriggern wollte ich über einen Interrupt realisieren,
Dann mußt Du den Taster elektronisch entprellen. ZB mit einem RC Glied ( R zwischen Taster und Eingang und C zwischen Eingang und Masse; werte 100kOhm 1µF) oder mit dem CD4099 Korrektur: MC14490
Ok das mit dem Interrupt ist ja in ordnung; nur was macht der Arduino während der die zeit abgezählt wird? Er Dreht so einsam seine Runden in der Loop() -Funktion.
Wie große Delay()-Zeiten willst Du einsetzen?
Läuft die Funktion millis() eigentlich unabhängig von eingebauten delays() im Code?
Gute Frage; die Antwort muß ich Dir schuldig bleiben; Ich kenne sie nicht. Probiers doch mal aus:
millis() auf seriele Schnittstelle ausgeben
Delay von 10000
millis() auf seriele Schnittstelle ausgeben
Ist die Differenz einige milisekunden oder 10000 und etwas millisekunden?
IMHO :
Also die Millis laufen während der delays weiter sonst wüsste der core doch nicht mehr wann deer delay vorbei ist und die millis sind doch nur eine ausgabe der internen ticks auf einer Zeitbasis von ms oder µs mit hilfe von internet Presacler.
Aber bitte korrigiert mich wenn ich da falsch liege.
Nein, volvodani Du liegst nicht falsch, aber dreamy1 sollte es selbst herausfinden
Wieso sollte ich etwas extra testen, wenn es dreamy1 auch machen kann; dann war ich dennoch zu neugierig und habs dann doch probiert.
Grüße Uwe
sodele, ich habs ausprobiert mit den millis() und eingebauter delay(10000). Ergebnis: es wird auch während der Wartezeit munter weitergezählt! Freu
Vielen Dank für Eure Hilfe und Erläuterungen! Ich habs leider mehr mit der Hardware als der Software, deshalb bin ich wirklich für jede Hilfe und Codeschnipsel dankbar Der Arduino ist bei mir jetzt schon nach kurzer Einarbeitung zur Sucht geworden...hätte man das vor Jahren gehabt, als man noch alles in Analogtechnik lösen musste...ich bin begeistert von dem kleinen Racker
BTW: Das mit dem Entprellen sollte kein Pronlem in meiner Anwendung sein, da der Lowimpuls (externer Interrupt) von einem angesteuerten Open-Collector kommt.