ich nutze seit meinem Umstieg zu Arduino gerne die ds1307new LIB auch mit der DS3231. Auf dem ESP32 gibt es sofort nach #include einen Absturz. Was ich getestet habe, Wire funktioniert sofort auch ohne Nennung von SDA & SCL (21,22) I2C scan funktioniert meine eigene Temperaturauslesung der DS3231 funktioniert Ich finde aber in der ds1307new LIB cpp&h keine spezifischen AVR Befehle die explizit auszuklammern sind oder per #if defined(ESP32) ersetzt werden müssen.
Joachim B. schrieb: > Auf dem ESP32 gibt es sofort nach #include einen Absturz. Geht es ein bisschen genauer? Vielleicht kommt das Betriebssystem des ESP mit dem unkontrollierten
1 | while(!Wire.available() ... |
nicht zurecht? Ein yield() könnte helfen.
Wolfgang schrieb: > Vielleicht kommt das Betriebssystem des ESP mit dem > unkontrolliertenwhile(!Wire.available() ... nicht zurecht? hmmm, möglich, aber das ist in der DS3231 auch nicht vorhanden
1 | void DS1307new::getCTRL(void) |
2 | {
|
3 | Wire.beginTransmission(DS1307_ID); |
4 | Wire.write((uint8_t)0x07); // set CTRL Register Address |
5 | Wire.endTransmission(); |
6 | Wire.requestFrom(DS1307_ID, 1); // read only CTRL Register |
7 | #if defined(ESP32)
|
8 | while(!Wire.available()) |
9 | {
|
10 | // waiting
|
11 | }
|
12 | #endif
|
13 | ctrl = Wire.read(); // ... and store it in ctrl |
14 | }
|
hat nicht geholfen, abgesehen davon rufe ich das nicht auf an der DS3231 genausowenig wie Start Stop clock. Wolfgang schrieb: > Geht es ein bisschen genauer? was meintest du mit Wolfgang schrieb: > Ein yield() könnte helfen. mein Verdacht richtet sich gerade auf das vordefinierte RTC Objekt, kann es sein das es im ESP schon vorhanden ist und sich das beisst? Ich sollte das mal umbenennen
Joachim B. schrieb: > Ich sollte das mal umbenennen hat nichts gebracht, kein weiteres RTC. Objekt was sich beissen könnte übrigens scan I2C und RTC Temperatur auslesen Serial.print
1 | tach auch.... |
2 | Arduino: 1.8.8, auf ESP32 WEMOS LOLIN32 |
3 | File: D:\atmel\__ARDUINO__\pcd_test_blau_bi__\pcd_test_blau_bi__.ino |
4 | compile: 2019/08/24_13:10:46 |
5 | CPU Takt: 240 MHz |
6 | |
7 | -> Scanning... |
8 | I2C device found at address 0x50; 1010000x; << 0xA0; 10100000 I2C EEPROM |
9 | I2C device found at address 0x68; 1101000x; << 0xD0; 11010000 DS3231 RTC |
10 | done
|
11 | |
12 | --------------
|
13 | 3. Durchlauf |
14 | 0xA0 I2Ceeprom |
15 | 0xD0 DS3231rtc |
16 | |
17 | RTC T= 28.2C |
18 | |
19 | --------------
|
20 | RTC T= 28.2C |
21 | RTC T= 28.2C |
:
Bearbeitet durch User
Joachim B. schrieb: > Wolfgang schrieb: >> Vielleicht kommt das Betriebssystem des ESP mit dem >> unkontrolliertenwhile(!Wire.available() ... nicht zurecht? > > hmmm, möglich, aber das ist in der DS3231 auch nicht vorhanden > void DS1307new::getCTRL(void) > { > Wire.beginTransmission(DS1307_ID); > Wire.write((uint8_t)0x07); // set CTRL Register > Address > Wire.endTransmission(); > Wire.requestFrom(DS1307_ID, 1); // read only CTRL Register > #if defined(ESP32) > while(!Wire.available()) > { > // waiting > } > #endif > ctrl = Wire.read(); // ... and store it in ctrl > } Aber du hast es doch selbst zitiert. Da ist doch ganz deutlich die von Wolfgang genannte Warteschleife zu sehen, oder sehe ich geister? Anstelle von "// waiting" könnte man versuchen, ein yield() einzufügen. Ich würde da mal eine große Menge Debug Meldungen hinzufügen, damit du anhand der Textausgaben sehen kannst, wo es hängt.
Stefanus F. schrieb: > Anstelle von "// waiting" könnte man versuchen, ein yield() einzufügen. da ich nicht weiss was ein "yield()" ist..... das "while(!Wire.available())" hatte ich auskommentiert für den ESP32 wenns stört sollte das also nicht der Grund sein. Ich frage mich immer noch warum das pure einbinden der LIB ohne Aufrufen einer einzigen LIB Funktion schon zum ESP Absturz führt. Wenn mir das einer erklären würde bitte, einbinden genügt und schon ist der Absturz da. Ich dachte ich kann alles mit #include einbinden solange ich nichts davon aufrufe. #include ist doch nur eine pre Prozessor Texteinsetzung.
Joachim B. schrieb: > da ich nicht weiss was ein "yield()" ist..... Dann informiere dich doch bitte mal. Das ist eine Arduino Funktion, nicht schwer zu finden. Bei ESP Chips hat sie eine wichtige Funktion, nämlich zeit an das Betriebssystem abzugeben. > das "while(!Wire.available())" hatte ich auskommentiert für den ESP32 Hast du nicht, du hast "#if defined(ESP32)" drumherum gebaut, damit ist dieser Block nur für ESP32 aktiv und für die anderen auskommentiert. > Ich frage mich immer noch warum das pure einbinden der LIB ohne > Aufrufen einer einzigen LIB Funktion schon zum ESP Absturz führt. Weil die ESP Chips ein Betriebssystem haben, dass in kleinen Intervallen Rechenzeit benötigt. Bekommt es keine Rechenzeit, wir der Chip durch den Watchdog (Stichwort zum Googeln) zurück gesetzt. Der Watchdog-Reset klappt aber oft nicht wie geplant, dann hängt der Chip. Außerdem kann es sein, dass eine Library zu viel Speicher belegt - beim ESP32 aber wohl eher nicht. > Ich dachte ich kann alles mit #include einbinden solange > ich nichts davon aufrufe. > #include ist doch nur eine pre Prozessor Texteinsetzung. Ja schon, aber was macht denn der Text, der da eingefügt wird? Das ist doch der springende Punkt. Er belegt zum Beispiel Speicher für Objekte, deren Konstruktor ausgeführt wird und die sich möglicherweise beim Betriebssystem als Callback-Handler (Stichwort zum Googeln) registrieren.
Alternativ einfach eine Lib nehmen die mit dem ESP32 getestet wurde. https://github.com/Naguissa/uRTCLib https://github.com/Makuna/Rtc
Lösung gefunden! in der LIB ist ein "Wire.begin();" das doppelt mit meinem Aufruf stört im AVR nicht, im ESP schon und siehe da, es kommt was, die letzte Zeile ist direkt aus meinem Auslesen von Datum und Uhrzeit! 2019/08/24_14:12:15 tach auch.... Arduino: 1.8.8, auf ESP32 WEMOS LOLIN32 File: D:\atmel\__ARDUINO__\pcd_test_blau_bi__\pcd_test_blau_bi__.ino compile: 2019/08/24_14:11:44 CPU Takt: 240 MHz -> Scanning... I2C device found at address 0x50; 1010000x; << 0xA0; 10100000 I2C EEPROM I2C device found at address 0x68; 1101000x; << 0xD0; 11010000 DS3231 RTC 2019/08/24_14:12:13 done -------------- 3. Durchlauf 0xA0 I2Ceeprom 0xD0 DS3231rtc RTC T= 29.0C -------------- 2019/08/24_14:12:15 DS1307new::DS1307new() { #if defined(_AVR_) Wire.begin(); #endif }
:
Bearbeitet durch User
Joachim B. schrieb: > Stefanus F. schrieb: >> Anstelle von "// waiting" könnte man versuchen, ein yield() einzufügen. > > da ich nicht weiss was ein "yield()" ist..... Das ist eine Funktion des Arduino Frameworks. https://www.arduino.cc/en/Reference/SchedulerYield
Wolfgang schrieb: > Das ist eine Funktion des Arduino Frameworks. > https://www.arduino.cc/en/Reference/SchedulerYield Das Anwendungsbeispiel auf der Seite ist allerdings ohne Erklärung nicht hilfreich - um es mal vorsichtig zu formulieren.
egal wie Problem gelöst! So nun kann ich mich wieder der Integration der beiden LIBs kümmern, ich mag halt nicht alle meine Quellen anfassen müssen. Gerippe steht Nokia5110 mit LCD5110_Basic einbinden für AVR, braucht ca. 600 Byte SRAM weniger als die Adafruit GFX Den Font von "LCD5110_Basic" habe ich in der "Adafruit GFX" von 24-126 eingepasst, mir gefielen die Zeichen dort besser. was noch fehlt, die "LCD5110_Basic" benötigt ein Byte pro Zeichen mehr im Quellcode, das kann noch eingespart werden, das erste Byte letzte Spalte ist ja immer 0! Somit kennen nun beide die Pfeile up/down/left/right sowie das GRAD C Zeichen und ein Symbol für Update des LCD. Werde ich bei Bedarf noch hier einstellen. Grundsätzlich schreibe ich jede Ausgabe in ein Schattenram über 3D Array x-Screens, 6 Zeilen, 14 Zeichen für das Nokia Display Das LCD bekommt nur 4 Updates/s vom Timer, da brauche ich mich nicht mehr um die Verwaltung zu kümmern. externe Steuerung erfolgt über Serial ? help time set, read date set read Kontrast +- set read Hintergrundhelligkeit +- set read Tasten können eingebunden werden zur Displaysteuerung über I2C Port Drehencoder auch Im Bild seht ihr was schon läuft.
:
Bearbeitet durch User
Stefanus F. schrieb: > Das Anwendungsbeispiel auf der Seite ist allerdings ohne Erklärung nicht > hilfreich - um es mal vorsichtig zu formulieren. Das hat auch keiner behauptet. Gibt einfach mal in Google "yield() arduino" ein ...
anstatt yield (welches bei esp8266 quasi in esp_yield gemappt wird und beim ESP32 vPortYield aus dem FreeRTOS) kann man auch delay(...) benutzen welches auch yield aufruft und eben auch dafür sorgt das neben den Wifi kram auch der Watchdog gefüttert wird. delayMicroseconds macht dies übrigens nicht und auch ein while(blubb) nicht. Dann also lieber while(blubb){ delay(1); } oder while(blubb){ yield(); } yield() sollte man immer dann einfügen wenn eine Funktion oder Schleife sehr lange dauern kann, sodass z.B. der watchdog zuschlägt. Beim ESP32 mag das nicht mehr so kritisch sein, da der ganze Wifi/TCP-IP-Kram IMHO auf dem einen Core läuft während auf dem zweiten Core die User-Applikation läuft und zudem der RTOS Scheduler verwendet wird. Beim ESP8266 sieht es anders aus (da hat es bei mir auch mal geknallt als ich den Adafruit GFX Benchmark 1:1 aus dem Example übernommen habe). Ich glaube inzwischen haben die da auch ein yield eingebaut.
:
Bearbeitet durch User
Timmo, das hast du schön erklärt, nur leider damit die Faulheit von Joachim gefördert, nicht selbst nachzulesen.
Stefanus F. schrieb: > nur leider damit die Faulheit von > Joachim gefördert, nicht selbst nachzulesen. danke dafür, ich hatte nach yield gegoogelt, aber das Meiste las sich wenig vertrauenderweckend, also wozu an dieser Stelle Restlebenszeit vergeuden? Ich habe den Bug gefunden auf "my way" und nun liebes Helfersyndrom? Vielleicht lötest du etwas SMD um dich zu beruhigen.
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.