WINAVR Strings im Flash

06/11/2008 - 19:07 von Stefan Brröring | Report spam
Hallo,

irgendwie komm ich hier nicht klar. Hab mir einige Beispiele aus dem
Netz gesucht, aber irgendwie funktioniert das nicht. Momentan hab ich
den Eindruck, dass einige Leute Codeschnipsel veröffentlichen, ohne sie
zu testen:

Ich will in einem Projekt konstante Texte im Flash ablegen, um sie bei
Bedarf auf einem LCD-Display anzeigen zu können. Dazu habe ich im Web
gesucht, wie man das macht, ohne RAM zu verschwenden.

Dazu habe ich unter anderem das hier gefunden:

siehe auch:
http://www.roboternetz.de/wissen/in...h_belassen

#include <avr/pgmspace.h>
const prog_char str3[] = "Hallo Welt!";
unsigned int strlen_P (const prog_char *str)
{
unsigned int len = 0;
while (1)
{
char c = (char) pgm_read_byte (str);
if ('\0' == c)
return len;
len++;
str++;
}
}
daraus hab ich dann folgendes gemacht:

void LCD_printtxtfromflash(char line, const prog_char *FlashSTR)
{
char c;
do
{ c = pgm_read_byte (FlashSTR++);
if (c) LCD_printchar(line++,c);
}
while (c);
}

const prog_char FS_1D[] = "Bitte geben Sie den";
LCD_printtxtfromflash(0,FS_1D);

-

Die Funktion LCD_printchar schreibt ein einzelnes Zeichen auf ein
LCD-Display und funktioniert ansonsten einwandfrei.

Hier bekomme ich aber nur Unsinn auf das Display geschrieben.
Hat da jemand einen Tipp für mich?

Gruß

Stefan DF9BI
 

Lesen sie die antworten

#1 Stefan Brröring
06/11/2008 - 19:42 | Warnen spam
Ist line tatsàchlich die Zeile? Beginnend mit 0? Warum wird die
innerhalb der Funktion bei jedem Zeichen um eins erhöht? Oder soll line
die Zeichenposition angeben?



korrekt, line ist die Zeichenposition 0-79 auf einem 4x20 Display. Die
betreffende Funktion LCD_printchar funktioniert übrigens einwandfrei,
z.B. das hier:



void LCD_printtxt(char line, char *z)
{ uint8_t b;
while( *z )
{ b = *z++; // null-terminierter String, Abbruch wenn *z=0
LCD_printchar(line++,b);
if (line >= 80) line = 0;
}
}

LCD_printtxt(0,"Hello World");

-


Stimmt die Lànge des ausgegebenen Unsinns?

nein



Gruß

Stefan

Ähnliche fragen