Forum: Compiler & IDEs LCD-Menü mit Stringarray


von Andreas (Gast)


Lesenswert?

Für ein kleines Projekt bräuchte ich eine übersichtliche Menü-Routine.
Ich hatte ein Menü mit switch(page) programmiert, in deren Fällen ich 
die verschiedenen Meldungen direkt ausgegeben hab (
case 1:
     {
 lcd_string("Blabla")
break;

usw.).

Da mein Menü über's LCD Display einmal nur betrachtet werden kann
(case 0-29)
, und einmal (nach Betätigen einer bestimmten Taste) auch bearbeitet 
werden kann (case 30-59), wird schnell ersichtlich damit mit dieser 
Methode viel Tipparbeit notwendig ist und der Programmspeicher unnötig 
vollgestopft wird ;).

Nun war ich am überlegen, ob ich ein Array aus Strings erstelle um diese 
mittels

lcd_string(message[x]) aufrufen zu können.

Mein Ansatz:
1
#include <avr/pgmspace.h>
2
#include <string.h>
3
volatile char message[5][14]PROGMEM ={
4
  {"nachtricht 1 \n"},
5
  {"nachtricht 2 \n"},
6
  {"nachtricht 3 \n"},
7
  {"nachtricht 4 \n"},
8
  {"nachtricht 5 \n"}};

Der Abruf des Strings sollte dann im main - Teil des Programmes mittels
1
     
2
        { 
3
...
4
        page=1;
5
        uart_putstring("RS232 [OK]....\r\n\r\n");
6
        lcd_string("Zeile 1");
7
        set_cursor(0,2);
8
        lcd_string(message[page]);
9
...
10
       }

erfolgen. Nur will das nicht klappen.

Genauere Information zum Fehler:

Komischerweise wird mir im Display nun

Zeile 1
232[OK]...XXXX                      (XXXX=kryptische Zeichen)

angezeigt.

Nun - bin schon fast am verzweifeln - Hat jemand eine Idee an was es 
liegen könnte?

von Olli (Gast)


Lesenswert?

zwei Ideen, für PROGMEM brauchst du spezielle Routinen zum auslesen und 
Strings werden mit '\0' abgeschlossen... Olli

von Andreas (Gast)


Lesenswert?

Ah, danke.
Aber irgendwie hab ich's jetzt doch anderst hinbekommen ;)
Falls es jemand interessiet:
1
const char text1[]PROGMEM = "Linie1";
2
const char text2[]PROGMEM = "Linie2";
3
const char text3[]PROGMEM = "Linie3";
4
const char text4[]PROGMEM = "Linie4";
5
6
PGM_P menu[4]PROGMEM={text1,text2,text3,text4};
7
8
.
9
.
10
.
11
12
int main(void)
13
 {
14
 .
15
 .
16
 .
17
18
strcpy_P(Buffer,menu[1]);
19
lcd_string(Buffer);
20
21
}

von Roland P. (pram)


Lesenswert?

verwende anstatt lcd_string lcd_string_P (falls es diese in deiner 
LCD-Lib gibt)
diese kann Strings aus dem Progmem ausgeben.

Solche Sachen sind auch "böse":
1
uart_putstring("RS232 [OK]....\r\n\r\n");
Braucht gleich mal 18 Bytes RAM

Besser wäre
1
uart_putstring_P(PSTR("RS232 [OK]....\r\n\r\n"));

Gruß
Roland

von gast (Gast)


Lesenswert?

wenn man weiß as man nit einem AVR arbeitet

kann man sich bei stringverarbeitung gleich angewöhnen die progmem 
sachen reinzubasteln

also lcd_P und uart_P
das erspart so einiges an RAM


diese _P funktionen sehen genau so aus wie die normalen
nur das das datenbyte vorher schnell aus dem flash geholt wird

pgm_read_byte(string) erledigt dieses ..
man muss das nur an der passenden stelle einbauen

zB
anstat while(*string)

steht dann  while( (data =  pgm_read_byte(string++)) != '\0'   )

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
Noch kein Account? Hier anmelden.