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
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.
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 ); ************************
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.
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?
> 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?
"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.
> "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.
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.
...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
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
@Stefan, PGM_P pStr = pgm_read_word( &menue[0].text ); und dann zB lcd_printf_P(pStr);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.