Gast
#2633113
Hallo allerseits,
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Dies kann sooo nicht funktionieren, es müsste eine pgm_read_string oder so was geben. Wo finde ich diese Info? Schon mal danke :-)
|
Anzeige
|
Wie Strings aus dem PROGMEM holen
Gast
#2633113
Hallo allerseits,
Dies kann sooo nicht funktionieren, es müsste eine pgm_read_string oder so was geben. Wo finde ich diese Info? Schon mal danke :-)
Gast
#2633118
Erstes google-ergebnis "pgm_read_" http://www.nongnu.org/avr-libc/user-manual/pgmspace.html da steht alles was du brauchst. Hallo, pgm_read_byte ließt nur das erste Byte (Zeichen) des Strings, Du musst also noch eine Schleife programmieren.
Gast
#2633180
Hallo Entweder du kopierst den String byte-weise in den RAM und gibst ihn dann aus, oder (besser) du ergänzt eine LCD_printf_P methode die pgm_read_byte verwendet um direkt aus dem Flash auszugeben. Schließlich wird das LCD sowieso Byte für Byte beschrieben. da1l6
Gast
#2633184
YEAH it works!!!!
Besten Dank :-) Peter Zz schrieb: > strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table[i]))); > LCD_printf(i,0,buffer); Das ist die 'schlechte' Methode, weil du vorab nicht weißt, wie groß du den Buffer allokieren musst. Und derartige Annahmen haben das Zeug dazu, irgendwann im Leben eines Programmes ungültig zu werden.
Gast
#2633197
Karl Heinz Buchegger schrieb: > Und derartige Annahmen haben das Zeug dazu, > irgendwann im Leben eines Programmes ungültig zu werden. Genau, deshalb werde ich versuchen die LCD_printf um das pgm_read_byte zu erweitern und der LCD_printf dann einen Pointer auf den gewünschten Nullterminierten String übergeben.
Gast
#2633203
Peter Zz schrieb: > und der LCD_printf dann einen Pointer auf den gewünschten > Nullterminierten String übergeben und das nächste Problem, wie übergebe ich meiner LCD_printf einen Pointer auf PROGMEM? Peter Zz schrieb: > Peter Zz schrieb: >> und der LCD_printf dann einen Pointer auf den gewünschten >> Nullterminierten String übergeben > > und das nächste Problem, wie übergebe ich meiner LCD_printf > einen Pointer auf PROGMEM? Einfach als Pointer. PROGMEM brauchst du nur um bei der Definition die Werte ins Flash zu verschieben. Aber zu Dokuzwecken. Wie hast du denn hier
ausgedrückt, dass string_table ein Array von Pointern ins Flash ist? > deshalb werde ich versuchen die LCD_printf um das pgm_read_byte > zu erweitern Wirf die originale Funktion nicht über Bord. Du wirst sie noch brauchen! Bei solchen Sachen hat man normalerweise immer 2 Funktionen. Die eine will normale Pointer ins SRAM haben, die andere Pointer ins Flash. So wie zb strcpy ( kopiert SRAM->SRAM ) strcpy_P ( kopiert Flash->SRAM ) Du hast dann eben ein LCD_printf String kommt aus dem SRAM LCD_printf_P String kommt aus dem Flash Es scheint sich allerdings da auch eine andere Konvention durchzusetzen: Die Funktion kriegt hinten einen Suffix _p, würde also LCD_printf_p heißen. Die Variante mit einem großen P würde bedeutet, dass sich dieser 'Funktionsaufruf' selber darum kümmert, dass der String im Flash landet. LCD_printf_P( "Hallo" ); sorgt dann dafür, dass der Text "Hallo" im Flash liegt und ein entsprechender Flash-Pointer an die Funktion LCD_printf_p (diesmal mit kleinem p) übergeben wird. Gemacht ist es so
Das PSTR Makro sorgt dafür, dass der konstante Text im Flash bleibt. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|