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
Wie viel Ohm haben deine Pull-Up Widerstände am I²C Bus und welche Spannung haben diese beiden Leitungen im Ruhezustand?
Andi P. schrieb: > 4K7 und ganz normal 5V Dann habe ich keine weitere Idee. Im Quelltext habe ich keinen Fehler gefunden.
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
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.
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.
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?
... 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.
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.
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)
... 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!
... 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.