Forum: Mikrocontroller und Digitale Elektronik Absturz mit ADS1115 Lib "Adafruit_ADS1X15"


von Andi P. (blues)


Angehängte Dateien:

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

von Stefan F. (Gast)


Lesenswert?

Wie viel Ohm haben deine Pull-Up Widerstände am I²C Bus und welche 
Spannung haben diese beiden Leitungen im Ruhezustand?

von Andi P. (blues)


Lesenswert?

4K7 und ganz normal 5V
Und wie gesagt, mit der ADS1115_WE geht's einwandfrei - auf 'ewig'.

von Stefan F. (Gast)


Lesenswert?

Andi P. schrieb:
> 4K7 und ganz normal 5V

Dann habe ich keine weitere Idee. Im Quelltext habe ich keinen Fehler 
gefunden.

von Andi P. (blues)


Lesenswert?

Stefan F. schrieb:
> Dann habe ich keine weitere Idee. Im Quelltext habe ich keinen Fehler
> gefunden.

So geht'S mir auch! Ich habe auch keinen Hinweis in Foren gefunden, das 
die Adafruit Lib Probleme macht. - Ganz eingenartig.
Aber Danke erstmal.
Vielleicht gibt's ja noch Ideen 'da draußen'.

: Bearbeitet durch User
von ... (Gast)


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.

von 104638291 (Gast)


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.

von Achim H. (pluto25)


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?

von Andi P. (blues)


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.

von J. S. (jojos)


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.

von 104638291 (Gast)


Lesenswert?

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

Dafür gibt es include guards oder "#pragma once"(falls unterstützt)

von Manfred (Gast)


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!

von Andi P. (blues)


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!

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.