Seltsame Fehler im TFT Display

Ich möchte Werte auf einem ESP32 mit TFT-Display anzeigen. Die Werte werden in einem Array abgespeichert. Im Serial Monitor wird alle korrekt angezeigt, aber auf dem Display nicht. Die Beispielprogramme laufen einwandfrei!

Im meinem Code sind gleich mehrere Fehler:

An der 4. Stelle des Arrays wird im Monitor eine große Zahl angezeigt.
Woher kommt die???

Kommentiert man im Setup die Belegung des Arrays mit Werten aus, dann verschwindet diese Zahl.

Trotzdem bleibt der Fehler mit den Werten im TFT-Display.
Meistens bleibt der Wert bei 3 stehen. Warum?

int Drehmom[10];
int DrehmomPointer;

#include <TFT_SB_1.h>            //  own pins
TFT_eSPI tft = TFT_eSPI();       // Bodemer

void setup() {
  tft.init();
  tft.fillScreen(TFT_BLACK);
  Serial.begin(57600);
/*
Drehmom[0]=0;
Drehmom[1]=0;
Drehmom[2]=0;
Drehmom[3]=0;
Drehmom[4]=0;  // 1061177988
Drehmom[5]=0;
Drehmom[6]=0;
Drehmom[7]=0;
Drehmom[8]=0;
Drehmom[9]=0;
*/
}

void loop() {
   
      DrehmomPointer++;
      if(DrehmomPointer > 8) {DrehmomPointer=1;}
             
      tft.drawNumber(DrehmomPointer, 100, 80, 6);

      //Drehmom[DrehmomPointer] = 5;     // stoppt bei 3
      //Drehmom[1] = 5;                  // ok
      //Drehmom[2] = 5;                  // ok
      //Drehmom[3] = 5;                  // stoppt bei 1
      //Drehmom[4] = 5;                  // ok
      //Drehmom[5] = 5;                  // ok
      //Drehmom[6] = 5;                  // ok
      //Drehmom[7] = 5;                  // ok
      Drehmom[8] = 5;                  // ok
      
      Drehmom[0] = Drehmom[1] + Drehmom[2] + Drehmom[3] + Drehmom[4] + Drehmom[5] + Drehmom[6] + Drehmom[7] + Drehmom[8]  ;
      
      Serial.print(" Pointer: ");Serial.print  (DrehmomPointer); Serial.print("\t");
      Serial.print(" Drehmom: ");Serial.println(Drehmom[DrehmomPointer]); 
      delay(50);
}

Ich habe die Variablen schon anders deklariert als long, Pointer als Byte, statt drawNumber drawString probiert. Alles ohne Erfolg. Wer hat eine Idee?

Ups.

tft.drawNumber(Drehmom[welchenWertAuchImmer], 100, 80, 6);

Welchen deiner zehn Werte möchtest du denn anzeigen?

Sorry, die 10 ist noch aus den Versuchen stehen geblieben...

Globale Variablen werden sowieso automatisch mit 0 initialisiert. Das braucht man nicht nochmal extra zu machen.
Und wenn doch nimmt man da für Arrays memset() mit sizeof() als Größe. Dann passieren solche Fehler nicht

Ansonsten erschließt sich mir der Sinn des Codes nicht so wirklich

Der Sinn des Codes besteht darin, den Fehler zu finden.
Bei Arduino.cc kommt:
"No search results for memset in Reference"
Das ist ja auch nicht das Problem. Zur Not deklariere ich jeden Wert einzeln im Array. Das ist mir egal. Aber ich muss Werte auf dem TFT anzeigen können!

Einfach mal "memset C++" in die Suchmaschine Deiner Wahl eingeben.

Gruß Tommy

Warum tust du es dann nicht?

Im Moment zeigst du Zahlen zwischen 1 und 8 an, die sich überschreiben, 20 Mal pro Sekunde.

Sehr richtig, das ist ja der Sinn der Sache. Es funktioniert also? Prima, dann können wir ja zum Problem kommen. Was wird denn auf dem TFT Display angezeigt???

Woher sollen wir das wissen, du Scherzkeks?

Man MUSS ja nicht posten, wenn man es nicht weiß.
Aber es wäre schön, wenn es jemand wüsste und dann auch die Lösung postet :slight_smile:

Deklariere doch mal testweise den drehmomPointer vor dem Array.
Wenn es dann geht, weißt du sicher, dass du im originalen Code irgendwo über den Array hinaus schreibst und damit den Inhalt dieser Variablen zerstörst.

Bitte lies deine Beiträge hier nochmal und schau was da über den/die Anzeigefehler wirklich steht.

Aber du hast recht, warum verschwende ich meine Zeit um zu versuchen dir zu helfen.

Viel Erfolg bei deinem Projekt.

Wo steht das Display denn ?
Evtl. kann ich da ja mal rüberschauen.

@ wno158

Unfassbar! Wenn ich die Reihenfolge ändere:
int DrehmomPointer;
int Drehmom[10];

dann funktionierts! Tausend Dank!

Warum der Fehler aber nur auf dem TFT-Display erschien ist mir immer noch schleierhaft. Gibt es dafür eine Erklärung?

Auch wenn ich die Euphorie nur ungerne bremse, so fürchte ich doch, es handelt sich um einen Irrglauben.

Leider kann ich Dein Problem nicht reproduzieren, bei mir werden Zahlen von 1 bis 8 angezeigt:

grafik

Den Dreck habe ich erst auf dem Foto gesehen, sorry :face_with_monocle:

Ich bin ebenfalls noch nicht davon überzeugt, dass es wirklich funktioniert. Wir wissen nur, dass irgendwer irgendwann Speicher überschrieben hat.

Anhand der mir vorliegenden Informationen kann ich die Ursache aber nicht benennen.

Idee zum Weitersuchen:
Jetzt mal an der Stelle hinter dem Array eine Dummy-Variable einfügen, mit einem festen Wert (z.B. 158 :slightly_smiling_face:) befüllen und ebenfalls in jedem Durchlauf auf seriellem Monitor und Display ausgeben.
Das delay() massiv erhöhen damit du sehen kannst unter welchen Bedingungen es dann kracht.


Gruß Walter

Ich habe noch mit weiteren Variablen herumgetüftelt, konnte aber den Fehler nicht eindeutig eingrenzen.
Der Original-Code umfasst ca. 100 Variablen, 11 Tabs mit jeder Menge Code und Bibliotheken. In der Variablendeklaration habe ich den Block mit den betreffenden Variablen für die Darstellung im TFT Display ganz an den Anfang gestellt und schon klappts.
Danke für die Idee!

Das heißt aber dass du immer noch eine andere Variable überschreibst. Nur fällt es bei dieser nicht sofort auf.

Arrays der Größe N gehen von 0 bis N-1. Nicht bis N. Deshalb sollte man z.B. bei for-Schleifen auf feste Array Grenzen verzichten und das den Compiler berechnen lassen

@Serenifly Was bedeutet: "Du überschreibst eine Variable"?
Die sind ja nur einmal deklariert, die Werte verändern sich aber ständig.
Aber dazu sind Variablen doch da?

Was mich so verwirrt ist die Tatsache, daß die Reihenfolge nur beim TFT Display eine Rolle spielt.

Es geht darum das du wahrscheinlich irgendwo über das Ende eines Arrays hinaus schreibst - und damit andere Variablen danach überschreibst. Darauf zielte der Vorschlag die eine Variable vor dem Array zu deklarieren überhaupt ab. Du hast also noch nicht verstanden was du da überhaupt machst.