mikrocontroller.net

Forum: Compiler & IDEs LCD - Menu


Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andi (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jürgen (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein Rolf.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag ich doch...

Autor: Stefan (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan,

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

und dann zB

lcd_printf_P(pStr);

Autor: thomas t (Gast)
Datum:
Angehängte Dateien:

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

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.