www.mikrocontroller.net

Forum: Compiler & IDEs Char innerhalb einer Funktion in PROGMEM ablegen


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

kann ich den nachfolgenden Ausdruck irgendwie innerhalb dieser Funktion 
so umschreiben, dass der String im Progmem abgelegt wird? (Geht um das " 
== Setze Uhrzeit ==")

lcd_print( " == Setze Uhrzeit ==",2,5,0,Rot,Blau);

Danke vorab und Gruß

Frank

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

super danke. Habe ich glatt übersehen. Habe folgende Lösung 
implementiert

#define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), 
__a, __b, __c, __d, __e)

void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned 
char fc,unsigned char bc )
{
  char string[40];

  strcpy_P( string, pgmString );

  lcd_print(string,x,y,size,fc,bc);

}

...

lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
...

Wenn einer eine bessere Lösung kennt, immer raus damit.

Wenn nicht schon mal danke

Gruß

Frank

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Hi,
>
> super danke. Habe ich glatt übersehen. Habe folgende Lösung
> implementiert
>
> #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s),
> __a, __b, __c, __d, __e)
>
> void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned
> char fc,unsigned char bc )
> {
>   char string[40];
>
>   strcpy_P( string, pgmString );
>
>   lcd_print(string,x,y,size,fc,bc);
>
> }
>
> ...
>
> lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
> ...
>
> Wenn einer eine bessere Lösung kennt, immer raus damit.

Ich fände hier besser, die Ausgabe von Flash-Strings direkt zu 
unterstützen in lcd_print. Die Funktion bräuchte dann allerdings nen 
weiteren Parameter, der angibt, ob die übergebene String-Adresse sich 
auf den RAM bezieht oder auf's Flash. Das würde die Rumkopiererei 
sparen:
void lcd_print (const char * str, uint8_t in_flash, ...)
{
    char c;
    ...
    if (in_flash)
        c = pgm_read_byte (str++);
    else
        c = *str++;
    ...
}
Darauf könntest du dann Makros legen, etwa
#define LCD_PRINT_RAM(STR,X,Y) lcd_print (STR, 0, X, Y)
#define LCD_PRINT_FLASH(STR,X,Y) lcd_print (PSTR(STR), 1, X, Y)

Ist aber auch Geschmackssache.

Schliesslich böte sich noch an, ne eigene, printf-ähnliche Funktion zu 
schreiben, in der per %-Kommando die print-Koordinaten gesetzt werden 
könnten. %K würde z.B. zwei Koordinaten erfordern:
lcd_printf ("%KHallo%KBingo", 0, 0, 10, 3);

Johann

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johann,

auch nicht schlecht die Idee. Ich muss aber gestehen, ich habe etwas 
gesucht was einfach zu ändern ist. Mir ist einfach der Speicherbedarf zu 
hoch gegangen.

Jetzt suche ich auch noch eine einfache Möglichkeit die folgende 
Struktur ins Progmem zu schieben und wieder drauf zu zu greifen.

typedef void FUNC(void);
typedef FUNC *func;

void MenuSetzeTimer( void )
{
  ....
}

struct stMenu
{
  const char szOut[20];
  func funktion;
};

struct stMenu  PROGMEM stMenuStart[] =
{ {"  ===== Menu =====", NULL},
  {"Timer", MenuSetzeTimer },
  { "" }};


Aufruf :

lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht

Menu[i].funktion(); <--- Geht nicht

Danke und Gruß

Frank

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Frank (Gast)

>typedef void FUNC(void);
>typedef FUNC *func;


>lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht

>Menu[i].funktion(); <--- Geht nicht

Weil Klammern fehlen.
typedef void (*state_func)(void);  // define a function pointer

MfG
Falk

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.