mikrocontroller.net

Forum: Compiler & IDEs Daten aus dem Flash


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, und so?
const char atexte4[] PROGMEM = {
  "TEXT1",
  "TEXT2",
  "TEXT3"
};

const char *texte1 PROGMEM = atexte4;

Autor: Martin Thomas (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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
char atexte4[][10] PROGMEM = {
  "TEXT1",
  "TEXT2",
  "TEXT3"
};

uint8_t finditem (pgm_p texte[10], uint8_t entries)
{
     printf_P(PSTR("%s"), texte[entry]);  
}

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

MFG
Falk

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie wird finditem aufgerufen?

runmenue = finditem(???,2);

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an finditem möchte ich

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


übergeben.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe es jetzt so abgeändert:
char texte[][3] PROGMEM = {
  "TEXT1",
  "TEXT2",
  "TEXT3"
};

//jetzt müßte TEXT1 TEXT2 TEXT3 im Flash gespeichert sein.

// Ausgabe
void printLCD (PGM_P texte[3])
{
     printf_P(PSTR("%s"), texte[0]);
     printf_P(PSTR("%s"), texte[1]);
     printf_P(PSTR("%s"), texte[2]);
}

// Funtionsaufruf ???
printLCD(texte);
was ist noch falsch?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// Funtionsaufruf ???
printLCD(texte);




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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geschafft, Danke an Alle.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.