LCD - Menu

Gast #239202
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
Angehängte Dateien:
Gast #239204
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 );

************************
Gast #239205
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.
Gast #239206
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?
Gast #239209
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.
Gast #239210
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.
Gast #239214
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
Gast #239217
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
Angehängte Dateien:

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