Forum: Compiler & IDEs LCD - Menu


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

nachdem ich im Forum nach Code für LCD-Menüsteuerung gesucht habe und
nur auf Codeschnipsel gestoßen bin hab ich mich heute mal selbst dran
gemacht.

Die Routine ist lauffähig. Ich benutze AVR-Studio und einen Atmega8,
bin aber noch ziemlich neu im Stoff.

Freue mich auf Rückmeldungen und Diskussion.

Stefan

von Andi (Gast)


Lesenswert?

Ist ne immense Speicherplatzverschwendung.
Benutz nochmal die Suche und nimm die Codeschnipsel, die das FlashROM
für die Menü-Einträge nutzen. Alles andere ist defacto unbrauchbar.

von Andi (Gast)


Lesenswert?

Als Beispiel hier ein Eintrag eines Dieters aus diesem Forum. Das sieht
mir sehr vernünftig aus.

************************

Aus dem Stegreif würde ich es (universell) so machen:

typedef struct MENU {
  const unsigned char *text;
  int8_t previous;
  int8_t next;
  int8_t up;
  int8_t down;
  void ( *fp )( void );
} MENU_ENTRY;


Das Menü ist dann ein Array von MENU_ENTRYs:
const MENU_ENTRY menue[] PROGMEM= {
  { menu_string0, 1, 2, 3, 4, menu_function },

Die Strings sehen dann so aus:
  static const char menu_string0[] PROGMEM = "Hallihallo";

Die Funktion dann so:
  void menu_function01( void );

************************

von Stefan (Gast)


Lesenswert?

Danke für die Rückmeldungen.

Ich hatte immer das Problem, dass ich, um die Adressen von den anderen
Einträgen zu bekommen, diese erst zur Laufzeit initialisieren muss und
deswegen nicht statisch irgendwo hinpacken kann. Mit dem Array ist das
Problem natürlich gegessen. Werd's mal so versuchen.

von Stefan (Gast)


Lesenswert?

Und schon hänge ich an der nächsten Ecke:

Ich bekomme die Daten zwar auf den Flash-Rom drauf, aber wie kann ich
sie dann wieder auslesen? Das (sehr gute) AVR-GCC-Tutorial läßt den
Absatz über Structs im Flash dankenswerterweise aus.

Das Problem ist auch unter
http://www.mikrocontroller.net/forum/read-2-40721.html#227171
beschrieben, leider belässt es der Autor mit der Meldung, dass er das
Problem jetzt lösen konnte ohne auch nur einen Hinweis zu geben wie.

Also einfache Frage: Mit welcher Konstruktion komme ich z.B. an den
String im Struct im Flash-Rom ran?

von Rolf Magnus (Gast)


Lesenswert?

> Also einfache Frage: Mit welcher Konstruktion komme ich z.B. an
> den String im Struct im Flash-Rom ran?

Einfach ganz normal drauf zugreifen ging nicht?

von Dirk (Gast)


Lesenswert?


von Jürgen (Gast)


Lesenswert?

"Einfach ganz normal drauf zugreifen ging nicht?"

Was heißt denn "normal"?
Natürlich muss er die Flash-Lese-Routinen nehmen.
Durch die Harvard-Architektur des AVR ist das nämlich etwas
umständlicher als bei anderen Prozessoren.

von Rolf Magnus (Gast)


Lesenswert?

> "Einfach ganz normal drauf zugreifen ging nicht?"
>
> Was heißt denn "normal"?

Na so, wie man auf Variablen halt zugreift.

char c = menu[i].text[0];

> Natürlich muss er die Flash-Lese-Routinen nehmen.

Wenn er den String ins RAM kopieren will, z.B. weil er eine Funktion
aufrufen möchte, die ihn im RAM erwartet, dann muß er eine
entsprechende Kopierfunktion aufrufen. Aber allgemein muß er keine
speziellen "Flash-Lese-Routinen" verwenden. Der AVR-GCC bietet hier
über die Variablen-Attribute die Möglichkeit, auf die Variablen immer
auf die gleiche Weise zuzugreifen, egal ob im RAM oder Flash, solange
man eben nicht versucht, auf eine Variable im Flash über einen Zeiger
auf's RAM oder umgekehrt zuzugreifen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein Rolf.

von Rolf Magnus (Gast)


Lesenswert?

Ah. Der Compiler akzeptiert es und generiert nur falschen Code. Das
hätte man aber auch besser lösen können.
Damit ziehe ich meine Meinung zurück und behaupte das Gegenteil.

von Jürgen (Gast)


Lesenswert?

Sag ich doch...

von Stefan (Gast)


Lesenswert?

...und doch noch nicht.

Mit der beschriebenen Lösung komme ich zwar an einen String im Flash
ran, auch wenn der zusätzlich noch in ein Array gepackt ist. Aber beim
Zugriff auf einen String in einem Struct kommt nur Unsinn zurück.

Hat jemand Erfahrung mit Structs im Flash-Rom? Also:

---------------------------------------------

typedef struct MENU {
  const unsigned char *text;
} MENU_ENTRY;

static const char menu_string0[] PROGMEM = "Hallihallo";

const MENU_ENTRY menue[] PROGMEM= {
  { menu_string0 }
} ;

--------------------------------------------

Und jetzt ein Lösung für  = menue[0].text ;

Alles ganz schön verstrickt...

Stefan

von Dirk (Gast)


Lesenswert?

Hi,

am besten schaust du dir den Butterfly Code von Martin Thomas (MThomas)
an. Er hat den gesamten Butterfly Code zu GCC convertiert.

Gruß,
Dirk

von Werner B. (Gast)


Lesenswert?

@Stefan,

PGM_P pStr = pgm_read_word( &menue[0].text );

und dann zB

lcd_printf_P(pStr);

von thomas t (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
ich biete hier nur ein Beispiel, ob es ein Außenstehnder verstehen
kann, vermag ich nicht zu sagen......
ganz "Sauber" geschrieben ist es sicherlich nicht...

ich würde gerne Fragen dazu beantworten und
(ist mir wichtiger) Meinungen hören ob das File verstanden werden
kann??.

Alle Angezeigten Texte und die Verweise stehen im FlashRom.

Es gibt nur DREI Tasten "up" "down" und (("OK" =="ret" ))

"lcd_write_text" muss nur einmal mit "read_lcd_tast()" im MAIN
zyklus aufgerufen werden.

So kann man auch im Menue verzweigen:
Wenn zB in einem 2-Stelligen display steht:
*****************************************
OK to Edit DATE
Down to continue
*****************************************
...kann man mit OK in einen neuen Zweig im Menüe wechseln, um minuten
stunden Tage usw.zu ändern, oder zur nächsten Zeile im "Haupmenue"


Im struct "PROGMEM lcd_rom_ins_data" gibst du die im hinterlegtem
Array " PROGMEM lcd_rom_text" texte an.

In den meisten Fällen wo keine Variablen angegeben werden sind, stehen
im MAIN mehrere aufrufe von  lcd_write_var();  um mehrere Variablen
anzuzeigen.

Dann kommt ein Zeiger auf die Variable die angezeigt werden soll, die
anzahl der zeichen von Rechts und in welche Spalte im display sie
angezeigt werden sollte.

Danach die je nach tastendruck (up down OK) nächste neue aktuelle zeile
im struct "PROGMEM lcd_rom_ins_data" Null keine Änderung.

Dann ob die Variable verändert werden kann und den min und max Wert.

Die Variablen können mit Up und Down Tasten verändert werden und werden
mit OK gespeichert.

vieleicht kann jeman damit etwas anfangen..
thomas

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.