www.mikrocontroller.net

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


Autor: Mats Marcus (elektrofreak)
Datum:

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

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du ein kleines beispiel dafür? (For-Schleife?)

Autor: Dennis (Gast)
Datum:

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

Autor: Dennis (Gast)
Datum:

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

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau willst du denn rekursiv lösen?

Autor: Mats Marcus (elektrofreak)
Datum:

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht hilft das:

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


d.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>vielleicht hilft das:
>y[a][b] entspricht *(*(y+a)+b)

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht denn dort ein schild: bascom oder c!?

d.

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zudem der Hinweis...

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

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider bin ich "Out of SRAM"

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

wahrscheinlich verbraucht das auch weniger RAM, aber am meisten Speicher

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[OT]
>Ideen ja auch >>>generell<<< Formulieren.

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

[/OT]

Autor: Dennis (Gast)
Datum:

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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ein wasserturm übrigens auch.


Kornsilos, Fäkalientanks auch

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Mats Marcus (elektrofreak)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: jack (Gast)
Datum:

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

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.