mikrocontroller.net

Forum: Compiler & IDEs Menu mit 4 Tasten und 2 Zeilen Display


Autor: Ralf Nase (spargiraffe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bastel eine Modelfernsteuerung mit einem mega32.
Die meisten Sachen wie Displayanteuerung, ADC, Summensignalerzeugung 
waren dank des tollen Tutorials relativ schnell funktionsfähig. Jedoch 
sitze ich schon sehr Lange an dem Menu um die Parameter einzustellen und 
habe noch nicht sehr viele von den geplanten Menupunkten untergebracht.

Da habe ich mir gedacht, dass das mit dem Menü auf einem 2 Zeilen 
Display und 4 Tastern zum Einstellen doch bistimmt bei sehr vielen 
Projekten gebraucht wird. Gibt es da vieleicht elegante Lösungen um die 
Menustruktur und den Code übersichtlich zu halten?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf Nase schrieb:
> Gibt es da vieleicht elegante Lösungen um die
> Menustruktur und den Code übersichtlich zu halten?

Man macht sich vorher nen Ablaufplan.
Je ausführlicher den Plan ist, umso übersichtlicher wird der Code.

Schreib also erstmal alle Menüpunkte auf und welche Funktion welche 
Tasten im jeweiligen Punkt haben sollen.


Spaghetticodeprogrammierung ist der schlechteste Weg.


Peter

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal eine schöne Struktur pro Parameter mit:
Zeiger auf Text (Name)
Min-Wert
Max-Wert
Standard-Wert
Zeiger auf Text (Einheit)
Adresse (im Flash)

- Nun ein Array davon erzeugen.
- Eine Funktion, die vor und zurück durch die Parameter schalten kann.
- Eine Funktion, die den Wert des aktuellen Parameters ändern kann

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für einige der Parameter kann man sich dann auch noch eine Möglichkeit 
definieren (zb über einen Parametertyp und den Text für die Einheiten), 
wie man den schnöden Zahlenwert durch Texte ersetzt um so eine Auswahl 
per Text zu ermöglichen. "Leerlauftrimmung: vorne/hinten" ist nun mal 
eingänglicher als "Leerlauftrimmung: 0/1"

Bei genügend Parametern kann man sich dann darüber wieder eine Struktur 
legen, die mehrere derartige Parameter unter einem Oberbegriff 
zusammenfasst. Dann landet man bei hierarchischen Menüs mit Submenüs.

So richtig interessant wird es dann erst, wenn sich Menüpunkte 
gegenseitig beeinflussen. Im einfachsten Fall kann das zb eine 
Sichtbarkeitssteuerung sein. Die Einstellparameter für "Ausschlag 
oben/unten" eines Deltamischers werden erst dann angezeigt, wenn der 
Delta-Mischer eingeschaltet ist. Oder die Menüpunkte für alle 
Hubschraubermischer gibt es erst dann, wenn der Modelltyp auf 
Hubschrauber steht.


Wie genau stellst du dir die Benutzung der 4 Tasten vor? Welche Taste 
macht was?
In den meisten Fällen bevorzuge ich bei Menüs eine 3 Tasten Steuerung: 
Mit 2 Tasten wird durch die Menüpunkte navigiert (oder ein Wert 
vergrößert/verkleinert) und die 3. Taste ist die Taste für 'Übernahme'. 
3 Tasten geht gut, weil ich dann so einen Drehencoder mit integrierter 
Taste zur Benutzereingabe benutzen kann
http://www.alps.com/WebObjects/catalog.woa/E/HTML/...
Die sind leichter stabil in einem Gehäuse einzubauen als 3 getrennte 
Digitaster.


Das Problem mit einer 'Ein Menüsystem für alles' Lösung ist, dass dieses 
Menüsystem um universell einsetzbar zu sein, sehr mächtig und 
umfangreich sein muss. Und genau hier steckt das Problem: Sehr oft kann 
man sich diese Mächtigkeit (die sich in Code niederschlägt) einfach 
nicht leisten. Man hat den Speicher dafür nicht.

Wichtig ist aber im Vorfeld: Sich genau überlegen wie das Menüsystem 
funktionierten soll. Dazu gehört
* Das Bedienkonzept
  dazu gehört zb eine Systematik, welche Taste was macht.
  dazu gehört eine Systematik, wie Menüpunkte eventuell gruppiert
    werden
  dazu gehört eine Systematik, wie nicht numerische Werte ausgewählt
    werden
  dazu gehört eine genau Festlegung, welche Dinge am Display wo
    angezeigt werden

* Ein genauer Plan, wie die Menüpunkte logisch gruppiert werden

* Ein genauer Plan, wie zb in mehrstufigen Menühierarchien man von
  welchem Menü in welches andere Menü kommt und welche Menüpunkte
  man dort finden wird.

Autor: Marc R. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Problem einer Menüstruktur vor einiger Zeit mit einer Art 
binärem Baum gelöst. Dazu habe ich in meinem Code 2 Strukturen 
definiert: menuItems und den menuStrip.

MenuItems sind die Menüpunkte. Sie bestehen aus:
- einem Beschriftungstext
- einem Zeiger auf den menuStrip, den sie aufrufen (child)
- einem Funktionszeiger, der auf eine Funktion verweist, die die 
darstellung desjenigen Menüpunktes ausführt.

MenuStrips sind Untermenüs. Sie stellen je eine Liste von MenuItems dar. 
Außerdem kennt jedes Menü sein übergeordnetes Menü (root).

Mein Beispielcode baut eine Menüstruktur für einen Power-LED Controller 
auf, der mehrere Slaves mit PWM-Treibern steuern kann. In 
userInterface.c siehst du in ui_checkButtons(), wie die Funktionen im 
Modul menu verwendet werden. Zur Ansteuerung des LCDs habe ich die 
Bibliothek von Peter Fleury http://www.jump.to/fleury verwendet, 
allerdings mit einem 4 Zeilen Display. Zur Steuerung habe ich 4 Tasten 
verwendet: Hoch, runter, zurück, enter.

Autor: Ralf Nase (spargiraffe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten.

Die vier Taster sind bei mir für Oben, Unten Links und rechts.
Mit Oben/Unten kann man durch die Menupunkte blättern. Mit "Rechts" 
betrittman das jeweils ausgewählte Untermenu mit. Mit links geht es eine 
Menuebene zurück. Falls ein Menu direkt eine Variable verändern kann, 
wird der wert mit "Oben" größer und mit "unten" kleiner. "Rechts" hat 
für diesen Fall noch keine Funktion. Rechts könnte dann eventuell zum 
Umschalten zwischen Grob-(10 Schritte) und Feineinstellung (1 Schritt) 
verwendet werden.

Ich hatte mir erst die Menupunkte als Text in einem Editor mit 
Zeilennummerierung die geplanten Menupunkte aufgeschrieben und 
Untermenus jeweils eingerückt. Für bereits implementiere Menupunkte habe 
ich im Text Implementiert indem ich die Zeilennummer als "Menuschlüssel 
fest vergeben habe".
void menu() 
{
switch (menuaktuell) 
  {
    case 3 : //für jeden menupunkt gibt es ein "menuaktuell case"
      //lcd_clear();
      set_cursor(0,1);
      lcd_string("M1 Einstellungen   ");
      if (menuaufgabe != 0) {  //wenn eine taste gedrückt wurde...
        if (menuaufgabe == 1) {
          menuaktuell = 2; // eins nach oben
          
        }
        if (menuaufgabe == 2) {
          menuaktuell = 4; // zu menu 4 springen
          
        }
        if (menuaufgabe == 3) {
          menuaktuell = 260; // bleibt erstmal 0
          
        }
        if (menuaufgabe == 4) {
          menuaktuell = 3; // gibt keine übergeordete menuebene mehr
          
        }
        menuaufgabe = 0; 
      }
      
      break;

[...]

bei über 250 geplanten menupunkten wird das leider etwas unübersichtlich 
weil der code so extrem lang wird.
Marc R., danke für das Beispiel.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf Nase schrieb:

> bei über 250 geplanten menupunkten wird das leider etwas unübersichtlich
> weil der code so extrem lang wird.

Du musst deine Menüs komplett und rein nur durch die Datenstruktur 
abbilden. Dazu noch eine universelle Menüfunktion, die mit dieser 
Menübeschreibung in Datenform umgehen kann

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.