Probleme mit switch...case

Hallo,
ich habe ein Problem mit switch case. Sobald ich den zehnten case hinzufüge bekomme ich einen Fehler. Der Teil des sketches sieht so aus.

        if(AnzeigeAktiv.unixtime() >= jetzt.unixtime()){            //Wenn die Anzeige noch aktiv ist

        switch (Anzeigeindex) {
        case 1:                               //Anzeige Messwerte

          AktuelleAnzeige = Anzeigeindex;     //Umstellen der AktuellenAnzeige. Wird in jedem Case 


        break;

          case 2:                                 //Anzeigeindex 2: 
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Betriebsmodus"));     
          }
        break;
        
          case 3:                                 //Anzeigeindex 3: 
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Frostschutz"));     
          }
        break;

        case 4:                                 //Anzeigeindex 4: 
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Datenlogger"));     
          }
        break;

        case 5:                                 //Anzeigeindex 5: 
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Wassergehalt"));     
          }
        break;                        
        
        case 6:                                   //Anzeigeindex 6: Eingabe Betriebsmodus
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex2 aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Betriebsmodus"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Eingabe: 0-4"));     
          }
        break;
        
        case 7:                                   //Betriebsmodus Bestätigen
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);   
          switch(atoi(Zwischenspeicher)){ 
          case 0:
          lcd.print(F("Nur Messen"));
          break; 
          case 1:
          lcd.print(F("Intervall"));
          break; 
          case 2:
          lcd.print(F("Zeitschaltuhr"));
          break;  
          case 3:
          lcd.print(F("Dauerbetrieb"));
          break; 
          case 4:
          lcd.print(F("Testbetrieb"));
          break;                                                   
          }
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Ja (#) Nein(*)"));
          }
        break;

        case 8:                                   
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex2 aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Betriebsmodus"));
          lcd.setCursor(0,1);                                                        
          switch(atoi(Zwischenspeicher)){ 
          case 0:
          lcd.print(F("Nur Messen"));
          break; 
          case 1:
          lcd.print(F("Intervall"));
          break; 
          case 2:
          lcd.print(F("Zeitschaltuhr"));
          break;  
          case 3:
          lcd.print(F("Dauerbetrieb"));
          break; 
          case 4:
          lcd.print(F("Testbetrieb"));
          break;                                                   
          }
          }
        break;

        case 9:                                   
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Uhrzeit"));     
          }
        break;
        
        case 10:                                   
          if(Anzeigeindex != AktuelleAnzeige){    //Wenn die Anzeige noch nicht auf Anzeigeindex aktualisiert wurde
          AktuelleAnzeige = Anzeigeindex;         //Umstellen der AktuellenAnzeige. Wird in jedem Case benötigt.
          lcd.clear();
          lcd.setCursor(0,0);                                                        
          lcd.print(F("Einstellungen #"));
          lcd.setCursor(0,1);                                                        
          lcd.print(F("Datum"));     
          }
        break;

        
        }

      }

Anzeigeindex ist ein Integer.

Ich bekomme folgenden Fehler
avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x10
avrdude: stk500_cmd(): programmer is out of sync
avrdude: stk500_cmd(): programmer is out of sync

Hat jemand von euch eine Idee an was das liegen könnte.
Ist die Anzahl der cases begrenzt?

Grüße
ArduinoArti

Hi

Das hat vorerst Nichts mit dem Sketch zu tun - Dein Prpgrammer wird nicht sauber gefunden.
Eigentlich dürfte es vollkommen egal sein, wie der Sketch aussieht - wenn Er zum Kompilieren Hochladen ansetzt, ist der Sketch 'durch'.

MfG

PS:0...9 sind bereits 10 Fälle - Du bist am 11.ten Fall - aber auch hier ist keine Beschränkung
PPS: Entferne unnötige Leerzeilen und drücke in der IDE STRG+T - Das rückt den Code auf Klammer-Ebene ein - macht den Kram lesbarer.

Edit
Kompilieren war falsch, der Sketch ist 'durch', wenn mit dem Hochladen begonnen wird, was hier wohl der Fall ist.
Edit 2 (oda so) Noch gefühlt zwei Dutzend Rechtschreibfehler/Vertipper gerichtet

postmaster-ino:
Hi

Das hat vorerst Nichts mit dem Sketch zu tun - Dein Prpgrammer wird nicht sauber gefunden.
Eigentlich dürfte es vollkommen egal sein, wie der Sketch aussieht - wenn Er zum Kompilieren ansetzt, ist der Sketch 'durch'.

Und was bedeutet das jetzt.
Was kann die Ursache dafür sein?
Sobald ich den letzten case wieder entferne funktioniert es ja wieder.

Gruß ArduinoArti

Poste bitte mal einen kompilierbaren Sketch, bei dem Fragment ist keine besonders gut Fehlersuche möglich.

Sobald ich den letzten case wieder entferne funktioniert es ja wieder.

Nöö...
Du musst dich täuschen.
Außer, du verwendest einen Mega und in deinem Programm kommen 3 + vor, also irgendwo ein "+++"

Ist die Anzahl der cases begrenzt?

Nicht wirklich!

Merken:

  • Vollständige Ausgaben aktivieren und alles posten.
  • Testbaren Code posten
  • Ansagen, welcher Arduino verwendet wird.

Wieso muss ich das überhaupt sagen?

combie:
Vollständige Ausgaben aktivieren und alles posten.

Die komplette Ausgabe ist für den Beitrag leider zu groß: Ich hoff das ist der Teil auf den es ankommt.

Der Sketch verwendet 28704 Bytes (88%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1529 Bytes (74%) des dynamischen Speichers, 519 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
D:\Programme\Arduino\hardware\tools\avr/bin/avrdude -CD:\Programme\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\Michael\AppData\Local\Temp\arduino_build_672313/Lueftung_20.ino.hex:i
avrdude: Version 6.3-20190619

  • Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/*
  • Copyright (c) 2007-2014 Joerg Wunsch*
  • System wide configuration file is “D:\Programme\Arduino\hardware\tools\avr/etc/avrdude.conf”*
  • Using Port : COM3*
  • Using Programmer : arduino*
  • Overriding Baud Rate : 115200*
  • AVR Part : ATmega328P*
  • Chip Erase delay : 9000 us*
  • PAGEL : PD7*
  • BS2 : PC2*
  • RESET disposition : dedicated*
  • RETRY pulse : SCK*
  • serial program mode : yes*
  • parallel program mode : yes*
  • Timeout : 200*
  • StabDelay : 100*
  • CmdexeDelay : 25*
  • SyncLoops : 32*
  • ByteDelay : 0*
  • PollIndex : 3*
  • PollValue : 0x53*
  • Memory Detail :*
  • Block Poll Page Polled*
  • Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack*
  • ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------*
  • eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff*
  • flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff*
  • lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00*
  • hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00*
  • efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00*
  • lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00*
  • calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00*
  • signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00*
  • Programmer Type : Arduino*
  • Description : Arduino*
  • Hardware Version: 3*
  • Firmware Version: 4.4*
  • Vtarget : 0.3 V*
  • Varef : 0.3 V*
  • Oscillator : 28.800 kHz*
  • SCK period : 3.3 us*
    avrdude: AVR device initialized and ready to accept instructions
    Reading | ################################################## | 100% 0.00s
    avrdude: Device signature = 0x1e950f (probably m328p)
    avrdude: reading input file “C:\Users\Michael\AppData\Local\Temp\arduino_build_672313/Lueftung_20.ino.hex”
    avrdude: writing flash (28704 bytes):
    Writing | #################################################
    avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x10
    # | 100% 4.39s
    avrdude: stk500_cmd(): programmer is out of sync
    avrdude: stk500_cmd(): programmer is out of sync

combie:
Ansagen, welcher Arduino verwendet wird.

Es ist ein Arduino Uno Nachbau. Der hier

combie:
Testbaren Code posten

Der ist leider auch zu lang. Kann man hier im Forum Dateien anhängen oder muss ich das irgendwo extern hochladen?

combie:
Nöö…
Du musst dich täuschen.
Außer, du verwendest einen Mega und in deinem Programm kommen 3 + vor, also irgendwo ein “+++”

Also sobald ich den letzen case wieder entferne und nochmal versuche den Sketch hochzuladen funktioniert es wieder.

Vielen Dank schonmal für Eure Hilfe

Also sobald ich den letzen case wieder entferne und nochmal versuche den Sketch hochzuladen funktioniert es wieder.

Und nochmal:
Das hat damit nichts zu tun!
Nicht ursächlich!

OK, es bringt den Fehler zum Vorschein.
Aber mehr auch nicht.

Merke:
Symptom ist nicht Ursache.
Zwischen den beiden gibt es einen erheblichen semantischen Unterschied.

PS:
Ich mag diese Nachbauten nicht.
Den fehlen die Abblockkondensatoren! (oder sie sind zuweit weg)
Ganz schlecht, das macht den ADC erheblich ungenauer.
Kann zu Abschmierern führen.

Andererseits haben sie einen Quarz statt Resonator, das ist fein.

combie:
Außer, du verwendest einen Mega und in deinem Programm kommen 3 + vor, also irgendwo ein "+++"

Es gab meines Wissens mal auch einen Bootlader, der "!!!" nicht ab konnte.

Gruß Tommy

Tommy56:
Es gab meines Wissens mal auch einen Bootlader, der "!!!" nicht ab konnte.

Gruß Tommy

Stimmt!
Da kann mich auch meine Erinnerung getäuscht haben!
Und nicht "+++" ist das Problem, sondern "!!!"

Also ich hab jetzt nochmal etwas in Sketch herumgespielt.
Der Fehler scheint aufzutauchen wenn der Sketch eine gewisse Länge überschreitet.
Ich habe den Sketch hochgeladen und immer um eine Zeile erweitert.
Ab einer bestimmten Länge trat der Fehler auf und zwar egal an welcher Stelle ich den Sketch erweitert habe. Wenn Ich den Sketch dann wieder verkürzt habe war der Fehler wieder weg.

Wenn ich es richtig verstanden habe ist der Fehler ja ausschließlich ein Kommunikationsfehler. Kann das an der Länge des Sketches liegen ?

combie:
Ich mag diese Nachbauten nicht.
Den fehlen die Abblockkondensatoren! (oder sie sind zuweit weg)
Ganz schlecht, das macht den ADC erheblich ungenauer.
Kann zu Abschmierern führen.

Geht mir inzwischen auch so. Aktuell bin ich bei meinem ersten Projekt und ich hab halt alles von einem Lieferanten bezogen. Außerdem waren die Aussagen im Internet bezüglich Nachbau eigentlich nicht sonderlich negativ. Aber wenn man Fehler hat bei denen man sich nicht sicher ist ob es an der Hardware liegt, dann ist das ärgerlich und man hätte lieber die paar Euro mehr bezahlt.

Leider bin ich bis jetzt nicht wirklich weitergekommen.
Ich bin gerade am überlegen ob es Sinn macht mal einen Arduino Mega zu holen, da ich dann ja mehr Speicher hätte.
Aktuell sieht mein Speicherverbrauch ja folgendermaßen aus. Und sobald ich meinen Sketch irgendwie vergrößere bekomme ich die Fehlermeldung.

Der Sketch verwendet 28704 Bytes (88%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1529 Bytes (74%) des dynamischen Speichers, 519 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Da ich erst am Anfang meines Projektes bin wird der Speicher wohl sowieso nicht reichen. Meint Ihr das könnte das Problem beheben oder seht Ihr das Problem irgendwo anders?

nö, da ist noch Luft nach oben. Da geht schon noch was rein.

Mach ein Zip und stell es ein.

Beim Sketch lässt sich auch bestimmt noch was optimieren, um Speicher einzusparen. Allerdings wie hier schon angemerkt wurde, liegt wohl nicht an deinem Sketch.

Ich hatte mal ein ähnliches Problem (Thread), allerdings mit einem Pro Mini und einem FT232RL USB-Serial-Adapter, ab ca. 14000 Bytes brach die IDE den Flashvorgang beim Verifizieren (reading) ab. Lange Rede kurzer Sinn, bei mir war/ist es eine Inkompatibilität zwischen den USB 2.0 Ports des Mainboards und den FT232RL, mit USB 3.1 funktioniert es einwandfrei.

Probier mal andere USB-Ports, ggf. auch einen anderen PC, sowie ein anderes (oder mehrere) USB-Kabel, vielleicht auch einen USB HUb, oder falls im Einsatz auch mal ohne.

Ich habe den Sketch mal angehängt.

Sobald ich eine beliebige Zeile lösche verschwindet der Fehler.

Sketch1.zip (5.53 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Tommy56:
Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Das geht leider nicht, da der Sketch zu lang ist.

du musst uns bekanntgeben, woher du die Libs hat

#include <LCD.h> // für 2x16 Segementanzeige
#include <LiquidCrystal_I2C.h> // für 2x16 Segementanzeige

Zusatzfrage: warum brauchst eine LCD.h und die LiquidCrystal_I2C.h?

und ebenso hier:

#include <Keypad_I2C.h> // Für Keypad I2C
#include <Keypad.h> // Für Keypad

die keypad finde ich von Adafruit(?) - woher ist die Keypad_I2C.h?

Ändere den String mal in

const char* SetupDatei = "setup.csv";

geht dann ein case mehr, oder ändert sich überhaupt was ?

Wenn noiasca’s Tip nichts gebracht hat!

michael_x:
Ändere den String mal in

const char* SetupDatei = "setup.csv";

geht dann ein case mehr, oder ändert sich überhaupt was ?

Wenn noiasca's Tip nichts gebracht hat!

Ich habe die Zeile geändert und das Problem wurde behoben. Ich kann zumindest einiges an code hinzufügen ohne dass der Fehler auftaucht.

Kannst du mir bitte noch erklären warum
char* und nicht einfach char ?

Das ist ja dann ein Zeiger ober worin genau besteht jetzt in diesem Fall der Unterschied.
Danke für deine Hilfe

noiasca:
du musst uns bekanntgeben, woher du die Libs hat

#include <LCD.h> // für 2x16 Segementanzeige
#include <LiquidCrystal_I2C.h> // für 2x16 Segementanzeige

Zusatzfrage: warum brauchst eine LCD.h und die LiquidCrystal_I2C.h?

und ebenso hier:

#include <Keypad_I2C.h> // Für Keypad I2C
#include <Keypad.h> // Für Keypad

die keypad finde ich von Adafruit(?) - woher ist die Keypad_I2C.h?

Bis jetzt habe ich einen Großteil aus unterschiedlichen Tutorials zusammengestellt und da wurde das jeweils so als Beispiel gezeigt.

Tutorial Keypad
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/