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
Keine Angst, delay() wird nur von Leuten verwendet, die keine Ahnung haben! Gruss Chregu
Christian M. schrieb: > Keine Angst, delay() wird nur von Leuten verwendet, die keine Ahnung > haben! Vielen Dank für das Eingeständnis Deiner Inkompetenz.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.