Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei einer Textausgabe aus dem Flash
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.
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.
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.
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?
Rückfrage:
Der einzelne "lcd_string(menu[i],...)" klappt, der in der for-schleife nicht ?
nein, wenn ich den String, wie er funktioniert in die Schleife packe. Zeigt das Display nichts mehr an.
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
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:
for(i=0;i<4;i++)
{
char txt[24];
strcpy(txt, menu[i]);
lcd_string(txt,LCD_LINE1);
}
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.
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
du liegst warscheinlich gar nicht so falsch:
die schleife sieht jetzt so aus:
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!
Hi,
1. http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array :
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
ja, das funktioniert. Weil von dort komme ich ja.
Allerdings muss es doch einfacher bzw. dynaischer gehen. oder nicht?
Was meinst Du mit "dynamischer"? Möchtest Du die Strings doch ins RAM laden?
ne fhs,
mit dynamischer meine ich, dass wenn sich was in einem Menü ändert, das ich nicht 3 Array ändern muss, bzw will.
Nein, ich möchte schon im Flash bleiben, denn sonst sprenge ich mir diesen.
gruss
Hi,
ich kenne keine andere Möglichkeit, per "C" mit verschieden langen Strings im Flash umzugehen.
Gruß
Fred
Editiert: Fehler (EEPROM statt FLASH) korrigiert
Hallo,
im Nachbarforum (http://www.mikrocontroller.net/topic/111207) findest Du eine Diskussion, bei der es um verlinkte Listen für die gleiche Anwendung geht -- das ist vielleicht von Interesse!
Gruß
Fred
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.