Die 300 Schleifendurchläufe sind schon viel zu wenig,
eigentlich bräuchte ich so 2000.
Aber schon die 300 scheinen zu viel zu sein,
da immer nut etwa 205 ausgegeben werden.
Da das Array ja irgendwo (in RAM?) gespeichert werden muss,
gehe ich davon aus, das der Speicher einfach zu klein ist.
Ist diese Annahme richtig?
Und wie könnte ich mein Problem anders lösen?
Gruß Kolja
Hallo,
ich nehme jetzt mal an, Du meinst mit ESP den ESP8266?
Da wären Deine 2000 int dann 8kB, das ist dann nicht das Problem.
Ich habe bei meinem Player 20kB als Buffer reserviert, incl. WLAN-Kram
usw.
Warum läßt Du die serielle nur mit 9600Baud laufen? Die kann auch 115200
und mehr.
Wenn Dein Programm komplett wäre, hätte ich es mal auf einen ESP8266
geflasht und geschaut, was passiert. Deine Hardware muß dazu ja nicht
dran sein um das zu testen.
Gruß aus Berlin
Michael
Hi Michael
Die Baudrate ändere ich gleich mal, danke für den Hinweis.
Der Sketch ist eigentlich komplett.
OK, bis auf den "servo" pin, der ist nicht initialisiert...
Gruß Kolja
edit: hätte ich mal genauer hingeschaut :-)
Es gibt nach der Ausgabe einen soft WDT reset:
1
225 427
2
226 430
3
227 43
4
Soft WDT reset
5
6
ctx: cont
7
sp: 3fff1770 end: 3fff1a50 offset: 01b0
8
9
>>>stack>>>
10
3fff1920: feefeffe feefeffe 00000000 4000050c
11
3fff1930: 3fffc278 00000002 3fff199f 40202e20
Und das ist die Ausgabe vom Exeption Decoder:
1
0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
2
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
3
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
4
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
5
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
6
0x40210ee5: pm_check_mac_idle at ?? line ?
7
0x40211100: pm_set_sleep_mode at ?? line ?
8
0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
9
0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
10
0x40203083: Print::print(long, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 119
11
0x40202ef8: Print::println() at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 144
12
0x402030ae: Print::print(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 99
13
: (inlined by) Print::println(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 171
14
0x402024c8: loop at /home/kolja/Arduino/AHA_Servo_lernen/hacked_Servo_ext_Poti_seriel.ino line 28 (discriminator 2)
15
0x40202f64: Print::println(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 156
16
0x4020283c: loop_wrapper at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/core_esp8266_main.cpp line 43
17
0x40100114: cont_norm at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/cont.S line 109
Scheint irgendwas mit dem Print Befehl zu tun haben.
TOP!
Aber der Reihe nach:
Das Eröhen der Baudrate auf 115200 reicht volkommen aus um jede
Millisekunde 2-3 Messungen durchzuführen.
Danke Michael
Die Yield Funktion habe ich noch nicht verstanden,
nur auf die Schnelle folgendes gefunden:
1
Yielding
2
3
This is one of the most critical differences between the ESP8266 and
4
a more classical Arduino microcontroller. The ESP8266 runs a lot of
5
utility functions in the background – keeping WiFi connected, managing
6
the TCP/IP stack, and performing other duties.
7
Blocking these functions from running can cause the ESP8266 to crash
8
and reset itself. To avoid these mysterious resets, avoid long,
9
blocking loops in your sketch.
10
11
If you have a long loop in your sketch, you can add a delay([milliseconds])
12
call within, to allow the critical background functions to execute.
13
The ESP8266’s delay() funciton, while of course delaying for a set
14
number of milliseconds, also makes a quick call to the background functions.
15
16
The amazing creators of the ESP8266 Arduino libraries also implemented
17
a yield() function, which calls on the background functions to allow
18
them to do their thing. As an example, if your sketch is waiting for
19
someone to press a button attached to pin 12, creating a loop like this
Hallo,
@ Dauergast (Gast):
stimmt, in der ersten und letzten Schleife allerdings nicht zwingend,
delay() erledigt das mit.
@Kolja (Gast):
Der ESP erledingt bei jedem Durchlauf von loop() noch etliches im
Hintergrund (WLAN-Kram und mehr), auch wenn Du es nicht direkt benutzt.
Das macht er auch, wenn delay() aufgerufen wird.
Wenn jetzt eine Schleife sehr lange braucht (mehrere ms), um
durchzulaufen, dann kommt er dazu nicht und nach ca. 6s schlägt sein
Watchdog-Timer zu und löst einen Reset aus.
yield() oder auch ein delay(0) gibt ihm gelegenheit, die Sachen zu
erledigen.
delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP
nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit
machen.
Deine dritte Schleife (Warteschleife) müßte eigentlich direkt gehen,
also dealy(10000), der Wert müßte ein int sein und damit auf dem
32Bitter groß genug.
Gruß aus Berlin
Michael
Kolja schrieb:> Die Yield Funktion habe ich noch nicht verstanden,> nur auf die Schnelle folgendes gefunden:
Meinst du wirklich, dass das Zitat unformatierter Text, vorbei am
automatischen Zeilenumbruch der Forensoftware, eine gute Idee ist?
Michael U. schrieb:> delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP> nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit> machen.
Wie war das doch gleich mit Milli und Mikro? ;-)
Wolfgang schrieb:> Michael U. schrieb:>> delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP>> nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit>> machen.>> Wie war das doch gleich mit Milli und Mikro? ;-)
naja, die Milli und Mikro sind hier so falsch ja nicht, zumindest,
solange 6000µs 6ms sind.
Falsch ist es, weil der WDT erst bei 6s zuschlägt, das ist aber auch
hinfällig, da irgendwo steht, daß delayMicroseconds() nur irgendwas
krummes um 15000 als Maximalwert verträgt.
Aber etwas Verwirrung ist beim ESP sowieso mitgekauft. ;)
Gruß aus Berlin
Michael