Daten aus dem Flash

Gast #756132
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?
#756401
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
Gast #756545
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.
Gast #757829
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?
#757841
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren