String ausschliesslich im flash...

Gast #39441
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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 #39448
Lesenswert?
• ▲
▼
Siehe Beispiel auf AVR-Libc FAQ:
http://savannah.nongnu.org/download/avr-libc/doc/avr-libcuser-manual/FAQ.html#faq_rom_array

--------------------------
include <avr/pgmspace.h>

const char foo[] PROGMEM = "Foo";
const char bar[] PROGMEM = "Bar";

PGM_P array[2] PROGMEM = {
    foo,
    bar
};

int main (void)
{
    char buf[32];
    strcpy_P (buf, array[1]);
    return 0;
}
------------------------
Gast #39450
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
@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 #39455
Lesenswert?
• ▲
▼
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 #39457
Lesenswert?
• ▲
▼
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(;;);
}

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