Probleme nach Umstellung von Uno auf Mega

Hallo,

da ich bei meinem aktuellen Projekt Probleme mit dem verfügbaren Speicher hatte, habe ich beschlossen von einem Uno auf einen Mega umzusteigen.
Ich verwende diesen Mega

Leider hat der Umstieg nicht wirklich funktioniert. Seit dem der Sketch auf dem Mega läuft gibt es einen Fehler, den ich einfach nicht beheben kann. Da die Pinbelegung beim Mega abweicht habe ich wie hier beschrieben den I2C Bus neu verdrahtet und damit haben die RTC, die SD Karte das LCD und des Keypad eigentlich auch schon wieder funktioniert.

Leider bekomme ich jetzt Fall, dass der Arduino nach dem Drücken einer bestimmten Zahlenreihenfolge auf dem Keypad neustartet. Ich benutze im Sketch die Variable Anzeigeindex um zu bestimmen was auf dem LCD angezeigt werden soll und wie mit Eingaben auf dem Keypad umgegangen werden soll.

  • Wenn ich die Taste B drücke und anschließend die Taste 3 startet der Arduino ungewollt neu.
  • Wenn ich nur 3 drücke passiert nichts.
  • Wenn ich eine beliebige Taste drücke und danach 3 drücke passiert nichts.
  • Wenn ich die Taste B drücke danach eine beliebige Taste drücke und danach die 3 drücke startet der Arduino ungewollt neu.

Auf dem Uno hatte ich dieses Verhalten nicht.
Ich habe das Keypad auch schon direkt ohne I2C mit 8 Kabeln an die Anschlüsse 22 bis 29 des Mega angeschlossen, aber das Problem wurde nicht behoben.

    case '3':
        switch (Anzeigeindex) {
        case 2:
        Anzeigeindex = 3;
        break;  
        case 3:
        Anzeigeindex = 4;
        break;
        case 4:
        Anzeigeindex = 5;
        break;
        case 5:
        Anzeigeindex = 9;
        break;
     
        case 6: // Case 6 KEIN PROBLEM OHNDE DIESEN CASE
        memset(Zwischenspeicher, 0, sizeof(Zwischenspeicher)); //Zwischenspeicher leeren
        Zwischenspeicher[0] = '3';
        Anzeigeindex = 7;
        break;
        
        
        case 9:
        Anzeigeindex = 10;
        break;
        case 10:
        Anzeigeindex = 2;
        break;
        }
    break;

Das Problem taucht nicht auf wenn ich im switch case3 (also bei Drücken der Taste 3) im Unter-Switch-case denn case 6 auskommentiere. Das ergibt für mich jedoch keinen Sinn, da nach Drücken der Taste B der Anzeigeindex=2 ist und dieser case 6 ja nicht aufgrufen wird.

Was meint Ihr, an was könnte das liegen. Danke schonmal

ArduinioArti

Lueftung_26.zip (6.35 KB)

Warum hängst Du den Sketch nicht direkt in den Beitrag?

Gruß Tommy

Und wenn du mehr Helfer aktivieren möchtest, dann setze den Sketch hier direkt in Code-Tags rein.

Tommy56:
Warum hängst Du den Sketch nicht direkt in den Beitrag?

Gruß Tommy

HotSystems:
Und wenn du mehr Helfer aktivieren möchtest, dann setze den Sketch hier direkt in Code-Tags rein.

Geht leider nicht. ein Forenbeitrag ist in der Länge begrenzt.
The message has the following error or errors that must be corrected before continuing:
The message exceeds the maximum allowed length (9000 characters).

Ich werd mal versuchen mich mit Serial.print weiter an das Problem heranzutasten.

Geht nicht, gibts nicht.

Man kann den Sketch aufteilen oder als txt-Datei posten, aber als zip ist wohl die schlechteste Lösung, bzw. keine.

Hi

Ok - ein 35kB-Sketch-Monster mag das Forum nicht - da ist bei 9000 Zeichen Schluss.
Deine Aussage kann ich So kaum glauben - z.B., daß das SD-Shield wieder funktioniert hat, nachdem Du I²C umverdrahtet hast.
Das SD-Shield wünscht SPI und hat herzlich wenig mit I²C am Hut.

Dann ist Deine Erklärung sogar halbwegs verständlich, bevor Du anfängst, irgendwelche Fälle zu konstruieren ... was wann in welchem Case passiert und so - da steigt mein Kopf dann aus.

Wie schon angesprochen wurde:
WAS erwartest Du (wie lief Das auf dem Uno)
WAS bekommst Du statt Dessen
Durch (viele) Serial.print kannst Du mitverfolgen, wo Dein Sketch 'falsch abbiegt', oder was zumindest vor dem Selbstmord gemacht werden sollte.
Hier musst Du angreifen.

MfG

PS: Von den DHT-Sensoren liest man nicht viel Gutes - bereite Dich drauf vor, daß Du Diese ersetzen wirst - ein Tausch gegen BME280 dürfte sinnvoll sein, von Denen liest man weniger/keine Fehl-Messungen der Feuchte.
PPS:

if (!SD.begin(10,11,12,13)) // Diese Zeile wird verwendet wenn das Shield am MEGA betrieben wird

Der Mega hat die SPI-Pins ab 50 - so wirst Du ggf. Soft-SPI nutzen?!?
Könnte aber damit zusammen hängen, daß das Shield die Uno-Pins haben möchte - ist eben so verdrahtet.
PPPS: STRG+T in der IDE rückt den Kram lesbar ein - die im Dutzend auftretenden Leerzeilen sind eigentlich auch keine Rudeltiere
PPPPS: void loop() ist 'nur' loop() - das void gibt nur an, daß die Funktion loop() keinen Rückgabewert hat. Grundlagen!
if(AnzeigeAktiv.unixtime() >= jetzt.unixtime()){                // Wenn: AnzeigeAktivfällt Dir nach 49,x Tagen auf die Füße -> millis()-startzeit>=intervall <- Das nicht
PPPPPS: Die Berechnung der absoluten Luftfeuchte (355) in eine Funktion auslagern - wenn man schon sehr komplexe Berechnungen hat, sollte man Diese möglichst selten haben - eben als Funktion wird der Kram nur 1x im Programm gebraucht.
PPPPPPS: Das F-Macro hilft Dir NUR Speicher sparen, bei mehr als einem Zeichen.
Wenn Du öfter die gleiche Zeichenkette ausgeben willst, packe dieses F-Macro in eine Funktion und rufe die Funktion auf.
Sonst braucht jedes F-Macro den Platz des Textes - da es hier komplett egal ist, Was ausgegeben werden soll - jeder Text wird auch individuell gespeichert!!

Geschachtelte switch/case können einem derbe Streiche spielen.
Ohne echte Not sollte man da einen Bogen drum machen.
Es sei denn, man möchte/muss die möglichen "speziellen Effekte" ausnutzen.

Die überflüssigen includes solltest du auch entfernen.
(wurde aber auch an anderer Stelle schon gesagt)

postmaster-ino:
if(AnzeigeAktiv.unixtime() >= jetzt.unixtime()){                // Wenn: AnzeigeAktivfällt Dir nach 49,x Tagen auf die Füße -> millis()-startzeit>=intervall <- Das nicht

Verwechselst Du nicht Unixtime (Sekunden seit 1.1.1970) mit millis (Millisekunden seit µC-Reset? Probleme gibt es mit der Unixzeit erst im Jahr 2038 wegen 32-Bitüberlauf.

Da käme in meinen Augen noch dazu, das anzeigeAktiv mit hoher Wahrscheinlichkeit vor jetzt liegt, das also kaum wahr werden wird.

Gruß Tommy

postmaster-ino:
Deine Aussage kann ich So kaum glauben - z.B., daß das SD-Shield wieder funktioniert hat, nachdem Du I²C umverdrahtet hast.
Das SD-Shield wünscht SPI und hat herzlich wenig mit I²C am Hut.

Ja stimmt. I2C wird nur für die RTC des Shields verwendet: Für die SD Karte habe ich die Library SD durch die SD Library von Adafruit ersetzt welche Softpins unterstützt.

Ich habe jetzt mal in meinem Sketch die verschachtelten switch cases aufgelöst. Leider ohne Erfolg.

Nochmal zum Problem. Der Sketch hat auf dem Uno funktioniert. Durch Drücken auf die Taste 3 wird die Variable Anzeigeindex verändert und dadurch wird beim nächsten Durchlauf die Anzeige auf den LCD verändert. All das funktioniert auf dem Uno. Die Frage ist ja was ist beim Mega anders?

  if (ausgeleseneTaste == '3') {
    Serial.println(F("Vor Switch case"));
    switch (Anzeigeindex) {
      case 2:
        Serial.println(F("in case 2"));
        Anzeigeindex = 3;
        break;
      case 3:
        Anzeigeindex = 4;
        break;
      case 4:
        Anzeigeindex = 5;
        break;
      case 5:
        Anzeigeindex = 9;
        break;
      case 6: // Case 6
        Serial.println(F("in case 6"));
        memset(Zwischenspeicher, 0, sizeof(Zwischenspeicher)); //Zwischenspeicher leeren
        Zwischenspeicher[0] = '3';
        Anzeigeindex = 7;
      break;
      case 9:
        Anzeigeindex = 10;
        break;
      case 10:
        Anzeigeindex = 2;
        break;
    }
    Serial.println(F("Nach Switch case"));

Das Problem liegt hier.
Wenn ich die Taste 3 drücke und mein Anzeigeindex nicht 2,3,4,5,6,9 oder 10 (also die Fälle, die im switch case vorkommen)ist bekomme ich als serielle Ausgabe "Vor Switch case" und "Nach Switch case".

Wenn der Anzeigeindex jedoch 2,3,4,5,6,9 oder 10 ist und ich dann die 3 drücke bekomme ich als Ausgabe lediglich "V?" und der Arduino startet neu.

Noch skuriler wird es wenn ich einen beliebigen case auskommentiere. Dann bekomme bekomme ich wieder beide Ausgaben an der Seriellen Schnittstelle und die Anzeige wird auch wie gewollt geändert.