Sekunden/Minuten-Timer retriggerbar realisieren

Hallo,

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?

Jemand eine Idee?

Vielen Dank für Eure Hilfe!

Gruß
dreamy1

Im aktuellen Elektorheft gibbet dazu ein geniales Programm auf Bascom genau für deinen Zeck unter dem Namen "i555"
http://www.elektor.de/jahrgang/2011/januar/i555.1647770.lynkx
Kann dir den Artikel auch mailen.

Hallo dreamy1
http://www.arduino.cc/playground/Code/Metro
oder über milli(), Du mußt einfach bei jedem Tastendruck (start) die Endzeit korrigieren.
Grüße Uwe

Vielen Dank Euch Beiden!

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 :slight_smile:

nicht ein einziges delay() enthalten sein darf

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ß.

Grüße Uwe

Hallo Uwe,

hmm, bekomme ich mit "vergangeneZeit = millis() - Startzeit" bei einem zwischenzeitlichen Überlauf nicht negative Werte?

Läuft die Funktion millis() eigentlich unabhängig von eingebauten delays() im Code?

Den Taster zum retiriggern wollte ich über einen Interrupt realisieren, so dass dieser nicht gepollt werden muss.

Gruß
dreamy1

Hallo dreamy1

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?

Grüße Uwe

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 :wink:
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

Hallo Ihr 2,

sodele, ich habs ausprobiert mit den millis() und eingebauter delay(10000). Ergebnis: es wird auch während der Wartezeit munter weitergezählt! Freu :slight_smile:

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 :slight_smile: 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 :slight_smile:

BTW: Das mit dem Entprellen sollte kein Pronlem in meiner Anwendung sein, da der Lowimpuls (externer Interrupt) von einem angesteuerten Open-Collector kommt.

Gruß
dreamy1