Absturz mit ADS1115 Lib "Adafruit_ADS1X15"

OP #7251407
Lesenswert?

Hallo!

Ich knoble seit einiger Zeit mit der Library für den ADS1115 von 
Adafuit.

Ich habe 2 Mega parallel zum testen. Die geben Debug Meldungen an einen 
3. via Serieller. Und die LED 13 blinken im Sekundentakt.

MEGA1
Ich hab ein kleines Programm und nach 9053000 Millisekunden ist Schluß.
Programm steht.
Ist bei mir auf unterschiedlichen MEGA2560 der Fall und wiederholbar. 
Das Ergebnis ist immer gleich.


MEGA2
Der 2. Mega ist das selbe Programm ohne ADS1115 Initialisierung


Nach dieser ominösen Zeit (9053 Sek) steht alles (kein Blinken, keine 
Serielle Ausgabe mehr..) beim MEGA1.
Der MEGA2 aber läuft und läuft...

Vielleicht sieht wer von euch den Fehler, ich bin da mittlerweile ohne 
Ideen.

Info:
Wenn ich die Lib von wollewald ADS1115_WE verwende, ist alles gut.
Also prinzipiell funktioniert mein Projekt, aber trotzdem wäre 
interessant, ob der Adafruit Effekt nachvollziehbar ist und warum.

Danke
Angehängte Dateien:
Gast #7251449
Lesenswert?

Zeile #136 ist Unsinn.
Du rufst alle 6sek Adafruit_ADS1X15::begin() auf; d.h. du erstellst alle 
6sek ein neues Objekt, ohne das alte jemals zu löschen; daher geht dem 
AVR irgendwann der Speicher aus und die Kiste steht;

Die Initalisierung macht man einmal in init(). Danach kann man in loop() 
die anderen Funktionen der Library nutzen.
Gast #7251453
Lesenswert?

Was mir spontan auffält:

-Den Datentyp "byte" gibt es in c/c++ nicht (wenn man von std::byte seit 
c++17 absieht) und der TO hat den auch nicht definiert.

-Wire.h wird nicht inkludiert, wenn die Adafruit lib benutzt wird.

-Gewisse Kommentare, mindestens die Webadressen am Anfang (Zeile 32/33) 
sind nicht korrekt auskommentiert.
#7251456
Lesenswert?

Wo ist denn der Unterschied der Libs?
Der ADS1115 ist recht störanfällig.
Wenn immer nur die Datenregister gelesen wird kommt irgenwann nichts 
mehr.
Er braucht dann wieder eine Adressangabe wo gelesen werden soll,
bei stärkeren Störungen sogar ein Refresh der Config Register.
Vielleicht kommt ja auch ohne Störung nach 2,5 Stunden nichts mehr?
OP #7251463
Lesenswert?

... schrieb:
> Zeile #136 ist Unsinn.
> Du rufst alle 6sek Adafruit_ADS1X15::begin() auf; d.h. du erstellst alle
> 6sek ein neues Objekt, ohne das alte jemals zu löschen; daher geht dem
> AVR irgendwann der Speicher aus und die Kiste steht;
>
> Die Initalisierung macht man einmal in init(). Danach kann man in loop()
> die anderen Funktionen der Library nutzen.

Adafruit_ADS1X15::begin()  ist in unzähligen Beispielen, um zu checken, 
ob das ADS board überhaupt da ist.
Aber könne eine Möglichkeit sein. Werde ich morgen mal rausnehmen und 
dann wieder 2,5 Stunden laufen lassen :)

104638291 schrieb:
> -Den Datentyp "byte" gibt es in c/c++ nicht (wenn man von std::byte seit
> c++17 absieht) und der TO hat den auch nicht definiert.
https://www.arduino.cc/reference/de/language/variables/data-types/byte/

> -Wire.h wird nicht inkludiert, wenn die Adafruit lib benutzt wird.
in  Adafruit_ADS1X15.h Zeile 21
#include <Arduino.h>
#include <Wire.h>

> -Gewisse Kommentare, mindestens die Webadressen am Anfang (Zeile 32/33)
> sind nicht korrekt auskommentiert.
Stimmt, ist aber über #ifdef ADS1115_LIB_Adafruit #else  draußen, 
solange nicht auf die andere LIB umgeschaltet wird, hab ich verbessert.
#7251468
Lesenswert?

Andi P. schrieb:
> ... schrieb:
>> Zeile #136 ist Unsinn.
>> Du rufst alle 6sek Adafruit_ADS1X15::begin() auf; d.h. du erstellst alle
>> 6sek ein neues Objekt, ohne das alte jemals zu löschen; daher geht dem
>> AVR irgendwann der Speicher aus und die Kiste steht;
>>
>> Die Initalisierung macht man einmal in init(). Danach kann man in loop()
>> die anderen Funktionen der Library nutzen.
>
> Adafruit_ADS1X15::begin()  ist in unzähligen Beispielen, um zu checken,
> ob das ADS board überhaupt da ist.
> Aber könne eine Möglichkeit sein. Werde ich morgen mal rausnehmen und
> dann wieder 2,5 Stunden laufen lassen :)

Da hat … Recht, jedes begin() erzeugt ein neues Wire Objekt -> 
klassischer Speicherfresser.
Gast #7251492
Lesenswert?

... schrieb:
> Zeile #136 ist Unsinn.
> Du rufst alle 6sek Adafruit_ADS1X15::begin() auf; d.h. du erstellst alle
> 6sek ein neues Objekt, ohne das alte jemals zu löschen; daher geht dem
> AVR irgendwann der Speicher aus und die Kiste steht;

Den Programmkot habe ich mir nicht angesehen, aber Dein Hinweis klingt 
schlüssig.

> Die Initalisierung macht man einmal in init().

Mir kam nie die Idee, das mehr als einmal beim Start zu machen.

Die Angabe "nach 9053000 Millisekunden ist Schluß" passt zu keinem 
üblichen Timer, da muß etwas anderes passieren.

A. H. schrieb:
Irgendwas ging mir quer, sodass ich die Adafruit verworfen habe und die 
vom Akku-Dänen benutze:
https://lygte-info.dk/project/ADS1115Library%20UK.html

> Der ADS1115 ist recht störanfällig.

Hier klemmt der ADS1115 an einem A*-ProMini. Der ADS ist im Freilauf, 
ich hole jede Sekunde den Meßwert und schreibe ihn auf eine SD-Karte. 
Das läuft gerade aktuell seit über 9 Stunden vor sich hin, ohne 
abzufliegen.

Damit würde ich dem ADS1115 keine Störanfälligkeit anlasten wollen!
OP #7253012
Lesenswert?

... schrieb:
> Zeile #136 ist Unsinn.
> Du rufst alle 6sek Adafruit_ADS1X15::begin() auf; d.h. du erstellst alle
> 6sek ein neues Objekt, ohne das alte jemals zu löschen; daher geht dem
> AVR irgendwann der Speicher aus und die Kiste steht;

Danke, das scheint es wirklich gewesen zu sein.

Interessant, das man jedoch diesen Codeteil in vielen Projekten und 
Beispielen sehen kann.

Ihr habe mir "das Leben gerettet", danke!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren