Hallo liebes Forum, ich bin nun schon seit Wochen mit einer einfachen Menüstruktur beschäftigt, die folgende Features haben soll: * Im Flash niedergelegt * Markieren des aktuell selektierten Eintrags mit Sternchen o.ä. * Automatisches Scrollen * Bei Anwahl eines Eintrags wahlweise ein Submenü oder eine Funktion * 3-Tasten-kompatibel (d.h. Hoch, Runter, Enter) * Passend für mein Display (16x3) * C Alle Kriterien werden im Grunde (inkl. leichter Anpassungen) vom Tinymenu, geschrieben von Tymm Twillman (http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=1183), erfüllt. Nur werden dort die Strings im RAM statt im ROM gespeichert. Stundenlang habe ich versucht das Ganze von Flash umzustellen, mit dem Resultat, dass nichts mehr ging. Schlussendlich habe ich voller Frust alle Files wieder verworfen. Ich komme einfach ncht mit den ganzen Pointern, Arrays und Strukturen zurecht. Weitere Recherche im Forum und Netz brachte da auch nichts. Nun bin ich im Grunde auf der Suche nach einer Komplettlösung (sowas müsste es doch geben...) oder jemandem, der sich die Zeit nimmt das Tinymenu mal anzusehen und beurteilen würde, ob sich ein erneuter Anlauf des Umschreibens lohnen würde und wo genau man ansetzen müsste. Ich hoffe jemand kann mir helfen oder sogar mir sein eigenes funktionierendes System zur Verfügung stellen. Danke. Frohe Weihnachten wünscht Sven
Ich habe mir das Archiv angesehen. Leider ist keine Doku dabei. Und es scheinen Quellen zu fehlen, jedenfalls kompiliert tinymenu_test.c nicht soweit, dass man mit einer Simulation des Istzustandes starten kann bevor man zum Wunschzustand umbaut. Was ich sehe: In dem Tinymenu kann man die Strings (entry.name) im Flash ablegen. Andere Mitglieder der Menüstruktur werden im Programmablauf verändert, um die aktuelle Position im Menü nachzuführen. Man kann also in dieser Library nicht das komplette Menü im FLASH halten. Die fehlenden Sourcen habe ich durch Dummys ersetzt und dann mit AVR Studio 4.121 SP2/WiNAVR 20071222 für den Modell-AVR Atmega32 ohne Optimierung kompiliert. Die Simulation geht zunächst schief, weil in tinymenu_test.c die Menüstrukturen falsch aufgebaut sind (zig Nullpointer). Nachdem das korrigiert wurde, sehe ich eine vernünftig aussehende Arbeitsweise bei meinem Breakpoint in der Dummy/Debugfunktion lcd_putchar(). Dann das Umschreiben auf STRINGS_IN_FLASH. Diese Codeteile lassen sich mit diesem #define in tinymenu.h an- oder abschalten. Dort gibt es auch noch ein weiteres #define zu Debugzwecken. Im Prinzip bin ich streng nach der Anleitung in AVR-GCC-Tutorial vorgegangen. Am besten sieht man die Änderungen beim Durchtracen im Einzelschrittmodus. An den wichtigen Stellen habe ich lokale Puffer eingerichtet, die die gerade aus dem Flash kommenden Daten aufnehmen und kontrollierbar machen. Meine Version von AVR Studio schafft es nicht im Watch-Fenster die Daten im Flash anzuzeigen, wenn man per Pointer darauf zugreifen will. Leider ist es mir auch nicht gelungen, die Daten byteweise aus dem Flash zu holen (per pgm_read_byte()). Es interessiert mich wieso. Ich bin dann auf strncpy_P() bzw. strcpy_P() ausgewichen. Der dafür benötigte Puffer ist eine Menüzeile gross aber lokal auf dem Stack, d.h. kurzlebig. Insgesamt ist der Platzersparnis im RAM (ohne den lokalen Puffer gerechnet): 9 x 16 Bytes für die Zeichen in den Strings - 9 x 2 Bytes für die Pointer im RAM auf die Strings im FLASH = 126 Bytes. Die Datei im Anhang ist der komplette AVR Studio Projektordner von mir. Die Pfade in der Projektdatei sind auf e:\elektronik\sb_avr\tinymenu_test\... bezogen. Achtung: Wegen der Dummyfunktionen darauf achten, dass keine eigenen Dateien überschrieben werden. Eigenen Projektordner anlegen oder Original backuppen! ADD: In der Artikelsammlung ist ein weiteres Menüsystem: Tinykon. Ich habe selbst aber keine Erfahrung damit.
Hallo Stefan, ersteinmal vielen Dank dafür, dass du dich so ausgiebig mit meinem Anliegen befasst hast. Ich werde mir deine Ergebnisse morgen in Ruhe mal anschauen. Auch vielen Dank für den Link zu Tinykon, kannte ich noch gar nicht. mfG, Sven
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.