String ausschliesslich im flash...

Gast #39441
hallo zusammen,

ich versuche gerade ein string array auschliesslich im flash zu 
belassen..habe aber so meine probleme. kann mir einer helfen? sollte so 
aussehen:

das sollte nur im flash stehen:

const unsigned char stra[4][8]
{
   "Test1",
   "Test2",
   "Test3",
   "Test4"
};

und sollte ich es irgendwie wieder ausgeben sollen:

lcdputstring(stra[i][0]);

danke schon mal
Gast #39445
mhh...genau das hab ich schon gesehen aber ich lege ja keine string im 
flash ab sondern ein array...ich hab keine ahnung wie diesen blöde array 
auschliesslich im flash abgelegt wird..
ich habe das mal so gemacht:

PGM_P unsigned char menu[4][8]
{
   "Test1",
   "Test2",
   "Test3",
   "Test4"
};

bekomme aber dann jede menge warnings:

lcdtest.c:15: warning: missing braces around initializer
lcdtest.c:15: warning: (near initialization for `menu[0]')
lcdtest.c:13: warning: unused variable `menu'  <-- der ist klar

die frage ist jetzt wäre dann jetzt noch wie ich einen pointer auf eines 
dieser felder erzeugen kann und an diese
__lpm_inline((unsigned short)addr++))) funktion übergeben kann
Gast #39447
in meinem vorletzte post war ein fehler sieht so aus:


PGM_P menu[4][8]
{
   "Test1",
   "Test2",
   "Test3",
   "Test4"
};

und für die ausgabe so.

lcdputstrP(PSTR(menu[0][0]));
aber es klappt wie gesagt schon nicht mit dem anlegen im flash
Gast #39450
oh gott...habs jetzt so gemacht:

const char text1[] PROGMEM = "Test1";
const char text2[] PROGMEM = "Test2";
const char text3[] PROGMEM = "Test3";
const char text4[] PROGMEM = "Test4";

PGM_P menu[4] PROGMEM = { text1, text2, text3, text4 };

der compiler meckert weiter:

lcdtest.c: In function `main':
lcdtest.c:13: warning: `__progmem__' attribute ignored
lcdtest.c:14: warning: `__progmem__' attribute ignored
lcdtest.c:15: warning: `__progmem__' attribute ignored
lcdtest.c:16: warning: `__progmem__' attribute ignored
lcdtest.c:18: warning: `__progmem__' attribute ignored
Gast #39451
@Christian, ich habe dir ein Beispiel  gemacht:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

const char text1[] PROGMEM = "Test1";
const char text2[] PROGMEM = "Test2";
const char text3[] PROGMEM = "Test3";
const char text4[] PROGMEM = "Test4";

PGM_P menu[4] PROGMEM = { text1, text2, text3, text4 };


int main(void)
{
    DDRB  = 0xff;


    char buffer[10];

    strcpy_P( buffer, menu[1] );

    PORTB=~buffer[4];   /* output '2' from "Test2" */
    for(;;);
}
Gast #39453
ach nochwas...sorry...

aber ist es auch möglich ein datenfeld direkt aus dem flash zu schreiben 
ohne das ganze vorher noch in ein buffer zu schreiben?
Gast #39455
ok...oh gott..:)..

hab das einfach mal mit PRG_RDB ausprobiert und es 
funktioniert...:)....aber warum ist das in der docu nicht drin? ist auch 
egal ich hab jetzt ein letztes problem und zwar hab ich ja jetzt mit 
dieser zeile "PGM_P menu[4]" ein pointer generiert mein problem ist, das 
ich zwar so mit dem arbeiten kann wie z.B PORTB = PRG_RDB(menu[0][2]) 
aber ich kann den nicht an eine funktion übergben wie z.b


machwas(menu[0][1]);


void machwas(unsigned char *data)
{

}
Gast #39456
was ich zumindest möchte, das ist einen pointer auf eines dieser felder 
übergeben und das ganze dann mit PRG_RDB in einer funktion ausgeben.
Gast #39457
Hier ein komplettes Beispiel, siehe Funktion my_strcpy_P()
Wie bereits in meinen früheren Beitragen wie auch in AVR-Libc FAQ 
erwähnt muss eine Funktion die ProgMem String verarbeiten will, diesen 
String Zeichen für Zeichen mit dem Makro PRG_RDB auslesen.


#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>


const char text1[] PROGMEM = "Test1";
const char text2[] PROGMEM = "Test2";
const char text3[] PROGMEM = "Test3";
const char text4[] PROGMEM = "Test4";

PGM_P menu[4] PROGMEM = { text1, text2, text3, text4 };

static char *my_strcpy_P( char *p, const char *progmem_addr );


/* Copy SRC to DEST. (SRC = Program Memory) */
extern char *
my_strcpy_P( char *__dest, const char *__progmem_src )
{
    char *d = __dest;

    /* we need to copy each byte from program memory */
    while ( (*d++ = PRG_RDB(__progmem_src++)) );

    return __dest;
}


int main(void)
{
    DDRB  = 0xff;


    char buffer[10];

    my_strcpy_P( buffer, menu[1] );

    PORTB=~buffer[4];   /* output '2' from "Test2" */
    PORTB=~PRG_RDB(&menu[1][4]);
    for(;;);
}
Gast #39459
Hi

wieß einer wie jetzt nur einzelne Hex Werte auf die Gleiche Art 
ablege...

const char foo[] PROGMEM = 0xff, 0xaa, 0xff, 0xaa;

so was funktioniert nicht

gruß
Kjion

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.