mikrocontroller.net

Forum: Compiler & IDEs LCD-Menü mit Stringarray


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/pgmspace.h>
#include <string.h>
volatile char message[5][14]PROGMEM ={
  {"nachtricht 1 \n"},
  {"nachtricht 2 \n"},
  {"nachtricht 3 \n"},
  {"nachtricht 4 \n"},
  {"nachtricht 5 \n"}};

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

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?

Autor: Olli (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, danke.
Aber irgendwie hab ich's jetzt doch anderst hinbekommen ;)
Falls es jemand interessiet:
const char text1[]PROGMEM = "Linie1";
const char text2[]PROGMEM = "Linie2";
const char text3[]PROGMEM = "Linie3";
const char text4[]PROGMEM = "Linie4";

PGM_P menu[4]PROGMEM={text1,text2,text3,text4};

.
.
.

int main(void)
 {
 .
 .
 .

strcpy_P(Buffer,menu[1]);
lcd_string(Buffer);

}

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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":
uart_putstring("RS232 [OK]....\r\n\r\n");
Braucht gleich mal 18 Bytes RAM

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

Gruß
Roland

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.