Forum: Mikrocontroller und Digitale Elektronik delay-Genauigkeit


von Oberfranke (Gast)


Lesenswert?

Hallo,

ich arbeite zurzeit in dieser Arduino IDE mitsamt Arduino und habe da 
eine Frage zur delay() Funktion. Kann ich davon ausgehen, dass die 
delay() Funktion chronografisch sehr genau ist? Wenn der Mikrocontroller 
seinen Takt durch einen Quarz bekommt, müsste es doch 
mikrosekunden-genau sein, oder?
 Mir geht es jetzt nicht um eine kleine Zeitspanne, sondern ich brauche 
für eine Projekt immer einen ziemlich langen, aber zeitlich exakten 
Ablauf des Programmes. Kann ich mich darauf verlassen, wenn ich als 
Parameter z.B. 50 Minuten eingebe, er den Programmablauf um 50 Minuten 
+/- 0.5 Sekunden unterbricht?
Oder lässt sich das einfacher realisieren? Timer?
Aber habt Geduld, bin noch ziemlich am Anfang ;)

Oberfranke

von Peter II (Gast)


Lesenswert?

Oberfranke schrieb:
> Oder lässt sich das einfacher realisieren?
> Timer?
ja, denn eine dalay verlängert sich um die zeiten der ISR. Das delay ist 
also nur genau wenn du die interupts sperrst.

von Timmo H. (masterfx)


Lesenswert?

Sowas macht man mit Timern. Bei so großen Zeitkonsten würde es sich 
sogar anbieten einen asynchronen Timer mit Uhrenquarz dran zu nehmen. Du 
zählst dann einfach in der Intterupt-Routine deine Sekunden und Minuten 
hoch und wenn >= 50 Minuten erreicht ist setzt du ein globales Flag und 
startest in deiner Hauptschleife eben deine Dinge die getan werden 
sollen. Und dann geht der Spaß von vorne los.
Selbst wenn Delay recht genau arbeitet (sofern die Interrupts aus sind), 
so kannst du während des Wartens ja nichts anderes machen als zu warten. 
Ist also ziemlich verschwendete Rechenzeit, vorallem bei so einer 
Zeitkonstante.
Wenn du mit dem Asynchronen Timer arbeitest, kannst du deinen µC auch 
solange schlafen legen bis z.B. 1s vergangen ist, dann wacht er kurz auf 
zählt seine Sekunden und Minuten hoch und geht dann wieder pennen.

von Harald W. (wilhelms)


Lesenswert?

Oberfranke schrieb:

> Parameter z.B. 50 Minuten eingebe, er den Programmablauf um 50 Minuten
> +/- 0.5 Sekunden unterbricht?
> Oder lässt sich das einfacher realisieren?

Die in heutigen (Analog-) Quarzuhren verbauten Oszillatoren sind
selbst bei Billiguhren erstaunlich genau. Ausserdem kann man die
leicht überprüfen, wenn man die Uhren einige Tage laufen lässt
und z.B. mit einer Funkuhr vergleicht. Wenn Du dann die Elektronik-
platine aus einer solchen Uhr ausbaust, hast Du einen billigen und
genauen Taktgeber mit 1s-Impulsen. Diese Impulse kannst Du dann mit
einem CMOS-IC beliebig runterteilen und so die von Dir gewünschte
Genauigkeit spielend erreichen. Da dies aber ein µP-Forum ist,
sind solche Einfachlösungen hier eher unerwünscht.
Gruss
Harald

von Karl H. (kbuchegg)


Lesenswert?

Oberfranke schrieb:
> Hallo,
>
> ich arbeite zurzeit in dieser Arduino IDE mitsamt Arduino und habe da
> eine Frage zur delay() Funktion. Kann ich davon ausgehen, dass die
> delay() Funktion chronografisch sehr genau ist?

Was du dir angewöhnen musst:
Streiche die delay Funktion aus deinem Wortschatz.
Es gibt ein paar wenige Fälle, in denen delay sinnvoll sind. Die sind 
aber allesamt kurze Zeiten und die 2-te Nebenbedingung ist, dass es 
nichts ausmachen darf, wenn die Zeit auch schon mal (im Rahmen) länger 
wird als vorgesehen.

Ansonsten ist delay() nicht die Lösung sondern meistens das Problem in 
einem Programm.

Zeitsteuerungen führen IMMER über einen Timer.

von Peter D. (peda)


Lesenswert?

Oberfranke schrieb:
> Kann ich davon ausgehen, dass die
> delay() Funktion chronografisch sehr genau ist?

Selbst wenn sie das wäre, würde das nichts nützen. Jeder Code braucht 
Zeit für seine Ausführung.
Sobald also zu dem Delay noch anderer Code ausgeführt wird, ist die 
Genauigkeit zum Teufel. Eine Uhr mit Delay muß nachgehen.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.