Forum: Mikrocontroller und Digitale Elektronik LCD-Menü rekursiv erstellen?


von Mats M. (elektrofreak)


Lesenswert?

Hi

ich möchte gerne auf einem LCD-Display ein Menü darstellen. Beispiel

1:
 1.1:
  1.1.1:
   1.1.1.1:
    1.1.1.1.1
    1.1.1.1.2
    1.1.1.1.3
    1.1.1.1.4
    1.1.1.1.5
   1.1.1.2:
    1.1.1.2.1
    1.1.1.2.2
    1.1.1.2.3
    1.1.1.2.4
    1.1.1.2.5
   1.1.1.3:
    1.1.1.3.1
    1.1.1.3.2
    1.1.1.3.3
    1.1.1.3.4
    1.1.1.3.5
.............
    5.5.5.5.5


Ich wollte es erst nicht rekursiv machen, aber dies schluckt dermaßen 
viel Speicher, dass ich wohl nicht damit auskomme.

Um zu hinterlegen, in welchem Menüpunkt ich bin, habe ich folgende 
Variablen deklariert:

Dim Menue(5) As Integer    ' <- bsp.: Menue(1)=1, Menue(2)=3, Menue(3)=5
Dim Aktmenue As Integer    ' <- Aktuelles untermenü (=> bis 
Menue(aktmenue), bsp.: 3

also ist man in diesem Beispiel im Menue 1.3.5


Wie kann ich das Rekursiv lösen?
Gibt es schon ein Beispielprojekt im Internet?



Vielen Dank für eure Lösungen.


PS: Ich benutze Bascon, jedoch kann man die Ideen ja auch generell 
Formulieren.

von Rahul, der Trollige (Gast)


Lesenswert?

Wie kommst du auf rekursiv?
Sowas kostet noch mehr Speicher. Und die meisten Rekursionen kann man 
auch iterativ darstellen.

von Mats M. (elektrofreak)


Lesenswert?

hast du ein kleines beispiel dafür? (For-Schleife?)

von Dennis (Gast)


Lesenswert?

...leider kann ich dir den code nicht stellen, aber:

ich habe auch schon oft über die problematik nachgedacht...

natürlich benötigst du mehr programmspeicher, als wenn du es (rekursiv 
löst)

von Dennis (Gast)


Lesenswert?

hups...

aber rekursuiv ist vielleicht auch nicht ganideal ...
zudem benötigst du für unterschiedlich lange menüs immer wieder ein 
anderes abbruchkriterium und du willst sicher auch namen vergeben..

rekursiv läuft zudem auf dem stack und ist damit auch beschränkt... und 
der code ist meistens recht unübersichtlich...

warum nicht ein schleife, eine funktion - soweit so gut, dann aber ein 
array mit menünamen und ein parameter für die menünummer, der 
gleichzeitig für das array als index funktioniert, dann vielleicht noch 
ein array mit den maximalwerten  oder so..... nur so als 
gedankenansatz...


damit sparst du vielleicht etwas programmspeicher...

d.

von dieter (Gast)


Lesenswert?

Was genau willst du denn rekursiv lösen?

von Mats M. (elektrofreak)


Lesenswert?

Versuche ich auch grade nur ich hab das Problem, dass ich keine 
Mehrdemensionale Arrays deklarieren kann... 
Beitrag "Mehrdemensionales Array in Bascom"

von Dennis (Gast)


Lesenswert?

vielleicht hilft das:

y[a][b] entspricht *(*(y+a)+b)


d.

von Rahul, der Trollige (Gast)


Lesenswert?

>vielleicht hilft das:
>y[a][b] entspricht *(*(y+a)+b)

ja, genau...Einem Bascom-"Programmierer" mit C-Syntax kommen...

von Dennis (Gast)


Lesenswert?

steht denn dort ein schild: bascom oder c!?

d.

ps.: deswegen ja auch vielleicht, irgentwie verstehe ich deinen einwand 
jetzt nicht!?

von Dennis (Gast)


Lesenswert?

zudem der Hinweis...

>PS: Ich benutze Bascon, jedoch kann man die Ideen ja auch >>>generell<<<
Formulieren.

von Mats M. (elektrofreak)


Lesenswert?

Leider bin ich "Out of SRAM"

bleibt da noch normal ohne rekursiv..... :-(

wahrscheinlich verbraucht das auch weniger RAM, aber am meisten Speicher

von Rahul, der Trollige (Gast)


Lesenswert?

[OT]
>Ideen ja auch >>>generell<<< Formulieren.

C-Syntax ist (für mich) keine "generelle Formulierung"...

[/OT]

von Dennis (Gast)


Lesenswert?

...ich schnall deine probleme ehrlich gesagt nicht... zudem solltest du 
dich etwas klarer ausdrücken!

auch register im chip sind speicher, und RAM ist übrigens auch eine art 
von speicher. ein wasserturm übrigens auch.

d.

von Rahul, der Trollige (Gast)


Lesenswert?

>ein wasserturm übrigens auch.


Kornsilos, Fäkalientanks auch

von Hannes L. (hannes)


Lesenswert?

Wozu soll das Menü dienen?
Wieviele (per Menü veränderbare) Parameter musst Du vorhalten?
Wie soll das Menü bedient werden?
Text-LCD oder Grafik?

Ich vermute nämlich, dass Du das Pferd von hinten aufzäumst und mehr 
Speicher verbrauchst als erforderlich ist.

...

von Rahul, der Trollige (Gast)


Lesenswert?

Du willst wirklich ein Menu mit 3125 Einträgen aufbauen?
Den Benutzer will ich sehen, der das bedienen will...
Vor allem: Was willst dann mit den entsprechenden Menu-Einträgen 
steuern?
Anzeigen mag ja noch Pippifax sein, aber 3125 Funktionen schreiben, wird 
interessant (man kann es vielleicht noch dadurch kürzen, dass die letzte 
Ziffer ein Parameter für die jeweilige Funktion ist, aber soll es das 
wirklich sein?).

Nur so als Ergänzung....


Mal dir am besten mal dein Menu auf (Baumstruktur), damit du die reale 
Grösse feststellen kannst. Einfach nur zu schreiben, dass man eine 
riesiges Menu haben will, ist unpraktisch. Meist ist eine praxisnahe 
Lösung erweiterbar...

von Hannes L. (hannes)


Lesenswert?

@Mats Marcus:

Wenn wir Dir helfen sollen, solltest Du mal langsam meine Fragen 
beantworten. Denn es gibt mehrere Lösungen. Um die richtige für Deinen 
Fall zu finden, müsste man eben wissen, was per Menü gemacht werden 
soll.

Das Anzeigen der Menütexte ist dabei nur die halbe Miete, es kommt auch 
darauf an, wie Du im Menü navigieren willst und was die einzelnen 
Menüpunkte tun sollen (Zusammenfassung gleichartiger Aufgaben an 
unterschiedlichen Objekten). Hier nochmal meine Fragen:

> Wozu soll das Menü dienen?
> Wieviele (per Menü veränderbare) Parameter musst Du vorhalten?
> Wie soll das Menü bedient werden?
> Text-LCD (wie groß?) oder Grafik?

Dass Du hier etwas auf die Schippe genommen wirst hat nur damit zu tun, 
dass Deine Frage nicht konkret genug ist. Nimm's nicht persönlich.

...

von Mats M. (elektrofreak)


Lesenswert?

also:

Das Menü soll zur Steuerung einer Master-Slave-Steckdose mit div. 
Eingängen wie 3xZeitschaltuhr, 2xMaster, Eine Routine zur Kontrolle 
einer externen LED etc. dienen.

Das Menü soll durch 3 Taster bedient werden:

Up
Down
OK

Durch up und down soll man im menü nach oben oder unten scrollen können, 
duchr OK ein Menüpunkt "vertiefen", bei Parameteranzeigen diese auch 
verändern.

Das LCD-Display ist leider nur 2*16 groß, daher auch wenig "Platz".

Die Grüße des Menüs soll (nach größerem probieren) ein Hauptmenü und zu 
jedem Menüpunkt max. 2 Untermenüpunkte (ein untermenü mit einem weiteren 
Untermenü) haben


Hat das geholfen? :P

von Hannes L. (hannes)


Lesenswert?

Mats Marcus wrote u.a.:

> Das Menü soll zur Steuerung einer Master-Slave-Steckdose mit div.
> Eingängen wie 3xZeitschaltuhr, 2xMaster, Eine Routine zur Kontrolle
> einer externen LED etc. dienen.
>
> Das Menü soll durch 3 Taster bedient werden:
>
> Up
> Down
> OK

Bei kleinen (zweizeiligen) LCDs verwende ich gern 4 Taster:
- Nächster Menüpunkt
- Plus (Parameter erhöhen)
- Minus (Parameter vermindern)
- Save (Parameter dauerhaft speichern)

Angezeigt wird dann in der oberen Zeile der Menütext, in der unteren der 
Wert.

> Durch up und down soll man im menü nach oben oder unten scrollen können,
> duchr OK ein Menüpunkt "vertiefen", bei Parameteranzeigen diese auch
> verändern.

Da würde mir der "zurück"-Taster fehlen. Da die veränderbaren Parameter 
ja sinnvollerweise im EEPROM gespeichert werden, das EEP aber einer 
gewissen Abnutzung unterliegt, würde ich unnötige Schreibzugriffe 
vermeiden, also Parameteränderung und Speichern konsequent trennen. Dein 
Vorschlag würde ja bei jeder Parameteränderung sofort speichern.

>
> Das LCD-Display ist leider nur 2*16 groß, daher auch wenig "Platz".

Das ist ok. Eine Zeile Menütext, die andere Zeile Parameterwert und 
Einheit.

>
> Die Grüße des Menüs soll (nach größerem probieren) ein Hauptmenü und zu
> jedem Menüpunkt max. 2 Untermenüpunkte (ein untermenü mit einem weiteren
> Untermenü) haben

Du denkst an mehrdimensionale Matrix. Das kannst Du auf Rechnern machen, 
die üppig mit Ressourcen ausgestattet sind. Beim AVR ist 
Variablenspeicher aber knapp.

Es wird Dir also nichts anderes übrig bleiben, als die Menüpunkte (die 
Liste der Menütexte) linear anzuordnen. Dazu solltest Du erstmal einen 
genauen Plan der benötigten Menüpunkte machen. Wenn dieser feststeht, 
dann kannst Du die Navigationsroutine so schreiben, dass in der 
(eigentlich nicht vorhandenen) Hauptebene in größeren Schritten (anhand 
einer Liste) geblättert wird.

Bei größeren LCDs (z.B. 8x24 Zeichen) haben meine 4 Taster meist 
unterschiedliche Bedeutung, die durch den Menütext (Fußzeile) im Dialog 
angezeigt werden. Beispiele dazu findest Du hier:
http://www.hanneslux.de/avr/stopuhr/index.html
http://www.hanneslux.de/avr/zuenduhr/index.html

>
>
> Hat das geholfen? :P

Liegt hier ein Missverständnis vor? Du musst mir nicht helfen. Ich 
vermutete dass Du um Hilfe ersucht hast. Oder irre ich mich da jetzt?

...

von jack (Gast)


Lesenswert?

>Hat das geholfen? :P

Es hätte vor allem geholfen, wenn Du genau diesen Text als Anfrage
genommen hättest, d.h. wenn Du Dir erst über Dein Vorhaben klar
geworden wärst und dann gefragt hättest.

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.