- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Problem bei einer Textausgabe aus dem Flash

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    9

    Problem bei einer Textausgabe aus dem Flash

    Anzeige

    E-Bike
    Hallo leute,

    ich habe mal wieder ein Problem. Und zwar möchte ich eine Textausgabe auf einem 2x16 Zeichen Display machen. Um den SRAM nicht zu belasten, speichere ich die Strings im Flash.

    Code:
    PGM_P *menu[] PROGMEM = {
    	"dies  0",
    	"das 1",
    	"jenes 2",
    	"usw 3"
    	};
    Die Textausgabe funktioniert wunderbar, dachte ich!!!

    Ich habe den Text mit einer normalen Ausgabe in das LCD geschrieben.
    Code:
    lcd_string(menu[i],LCD_LINE1);
    Wenn i = 0 gesetzt ist, bekomme ich auch "dies 0" ausgeben. Wenn i = 1 ist dann "das 1".

    Aber packe ich diese Zeile in eine For-Schleife setze, funktioniert diese Ausgabe nicht mehr.

    Code:
    for(i=0; i<4;i++){
    	lcd_cmd(LCD_CLR);
    		
    	lcd_string(menu[i],LCD_LINE1);
    		
    	lcd_string(itoa(i,s,10),LCD_VAR1-5);
    	
    	delay(1000);
    	delay(1000);
    }
    Der Quellcode liegt bei.

    Hat jemand eine Idee oder eine Lösung?
    Angehängte Dateien Angehängte Dateien
    bis denn

    gorra

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Rückfrage:
    Der einzelne "lcd_string(menu[i],...)" klappt, der in der for-schleife nicht ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    9
    nein, wenn ich den String, wie er funktioniert in die Schleife packe. Zeigt das Display nichts mehr an.
    Code:
    i=0;
    //das funktioniert
    lcd_string(menu[i],LCD_LINE1); 
    
    //das funktioniert nicht
    for(i=0;i<4;i++){
      lcd_string(menu[i],LCD_LINE1); 
    }
    es ist der selbe funktionsaufruf
    bis denn

    gorra

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hab' ich eh' so gemeint. Egal.
    Das Problem liegt darin, dass der "C" ja erst den menu-text aus PROGMEM rauskopieren muss, um lcd_string() zu bedienen. (Is nett, dass er das überhaupt drauf hat)
    Aus irgendeinem Grund funzt das in der Schleife offenbar nicht.

    versuch, ihn auszutricksen:
    Code:
    for(i=0;i<4;i++)
    {
    char txt[24];
      strcpy(txt, menu[i]); 
      lcd_string(txt,LCD_LINE1); 
    }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    9
    ach so, sorry

    das funktioniert leider auch nicht. das selbe problem. wenn man es ausserhalb der Schleife versuche, funktioniert es. innerhalb der schleife wird nichts angezeigt.
    bis denn

    gorra

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Mir schwant da was
    PGM_P *menu[] PROGMEM = { ....

    tu' mal den asteriks weg.

    PGM_P menu[][10] PROGMEM = { ....

    10 ist die max-länge der strings + 1
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    9
    du liegst warscheinlich gar nicht so falsch:
    die schleife sieht jetzt so aus:
    Code:
    for(i=0; i<4;i++){
    		lcd_cmd(LCD_CLR);
    		
    		strcpy(txt, pgm_read_word(&menu[i]));
    		lcd_string(txt,LCD_LINE1);		
    		lcd_string(itoa(i,s,10),LCD_VAR1);
    }
    aber jetzt wird nur das erste Element angezeigt, also i = 0. der rest ist immer noch nicht da!
    bis denn

    gorra

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hi,

    1. http://www.nongnu.org/avr-libc/user-...#faq_rom_array :
    Code:
    const char str0[] PROGMEM = "dies  0";
    const char str1[] PROGMEM =  "das 1";
    const char str2[] PROGMEM =  "jenes 2";
    const char str3[] PROGMEM =  "usw 3";
    const char *strPArray[] PROGMEM = { str0, str1, str2, str3 };
    2. Deine LCD-Bibliothek enthält doch spezifisch eine Funktion, um Strings aus dem Flash anzuzeigen: "void lcd_string_p(..);". Genau die solltest Du auch einsetzen (hier für str2): "lcd_puts_p((const char*)(pgm_read_word( &(strPArray[2]) ) ) );" . Oder nimm Deinen Schleifenindex "i" anstelle der "2" in meinem Beispiel.

    MfG

    Fred
    Only entropy comes easy. - Anton Checkhov

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    9
    ja, das funktioniert. Weil von dort komme ich ja.
    Allerdings muss es doch einfacher bzw. dynaischer gehen. oder nicht?
    bis denn

    gorra

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Was meinst Du mit "dynamischer"? Möchtest Du die Strings doch ins RAM laden?
    Only entropy comes easy. - Anton Checkhov

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test