LCD / Array Problem

Moin erstmal an alle!

Bin jetzt seit ein paar Tagen stolzer besitzter eines Arduino und eines LCD4884, leider habe ich nur probleme vllt. könnt ihr mir helfen!

#include <LCD4884.h>     // Includes the library
#include "menu.h"

unsigned char selected = 1;
unsigned int autoTemp = 25;
int z=analogRead(0);

 const char menu_000 [30] = " [Hauptmenue]";      //0
 const char menu_001  [30]= " Luefter";           //1
 const char menu_002  [30]= " Licht";             //2
 
 const char menu_100  [30]= " [Luefter]";         //3
 const char menu_101  [30]= " Automatik";         //4
 const char menu_102  [30]= " Manuell";           //5
 const char menu_103 [30] = " zurueck";           //6

 const char menu_200  [30]= " Luefter auswaehlen";//8
 const char menu_201  [30]= " Temperatur";        //9
 const char menu_202  [30]= " An / Aus";          //10
 const char menu_203  [30]= " zurueck";           //11

 const char menu_300  [30]= " [Luefter auswaehlen]"; //12
 const char menu_301  [30]= " Alle Lüfter";          //13
 const char menu_302  [30]= " Spezielle Lüfter";     //14
 const char menu_303 [30] = " zurueck";              //15

const  char menu_400  [30]= " [Manuell]";         //16
 const char menu_401 [30] = " Lüfter 1";          //17  
 const char menu_402 [30] = " Lüfter 2";          //18
 const char menu_403  [30]= " Lüfter 3";          //19
 const char menu_404 [30] = " Lüfter 4";          //20
 const char menu_405  [30]= " Lüfter 5";          //21
 const char menu_406  [30]= " Lüfter 6";          //22
 const char menu_407  [30]= " zurueck";           //23
........

typedef struct MenuStructure2
{
   const char text [30];
  int num_menupoints;
  unsigned char up;
  unsigned char down;
  unsigned char enter;
  //void ( *fp )  ( void ); 
  unsigned char func;
}MenuEntry2;


MenuEntry2 menu [] =
{
   (menu_000,  3,  0,  0,  0,  0),
   (menu_001,  3,  1,  2,  3,  0), 
   (menu_002,  3,  1,  3, 25,  1), 
   
   (menu_100,  4,  0,  0,  0,  0),
   (menu_101,  4,  1,  2,  7,  0),
   (menu_102,  4,  1,  3, 16,  0),
   (menu_103,  4,  2,  3,  1,  0),
   
   (menu_200,  4,  0,  0,  0,  0),
   (menu_201,  4,  1,  2, 12,  0),
   (menu_202,  4,  1,  3,  3,  0),
   (menu_203,  4,  2,  4,  3,  0),
    
  
   (menu_300,  4,  0,  0,  0,  0), 
   (menu_301,  4,  1,  2,  3,  0),
   (menu_302,  4,  1,  3,  3,  0),
   (menu_303,  4,  2,  3,  8,  0),
   .......
};

 void show_menu (void)
{ 

   unsigned char line_cnt = 0;
   unsigned char from = 0;
   unsigned char till = 0;
   unsigned char temp = 0;
    char message[20];
 while (till <= selected)
 {till =   menu[till].num_menupoints; 
 Serial.println("Till");
 Serial.println(till);
 delay(2000);
 Serial.println("Selected");
 Serial.println(selected);
 delay(2000);
 Serial.println("num_menupoints");
 Serial.println(menu[1].down);
 delay(2000);
 }


 from = till - menu[selected].num_menupoints;
 till--;
 temp = from;
 
  byte i;
 if (selected >= (from + 2) && selected <= (till -1))
 {  from = selected -2;
    till = from + 3;
    
    for (from; from<=till; from++)
    {  
      //lcd.LCD_write_string(0, line_cnt,(char*)(menu[from].text),1);
       line_cnt++;
    }
    lcd.LCD_set_XY(0,2);
    //LCD_write_title('-');
 }
 else
 {
   if (selected < (from+2))
   {
     till = from + 3;
      for (from; from<=till; from++)
      {  
      for ( i=1; i<30; i++){
    lcd.LCD_write_string(0, line_cnt+i,(char*) menu[from].text[i], MENU_NORMAL);
  }
       Serial.println(2);
         line_cnt++;
      }
    lcd.LCD_set_XY(0,selected-temp);
    //.LCD_write_title('-');
   }
   if (selected == till)
   {
     from = till -3;
     
       for (from; from<=till; from++)
        { 
          lcd.LCD_write_string(0, line_cnt,(char*) menu[from].text ,0);
           line_cnt++;
        }
    lcd.LCD_set_XY(0,3);
    //lcd.LCD_write_title('-');
     }
   
 }
  
};

void browse_menu (void)
{
 do{
     show_menu();
     int dd=200;
     int z=0;


     z=analogRead(0);

     if (z==0)
      {
      lcd.LCD_write_string(2,2,"Left", MENU_NORMAL);
      }     else
      if (z>0 && z<150)
      {
      lcd.LCD_write_string(2,2,"OK   ", MENU_NORMAL);
      delay(dd);
      }       else
      if (z>150 && z<350)
      {
      lcd.LCD_write_string(2,2,"Down", MENU_NORMAL);
      delay(dd);
      }         else
      if (z>350 && z<510)
      {
      lcd.LCD_write_string(2,2,"Right   ", MENU_NORMAL);
      delay(dd);
      }         else
      if (z>510 && z<750)
      {  
      lcd.LCD_write_string(2,2,"Up ", MENU_NORMAL);
      delay(dd);
      }           else
      if (z>750)
      {
      lcd.LCD_write_string(2,2,"nil  ", MENU_NORMAL);
      delay(dd);
      }
     
     }while(1>0);
 
}


void setup()
{ 
  lcd.LCD_init();        
  lcd.LCD_clear();       
  lcd.SetInterval(1000); 
                    
   Serial.begin(9600); //Zur Fehlerkontrolle
}

void loop()
{  
  browse_menu();
}

Mein Problem ist vllt. nur eins vllt. mehrere. In der show_menu() versuche ich ja “till” den num_menupoints-Wert aus dem Array zu geben. Es funzt zum verrecken nicht und ich habe keine Ahnung warum.
Über die Serial.println habe ich mir alles zig mal ausgeben lassen und ich muss sagen so langsam kriege ich zu viel.
Dort häng ich also in einer Dauerschleife weil immer till=0; und selected=1; supi.
Weiterhin habe ich ein riesen Problem mit der Aussgabe, wobei ich noch nicht ganz weiß, ob es ein Problem ist weil er auch wieder keinen Wert kriegt oder ob es wirklich am Typ liegt.

Hoffentlich kann jemand helfen.
Danke!

Könnte es ein RAM-Problem sein?
Funktionert es wenn Du die Menunamen verkürzt und die Arrays drastisch verkleinerst?
Grüße Uwe

Nein ich denke nicht. Hab an sich genug Platz.

Habe jetzt aber gerade wohl einen Fehler gefunden. => In der Arraydeklaration müssen geschweifte Klammern. Und die Menünamen dann auch direkt dort hinein..sonst meckert er wieder.

Jetzt steh ich nur noch vor dem Problem mit der Ausgabe die er nicht machen will.

Ich seh durchaus ein RAM-Problem... Allein die Arrays belegen schon 900Byte Speicher.

Die Software zeigt mir dies hier an : Binäre Sketchgröße: 7.020 Bytes (von einem Maximum von 32.256 Bytes)

Und da ist jetzt noch jede Menge Kappes drin zum ausprobieren.
Also sollte es doch an sich hinhauen oder?

Wir reden nicht vom Speicherbedarf des kompilierten Sketches, der in das Flash das ATmega geladen wird, sondern vom RAM Verbrauch während der Ausführung des Programms.
Der ATmega328 hat 32k Flast, aber nur 2k RAM.
Grüße Uwe

Okay.. gut zu wissen. Und woher kriege ich jetzt die benötigte RAM-Größe her? Kann ich mir die auch irgendwo anzeigen lassen?
Habe jetzt mein Textproblem auch gelöst durch lcd.LCD_write_string(0, line_cnt,(char*) menu[from].text, MENU_NORMAL);
Ist trotzdem noch ziemlich verbuggt alles :smiley: