http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vereinfachung_f.C3.BCr_Zeichenketten_.28Strings.29_im_Flash zeigt wie man einfache Strings nur Flash verbrauchend ablegt und nutzt. char StringImFlash[] PROGMEM = "Erwin Lindemann"; // im "Flash" Ich schaff es jedoch nicht ein String Array abzulegen. const char *aReg16Names[] PROGMEM = { "abc", "def", "ghi"}; ..legt nur die Addressen ab, nicht die Strings o.ä. const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"}; .. geht nicht const char *aReg16Names[] PROGMEM = { PSTR("abc"), "def", "ghi"}; ..: "error: braced-group within expression allowed only inside a function" Wie könnte es gehen? Robert
> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"}; > .. geht nicht Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl angegeben werden.
1 | const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"}; |
geht...
Johannes M. wrote: >> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"}; >> .. geht nicht > Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl > angegeben werden. > >
1 | > const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"}; |
2 | >
|
> geht...
Es soll kein rechteckiges 2D-Array werden, den die Strings im realen
Case sind sehr unterschiedlich lang und viele.
Gibts noch eine andere Lösung für freie String-Arrays?
Robert
Robert K. wrote: > Es soll kein rechteckiges 2D-Array werden, den die Strings im realen > Case sind sehr unterschiedlich lang und viele. > Gibts noch eine andere Lösung für freie String-Arrays? > Sicherlich.
1 | const char Str1[] PROGMEM = "String1"; |
2 | const char Str2[] PROGMEM = "String2"; |
3 | |
4 | const char* Strings[] PROGMEM = { Str1, Str2 }; |
Karl heinz Buchegger wrote: > Robert K. wrote: > >> Es soll kein rechteckiges 2D-Array werden, den die Strings im realen >> Case sind sehr unterschiedlich lang und viele. >> Gibts noch eine andere Lösung für freie String-Arrays? >> > Sicherlich. > >
1 | > const char Str1[] PROGMEM = "String1"; |
2 | > const char Str2[] PROGMEM = "String2"; |
3 | >
|
4 | > const char* Strings[] PROGMEM = { Str1, Str2 }; |
5 | >
|
Danke. (Da die Tabellen eh von einem Py-Script automatisiert erzeugt werden, kann man mit den Hilfsnamen leben ...) Grüsse Robert
Hallo, ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD Lib Funktion von Peter Fleury lcd_puts_p übergeben. Kann ich dann einfach mit
1 | lcd_puts_p(Strings[1]); |
"String2" auf dem Display ausgeben ? Danke und Gruß technikus
technikus schrieb: > Hallo, > > ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD > Lib Funktion von Peter Fleury lcd_puts_p übergeben. > > Kann ich dann einfach mit > >
1 | > lcd_puts_p(Strings[1]); |
2 | >
|
> > "String2" auf dem Display ausgeben ? Nein kannst du nicht. Weil Strings selber wieder ein Array ist (ein Array von Pointern) welches im Flash liegt. Und für jede Variable, die im Flash liegt, muss der Zugriff über die entsprechenden pgm_readxxx Funktionen gehen. Allerdings muss das Strings Array ja auch nicht zwingend im Flash liegen.
Hallo, das String Array würde ich gerne im Flash ablegen, da doch schon einige Texte zusammenkommen werfen. Jetzt finde ich die pgm_read_word Funktion. Wenn ich richtig verstehe, muss ich mir die Pointeradresse des gewünschten Strings aus dem Flash holen. Dann an das LCD übergben ?
1 | tempString = (const char*)( pgm_read_word( &(Strings[1]) ) ); |
2 | lcd_puts(tempString); |
Passt das so? Gruß
technikus schrieb: > Passt das so? Da tempString auch auch Adressen im Flash verweist, solltest Du lcd_puts_p verwenden.
Da ich schon 2 Jahre keinen AVR mehr programmiert habe, musste ich erst einmal AVR Studio 5 installieren und mein STK500 rauskramen. Nach ein bißchen Auseinandersetzung mit dem AVR Studio 5 habe ich schon einiges weggetippt. So läuft es:
1 | //Beispiel zur Ausgabe im LCD
|
2 | int i = 0; //bis i= StringArrayChannelSize... |
3 | |
4 | lcd_puts_p((const char*)( pgm_read_word( &(strarray1[i]) ) )); |
5 | |
6 | |
7 | //oder
|
8 | |
9 | char temp[20]; |
10 | |
11 | //Stringarray Inhalt in temp Variable schreiben
|
12 | strcpy_P(temp, (const char*(pgm_read_word((strarray1[i]) ) ) ); |
13 | lcd_puts(temp); |
DANKE!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.