Hi Texte ans LCD senden ist kein Problem, das funktioniert einwandfrei. Doch leider liegen die Texte ja immer im RAM, deswegen würd ich die nun gerne in den Flashbereich verlagern. Habe dafür meine Routine angepasst: void lcd_ausgabe(unsigned char zeile,unsigned char *text) habe ich zu void lcd_ausgabe(unsigned char zeile,const unsigned char *text) gemacht. Nun hier mein Test mit den Strings: char Text1[] PROGMEM="Test 1 bla da blubb blubb"; char Text2[] PROGMEM="Test 21234"; //Die beiden Strings müssten doch im Flash liegen, oder? int main(void) { lcd_initialisieren(); //starte LCD _delay_s(1); //selbstprogrammierte delay-Routine für Sekunden char ausgabetext[25]; strcpy(ausgabetext,Text1); lcd_ausgabe(1,ausgabetext); //Test 1: Kopiere Text vom Flash in RAM, gebe dann aus _delay_s(1); lcd_ausgabe(2,Text2); //Test 2: Gebe Flashtext direkt aus _delay_s(1); strcpy(ausgabetext,PSTR("blubb")); //Test 3: Der Text müsste doch auch aus dem Flash kommen und direkt in den RAM gehen? lcd_ausgabe(1,ausgabetext); _delay_s(1); lcd_ausgabe(2,"blubbb"); //Test 4: Direktausgabe aus dem RAM while (1) //Endlosschleife, damit das Programm nicht beendet wird und unkontrollierte Zustände auftreten { } return 1; } Nur der 4. Test gibt eine lesbare, sinnvolle Ausgabe auf dem LCD. Woran kann das liegen? Ciao Tobias
So einfach strcpy nehmen ist nicht :-( Wie... siehe http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29
@ Tobias H. nachdem du jetzt hoffentlich (nochmal) das Tutorial wegen PROGMEM durch hast: Es geht doch (fast) so einfach. Nimm strcpy_P :-)
Hi Ja, die Passage habe ich schon 3x oder sogar 4x durchgelesen. Auf die Idee bin ich noch nicht gekommen - ich teste es sofort! Ciao Tobias
char Text1[] PROGMEM="Test 1 bla da bl"; char Text2[] PROGMEM="Test 21234"; int main(void) { lcd_initialisieren(); //starte LCD _delay_s(1); char ausgabetext[16]; strcpy_P(ausgabetext,Text1); lcd_ausgabe(1,ausgabetext); _delay_s(1); lcd_ausgabe(2,Text); _delay_s(1); strcpy_P(ausgabetext,PSTR("blubb")); lcd_ausgabe(1,ausgabetext); _delay_s(1); lcd_ausgabe(2,PSTR("blubbb")); _delay_s(1); lcd_ausgabe(2,"blubbb"); while (1) //Endlosschleife, damit das Programm nicht beendet wird und unkontrollierte Zustände auftreten { } return 1; } Soo... 1 geht bestens, 2 müll, 3 geht, 4 gibt müll und 5 gar nix. Also muss ich immer erst strcpy_P verwenden, ohne gehts nie?
Im prinzip ja. Du kannst dir das so vorstellen: Die Polizei deines Wohnortes sucht Peter Müller in der Schillerstrasse 4. strcpy sucht in deiner Stadt - dort wohnt aber kein Peter Müller strcpy_P ist für die Nachbarstadt zuständig - dort wohnt in der Schillerstrass 4 ein Peter Müller. Was strcpy_P jetzt macht ist, dass er den Peter Müller in deine Stadt bringt damit ihn die Polizei in der Schillerstrasse 4 finden und verhaften kann ;-) Und jetzt ersetzte das Wort "Polizei deines Wohnortes" durch "lcd_ausgabe" und verhaften durch "am LCD ausgeben". Man kann natürlich auch das BKA beauftragen, dass ist dann eine andere Polizeibehörde die direkt im Nachbarort suchen. Ersetzte BKA durch "lcd_ausgabe_aus_progmem". (z.B. mit pgm_read_byte)
Ok, danke, das ist verständlich :-) ich denke, da ist strcpy_P wesentlich einfacher zu handhaben als pgm_read_byte Kann man strcpy_P irgendwie mit in die Unterroutine (lcd_ausgabe) einbinden? Schlecht, oder? Weil an die Routine muss ich ja direkt schon den Inhalt, also den "verhafteten" weitergeben. Ciao Tobias
Hehe Das BKA lass ich mal lieber aus dem Spiel, kann zwar "alles", ist aber zu kompliziert. Macht nur Fehler... Da lob ich mir dann doch die Polizei aus dem Nachbarort, auch wenn ich die immer extra anrufen muss. Damit ist mein Problem komplett geklärt, vielen Dank! Ciao Tobias
Folgendes gibts in der LCD-Routine von Fleury: lcd.c:
1 | void lcd_puts_p(const char *progmem_s) |
2 | /* print string from program memory on lcd (no auto linefeed) */
|
3 | {
|
4 | register char c; |
5 | |
6 | while ( (c = pgm_read_byte(progmem_s++)) ) { |
7 | lcd_putc(c); |
8 | }
|
9 | |
10 | }/* lcd_puts_p */ |
lcd.h:
1 | #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))
|
Das benutze ich so:
1 | lcd_puts_P("TESTSTRING"); |
Bei Fragen nochmal fragen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.