Forum: Mikrocontroller und Digitale Elektronik ESP8266 warnung delay() genauigkeit


von Pepe T. (pepe_t)


Angehängte Dateien:

Lesenswert?

Falls ihr jemals versucht mit dem ESP8266 in arduino ein serielles 
signal zu erzeugen und dazu die delay() funktion verwendet seid gewarnt. 
Sobald wifi losballert, und das tut es periodisch, kann aus 1ms delay 
schnell mal 2ms werden.

Abhilfe schaffen
WiFi.forceSleepBegin();
WiFi.forceSleepWake();

Delay() wird dadurch nicht 100% korrekt, aber genauer als ohne 
wifisleep. Damit kann ich jetzt meine WP remote ein/aus schalten :)
Der millis() counter scheint das problem nicht zu haben.

: Bearbeitet durch User
von Christian M. (christian_m280)


Lesenswert?

Keine Angst, delay() wird nur von Leuten verwendet, die keine Ahnung 
haben!

Gruss Chregu

von Kojan (Gast)


Lesenswert?

Christian M. schrieb:

> Keine Angst, delay() wird nur von Leuten verwendet, die keine Ahnung
> haben!

Vielen Dank für das Eingeständnis Deiner Inkompetenz.

von Walter (Gast)


Lesenswert?

Kojan schrieb:
> Vielen Dank für das Eingeständnis Deiner Inkompetenz.


Vielen Dank für das Eingeständnis Deiner Inkompetenz. Christian hat 
völlig recht. Ein Blick auf den Sourcecode von delay() und es wird klar 
warum man es nicht für zeitkritische Sachen verwenden sollte.

von PittyJ (Gast)


Lesenswert?

delay() oder ähnlich benutze ich nur beim Debuggen.
Wenn ich genaue Zeiten brauche, dann nehmen ich die internen Timer mit 
entsprechender Auflösung.

Und bei zeitkritischen Signalen sollten keine längeren Interrupts 
vorhanden sein.
Alternativ die Signale auch per Timer-Interrupt erzeugen, oder gleich 
ein FPGA verwenden.

von Der Da (Gast)


Lesenswert?

Pepe T. schrieb:
> Falls ihr jemals versucht mit dem ESP8266 in arduino ein serielles
> signal zu erzeugen und dazu die delay() funktion verwendet seid gewarnt.
> Sobald wifi losballert, und das tut es periodisch, kann aus 1ms delay
> schnell mal 2ms werden.
>
> Abhilfe schaffen
> WiFi.forceSleepBegin();
> WiFi.forceSleepWake();
>
> Delay() wird dadurch nicht 100% korrekt, aber genauer als ohne
> wifisleep. Damit kann ich jetzt meine WP remote ein/aus schalten :)
> Der millis() counter scheint das problem nicht zu haben.

Wenn ich jetzt ohne Ahnung raten soll:

delay() verbrät einfach eine (bei der Kompilierung!) festgelegte Anzahl 
Prozessorzyklen.  Wenn dann interrupts dazukommen, wirds halt um die 
durchlaufzeit der Interrupts länger, d.h. nur wenn Interrupts 
abgeschaltet sind, ist die Zeit festgelegt, sonst ist das eine recht 
willkürliche Mindestzeit.

millis() aktivieren vermutlich einen Timer (oder beobachten einen Timer) 
und wenn der Timer sagt, jetzt ist x ms rum, dann gehts weiter. 
Vermutlich ist es den millis() egal, ob die Zeit in einer sinnfreien 
Schleife verbraten wird, oder in einem Interrupt.

Gruß

Robert

P.S. sollte aber irgendwo genauer dokumentiert sein.

von Wolfgang (Gast)


Lesenswert?

Der Da schrieb:
> millis() aktivieren vermutlich einen Timer (oder beobachten einen Timer)
> und wenn der Timer sagt, jetzt ist x ms rum, dann gehts weiter.

Mit Vermutungen kommst du da nicht weiter.
Warum verbreitest du solchen Unsinn, wenn du es nicht weißt?

Die Funktion millis() liefert den Wert eine Variablen zurück, die per 
Timerinterrupt hochgezählt wird.
Der Aufruf der Funktion blockiert nichts und da wird auch nicht 
gewartet.

von Stefan F. (Gast)


Lesenswert?

Der Punkt ist, dass der ESP periodisch Zeit für die WLAN Schnittstelle 
braucht. Dies ist nötig, um dem AP "ich bin noch da" zu melden, sonst 
wird man abgemeldet.

Der "Trick" des TO basiert darauf, diese WLAN Kommunikation kurz zu 
deaktivieren, damit sein Programm weitgehend exklusiv ausgeführt wird.

Hinter delay() steckt übrigens der os_timer aus dem Espressif SDK
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf

"Please note that os_timer APIs listed below are software timers 
executed in tasks, thus timer callbacks may not be precisely executed at 
the right time; it depends on priority"

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.