Forum: Compiler & IDEs Daten aus dem Flash


von Michael (Gast)


Lesenswert?

Hallo,

das wurde schon öfters hier behandelt, aber trotzdem häng ich noch an 
einer Stelle fest.

 Daten ins Flash ablegen:
1
const char *texte4[] PROGMEM = {
2
  "TEXT1",
3
  "TEXT2",
4
  "TEXT3"
5
};
An eine Funktion übergeben:
1
runmenu = finditem(texte4, 2);
Funktion:
1
u08 finditem (const char *texte[], char entries)
2
{
3
     printf_P(PSTR("%s"), texte[entry]);  
4
}

bei der übergabe mach ich bestimmt was falsch, kanns mir jemand 
verraten?

von Falk B. (falk)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Noch ein Hinweis:
Überleg gut was denn nun im Flash liegt:
Der Pointer auf die Texte oder die Texte selber.

von Michael (Gast)


Lesenswert?

ok, und so?
1
const char atexte4[] PROGMEM = {
2
  "TEXT1",
3
  "TEXT2",
4
  "TEXT3"
5
};
6
7
const char *texte1 PROGMEM = atexte4;

von Martin Thomas (Gast)


Lesenswert?

Siehe avr-libc FAQ "How do I put an array of strings completely in ROM?"

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>ok, und so?

Nein, immer noch voll daneben

- du willst ein zweidimensionales Array mit Strings, keine 
eindimensionales mit Zeigern auf Strings. Dabei muss die grösse der 
untergeodrneten Idizes fest vorgegeben werden (hier mal 10 als 
Beispiel).
- um Daten aus dem Flash zu lesen musst du die Funktion pgm_read_byte() 
etc. nutzen. Siehe Doku der libc im WINAVR
- solche coolen Tricks wie u08 würde ich mir abgewöhnen, ist relativ 
sinnfrei
1
char atexte4[][10] PROGMEM = {
2
  "TEXT1",
3
  "TEXT2",
4
  "TEXT3"
5
};
6
7
uint8_t finditem (pgm_p texte[10], uint8_t entries)
8
{
9
     printf_P(PSTR("%s"), texte[entry]);  
10
}

Steht alles ausführlich im Tutorial. Ist wirklich bedauerlich, dass es 
das noch nicht als Hörbuch gibt  ;-)

MFG
Falk

von Michael (Gast)


Lesenswert?

und wie wird finditem aufgerufen?

runmenue = finditem(???,2);

entschuldigt wenn das nervt, aber es hat bei noch nicht gefunkt.

von Chris (Gast)


Lesenswert?

Was macht denn finditem? Liefert es einen string zurueck, laesst es eine 
LED blinken oder startet es einen Motor? (es gibt noch mehr 
Moeglichkeiten.)

Wenn du das beantworten kannst, kannst du auch sagen wie und wann du 
finditem aufrufen musst.

von Michael (Gast)


Lesenswert?

an finditem möchte ich

const char texte4[][10] PROGMEM = {
  "TEXT1",
  "TEXT2",
  "TEXT3"
};


übergeben.

von Michael (Gast)


Lesenswert?

ich habe es jetzt so abgeändert:
1
char texte[][3] PROGMEM = {
2
  "TEXT1",
3
  "TEXT2",
4
  "TEXT3"
5
};
6
7
//jetzt müßte TEXT1 TEXT2 TEXT3 im Flash gespeichert sein.
8
9
// Ausgabe
10
void printLCD (PGM_P texte[3])
11
{
12
     printf_P(PSTR("%s"), texte[0]);
13
     printf_P(PSTR("%s"), texte[1]);
14
     printf_P(PSTR("%s"), texte[2]);
15
}
16
17
// Funtionsaufruf ???
18
printLCD(texte);
was ist noch falsch?

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>char texte[][3] PROGMEM = {
>  "TEXT1",
>  "TEXT2",
>  "TEXT3"
>};

TEXT1 braucht mindestens 6 Bytes. Also muss als text[][6] definiert 
werden.

>void printLCD (PGM_P texte[3])

Eher so

void printLCD (PGM_P texte[][6])

>     printf_P(PSTR("%s"), texte[0]);

      printf_P(PSTR("%s"), &texte[0]);

MfG
Falk

von Michael (Gast)


Lesenswert?

// Funtionsaufruf ???
printLCD(texte);




Warning  1  warning: passing argument 1 of 'printLCD' from
incompatible pointer type

von Karl H. (kbuchegg)


Lesenswert?

> char texte[][3] PROGMEM = {
>   "TEXT1",
>   "TEXT2",
>   "TEXT3"
> };


Ich versteh nicht, warum du nicht einfach das Kochrezept aus
dem Tutorial anwendest

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Array_aus_Zeichenketten_im_Flash-Speicher

von Karl H. (kbuchegg)


Lesenswert?

> printf_P(PSTR("%s"), texte[0]);

Da muss zumindest ein %S (beachte das gross geschrieben S) in
den Format-String, wenn sich printf das String Argument aus dem
Flash holen soll.
Das _P im Funktionsnamen (printf_P) bezieht sich auf die Position
des Format-Strings.

von Michael (Gast)


Lesenswert?

Geschafft, Danke an Alle.

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
Noch kein Account? Hier anmelden.