Rückfrage:
Der einzelne "lcd_string(menu[i],...)" klappt, der in der for-schleife nicht ?
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.
Die Textausgabe funktioniert wunderbar, dachte ich!!!Code:PGM_P *menu[] PROGMEM = { "dies 0", "das 1", "jenes 2", "usw 3" };
Ich habe den Text mit einer normalen Ausgabe in das LCD geschrieben.
Wenn i = 0 gesetzt ist, bekomme ich auch "dies 0" ausgeben. Wenn i = 1 ist dann "das 1".Code:lcd_string(menu[i],LCD_LINE1);
Aber packe ich diese Zeile in eine For-Schleife setze, funktioniert diese Ausgabe nicht mehr.
Der Quellcode liegt bei.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); }
Hat jemand eine Idee oder eine Lösung?
bis denn
gorra
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.
nein, wenn ich den String, wie er funktioniert in die Schleife packe. Zeigt das Display nichts mehr an.
es ist der selbe funktionsaufrufCode: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); }
bis denn
gorra
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.
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
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.
du liegst warscheinlich gar nicht so falsch:
die schleife sieht jetzt so aus:
aber jetzt wird nur das erste Element angezeigt, also i = 0. der rest ist immer noch nicht da!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); }
bis denn
gorra
Hi,
1. http://www.nongnu.org/avr-libc/user-...#faq_rom_array :
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.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 };
MfG
Fred
Only entropy comes easy. - Anton Checkhov
ja, das funktioniert. Weil von dort komme ich ja.
Allerdings muss es doch einfacher bzw. dynaischer gehen. oder nicht?
bis denn
gorra
Was meinst Du mit "dynamischer"? Möchtest Du die Strings doch ins RAM laden?
Only entropy comes easy. - Anton Checkhov
Lesezeichen