LCD-Menü mit Stringarray

Gast #1346884
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?
Gast #1346921
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
}
#1347054
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
Gast #1347726
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'   )

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren