Forum: Compiler & IDEs Mal wieder: Menüsystem


von Sven S. (schwerminator)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Sven S. (schwerminator)


Lesenswert?

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
Noch kein Account? Hier anmelden.