Hallo Zusammen!
Folgendes Code Beispiel funktioniert nicht:
#include <avr/pgmspace.h>
const char LCD_Line0[] PROGMEM = "Zeile0";
const char LCD_Line1[] PROGMEM = "Zeile1";
PGM_P LCD_Screen[2] PROGMEM =
{
LCD_Line0,
LCD_Line1
};
int main (void)
{
char buf[16];
for (i = 0; i < 2; i++)
{
strcpy_P (buf, array[i]);
}
return (0);
}
Wenn ich die Variable "i" beim Zugriff auf das Array-Element durch
z.B. die "1" ersetze dann klappt es. Ich suche eine Lösung um es mit
der Variablen zu bewerkstelligen.
Besten Dank schon mal,
Karl
So ganz verstehe ich es nicht: In Deiner Schleife verwendest Du
'array' aber definiert hast Du es nicht. Ich denke, Du meinst
'LCD_Screen' an dieser Stelle, oder?
Egal, um auf Deine eigentliche Frage zurückzukommen:
Da Du nicht nur die Texte ins Flash gelegt hat, sondern auch das Array
mit den Pointern dazu, mußt Du diese auch erst aus dem Flash auslesen.
D.h. statt
strcpy_P (buf, array[i]);
brauchst Du
strcpy_P (buf, pgm_read_word(array[i]));
Ist hier auch schon mehrfach besprochen worden. ZB hier:
http://www.mikrocontroller.net/forum/read-2-137055.html#137164
@Volkmar:
Ja, dass Array heißt nicht array[] sondern LCD_Screen[]. Mein
Fehler...
Ich hab zwar schon nach verwandten Themen gesucht aber dieses nciht
gefunden. Ich werd es heute Abend gleich mal testen. Besten Dank!
@Thomas:
"Funktioniert nicht" heißt, dass ich den String via LCD-Display
anzeigen möchte und das LCD nur wild flackert und überhaupt nichts mehr
funktioniert.
"Klappt" heißt, dass die Anzeige auf´s LCD ohne Probleme
funktioniert.
Du hast recht, ich hätte das besser erklären müssen.
Ich habe es wie folgt umgebaut und es funktioniert immer noch nicht!
#include <avr/pgmspace.h>
const char LCD_Line0[] PROGMEM = "Zeile0";
const char LCD_Line1[] PROGMEM = "Zeile1";
PGM_P LCD_Screen[2] PROGMEM =
{
LCD_Line0,
LCD_Line1
};
int main (void)
{
char buf[16];
for (i = 0; i < 2; i++)
{
strcpy_P (buf, pgm_read_word(LCD_Screen[i]));
}
/* Hier steht Code, der im 50 ms Zyklus dafür sorgt, dass die 2
Zeilen des LCD´s beschrieben werden.*/
return (0);
}
Nach dem Flashen flackert das LCD nur wild und zeigt nichts an.
Was mache ich falsch??????
Das hatte ich ebenfalls ausprobiert. Ohne Erfolg! Wenn ich es so mache
wie Du vorschlägst bekomme ich zusätzlich folgende Compilerwarnung:
-> warning: passing arg 2 of `strcpy_P' makes pointer from integer
without a cast
Und was bedeutet das jetzt?
Muss ich mit der Warnung leben?
Mitlerweile bin ich wirklich am Verzweifeln. Ich bin ja nicht der erste
der dieses Problem hier hat. Die Lösungen bei anderen funktionieren
scheinbar (zumindest schreiben Sie es). Ich möchte lediglich über einen
Index auf Array-Elemente zugreifen die im Flash stehen und diese dann
via LCD anzeigen lassen.
-> Was mache ich falsch???!!!???
Die Warnung geht weg mit
strcpy_P (buf, (PGM_P) pgm_read_word(&LCD_Screen[i]));
ist aber nicht das Problem.
Das Problem kann ich in dem gezeigten Code nicht erkennen.
Hallo,
Ich haette da ein entfernt aehnliches Problem, vielleicht kann mir da
jemand den entscheidenden Tip geben:
struct cmdtab_st
{
/* comand token */
PGM_P CmdToken;
/* comand description */
PGM_P CmdDescr;
};
const struct cmdtab_st cmdtab[] = {
{ PSTR("help"), PSTR("print help message\r\n")}
};
wird nicht uebersetzt, es waeren keine Klammern innerhalb eines
Ausdruckes erlaubt. Ich nehme mal an das er die PSTR(..) Anweisungen
nicht mag, aber wie kann ich eine Tabelle von Struct's im
Programmspeicher ablegen ohne die Strings alle einzeln definieren zu
muessen.
Jens