Forum: Mikrocontroller und Digitale Elektronik Arduino ESP32 & ds1307new LIB


von Joachim B. (jar)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Timmo H. (masterfx)


Lesenswert?

Alternativ einfach eine Lib nehmen die mit dem ESP32 getestet wurde.
https://github.com/Naguissa/uRTCLib
https://github.com/Makuna/Rtc

von Joachim B. (jar)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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 ...

von Timmo H. (masterfx)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

Timmo, das hast du schön erklärt, nur leider damit die Faulheit von 
Joachim gefördert, nicht selbst nachzulesen.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.