PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei einer Textausgabe aus dem Flash



gorra
15.09.2008, 15:00
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?

PicNick
15.09.2008, 15:54
Rückfrage:
Der einzelne "lcd_string(menu[i],...)" klappt, der in der for-schleife nicht ?

gorra
15.09.2008, 16:02
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

PicNick
15.09.2008, 16:09
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);
}

gorra
15.09.2008, 16:24
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.

PicNick
15.09.2008, 16:29
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

gorra
15.09.2008, 16:47
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!

fhs
15.09.2008, 17:05
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

gorra
15.09.2008, 17:13
ja, das funktioniert. Weil von dort komme ich ja.
Allerdings muss es doch einfacher bzw. dynaischer gehen. oder nicht?

fhs
15.09.2008, 17:15
Was meinst Du mit "dynamischer"? Möchtest Du die Strings doch ins RAM laden?

gorra
15.09.2008, 17:22
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

fhs
15.09.2008, 17:25
Hi,

ich kenne keine andere Möglichkeit, per "C" mit verschieden langen Strings im Flash umzugehen.

Gruß

Fred

Editiert: Fehler (EEPROM statt FLASH) korrigiert

fhs
18.09.2008, 09:10
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