Forum: Mikrocontroller und Digitale Elektronik BASCOM: 4-Tasten-Bedienung auf mehrere Ebenen


von micha b (Gast)


Lesenswert?

Für ein Projekt mit meinem ATMega 128 hab ich die klassischen vier
Taster angeschlossen:
- RECHTS
- LINKS
- HOCH
- RUNTER

Funktionswunsch:
Wenn ich eine Auswahl mit den Tasten treffen möchte, starte ich
automatisch in Ebene1, d.h. ich kann von Pos. 1 bis z.B. 8 mit RECHTS
oder LINKS auswählen.
Wenn ich dann auf einem "Thema" stehe, kann ich mit RUNTER in die
nächste Benutzerebene springen, und dort mit RECHTS / LINKS weitere,
genauer spezifizierte Funktionen (z.B. Optionen) ausführen, usw.
Insgesamt stehen 3-4 Ebenen zur Verfügung.

Was mir fehlt ist das Prinzip, WIE ich das Ganze proggen kann, damit
ich nachher über eine Kombination der einzelnen Positionen meiner
Auswahl das entspr. Unterprogramm auswählen kann.
Z.B. Ebene1 = 3. Thema, Unterthema dann Nummer 6 und Option dann 8 =
ergibt Funktion 368.
Allerdings möchte ich auch, das wenn ich das nächste Mal auf das 2.
Thema gehe, das was ich zuvor mit Unterthemen etc eingestellt hatte
wieder angezeigt wird.

Any Ideas ?


Danke vorab,

Micha

von Hannes L. (hannes)


Lesenswert?

Hi...

Ich bin gerade dabei, Ähnliches in ASM zu programmieren. Dabei halte
ich die Variable 'mp' (Menüpunkt) in einem Register. Für jeden
Menüpunkt gibt es eine kleine Routine, wobei die Auswahl über eine
Sprungtabelle mit indirektem Sprung (über Z-Pointer) erfolgt. Diese
kleinen Routinen ändern je nach Tastendruck die Parameter bzw. den
Menüpunkt. Sie setzen auch die Position und Anzahl der Zeichen, die im
Dialog blinken sollen. Die gesamte Menüroutine wird nur nach einem von
der Entprellroutine (frei nach PeDa) erkannen Tastendruck aufgerufen.
Dabei wird nicht auf Drücken der Tasten getriggert, sondern auf
Loslassen. Es wird auch zwischen kurzem und langem Tastendruck
unterschieden.

Die Textausgabe auf LCD (4x20) erfolgt in einer separaten Routine, die
alle volle Sekunde aufgerufen wird. Der betreffende Text wird anhand
der Menüpunktnummer ausgewählt (Ausgaberoutine mit indizierter
Adressierung von Strings).

Jeweils zur halben Sekunde (also im Gegentakt zur vollen Sekunde) wird
eine Routine aufgerufen, die den Bereich des LCDs mit Leerzeichen
überschreibt, der von der Menüpunktroutine definiert wurde. Dies
täuscht ein Blinken des gerade änderbaren Parameters vor, was einen
eindeutigen Dialog ermöglicht.

Die gesamte Steuerung erfolgt durch Timer-Interrupt. Das Programm läuft
auf dem Mega32. Für den Programmcode würde bisher (ist noch nicht
fertig) ein Mega8535 reichen, aber ich brauchte mehr EEPROM, deshalb
der Mega32.

Neben dem LCD und den klassischen 4 Tasten sind über SPI noch 8
Schieberegister für weitere 32 Taster und 32 Relais angeschlossen. Auch
diese Taster werden kugelsicher entprellt, wobei für Drücken und
Loslassen separate Flags zur Verfügung gestellt werden und beim
Loslassen auch noch zwischen kurzem und langem Tastendruck
unterschieden wird.

Die LCD-Ausgabe erfolgt im Timer-Interrupt über einen Ringbuffer von
256 Bytes, der auch Steuerzeichen für Ausgabeposition und Umschaltung
auf UART enthält. Somit wird für die LCD-Ausgabe keinerlei Wartezeit
vergeudet. Da die Ausgabe auf UART umgeleitet werden kann, können die
Routinen zur Umwandlung von Zahlen in ASCII sowie zur Ausgabe von
Strings für LCD und UART genutzt werden. Man setzt nur statt der
Locate-Position das UART-ON-Steuerzeichen, und schon wird der folgende
Text bis zum nächsten Locate-Befehl über UART an PC gesendet.

Das ist aber in ASM. In BASCOM hätte ich Probleme, das zu
realisieren...

...

von Steffen (DB1Ulm (Gast)


Lesenswert?

Es gibt irgendwo ein Beispiel fpr ein solches Menu, ( in Bascom) ich
weiß nur nicht gerade, ob in der Codesammlung, oder bei MCS Electronic


Grüsse Steffen

von micha b (Gast)


Lesenswert?

>Es gibt irgendwo ein Beispiel fpr ein solches Menu, ( in Bascom) ich
>weiß nur nicht gerade, ob in der Codesammlung, oder bei MCS
>Electronic


>Grüsse Steffen

Weißt du Genaueres? Hab glaub ich alles mit Betreff "Menue" gelesen,
allerdings nichts in BASCOM gefunden...

Aber vielleicht such ich ja falsch... :-/

von Stevko (Gast)


Lesenswert?

@HanneS.
Auch ich habe ein Menu in ASM entwickelt wobei Flexibilität das
Hauptkriterium war. Das Menu sollte nicht nur in eine Anwendung
implementiert werden sondern jederzeit abänderbar in einer anderen
Anwendung funktionieren.
Ist der Menüaufbau bekannt(auf dem Papier) sollte innerhalb von 20min
das komplette Menu in der Anwendung sein, natürlich ohne viel
Schreibarbeit. Nach vielen schlaflosen Nächten und Unmengen von Alkohol
habe ich eine akzeptable Lösung gefunden. Natürlich braucht man da ein
Helferlein, hier Excel, welches die Tipparbeit erledigt.
Habe im Anhang mal ein älteres Muster.
Die Menuform ist eine Matrix. Hier im Beispiel aus 3Spalten und 10
Zeilen. Aber das ist variabel also es können auch 10Spalten und 40
Zeilen sein, ist dann natürlich völlig unübersichtlich.
Oben Links steht der erste Menupunkt:"Tele-Contr". Dann kommt die
Länge des Eintrages, hier 10Char berechnet von Ecxel. Die Länge der
Einträge kann vorgegeben werden und Execl kürzt dann oder füllt
automatisch mit Leerzeichen auf.
Als nächtes kommt kommt die Sprungrichtung, sprich wohin kann ich mich
mit dem Tasten:

           Auf
   Links  Enter  Rechts
           Ab

bewegen. In diesem Fall nach Rechts zu "Controll" oder nach "Unten"
zu "Datenbank". 1=Sprung möglich / 0=Sprung gesperrt
Nächtes Feld ist der Hex-Wert des Tastenfeldes. Das Menuprogramm
reagiert nur wenn eine der Beiden Tasten gedrückt wird. Bei Menupunkten
wo auch Enter möglich ist, wird nach Druck auf die Entertaste über den
Z-Pointer eine rjmp-Tabelle angesprungen in der dann das Unterprogramm
aufgerufen wird. Nach Beendigung des Unterprogrammes wird wieder
automatisch das Menu angezeigt. Es muß also nichts im Unterprogramm
stehen was auf das Menu verweist.
Natürlich kann das Menu auch mit einem bestimmten Menupunkt aufgerufen
werden. Die "$$$$$$$$$$$" sind Leerzeilen welche nicht angesprungen
werden. Drücke ich z.B bei Setup nach unten kommen nicht die Zeilen mit
"§§§§§§" sondern gleich "Utils".
Habe ich das Menu in Excel eingegeben wird auf das Button "Schreibe in
Datei" gedrückt und den Rest hat Excel zu erledigen. Es generiert
automatisch den ASM-Text sowie die dazugehörigen Parameter.
Wenn es bei Dir das Laufwerk C: gibt steht dann dort eine
"TAL_Menu.txt". Das ist der ASM-Text. Gibt es bei Dir noch das
Verzeichnis "C:\Windows" wird gleichzeitig das Notepad geöffnet und
Du kannst den ASM-Text bequem in Deine Anwendung kopieren.

Funktioniert eigentlich sehr gut und in 20min habe ich das Menu
komplett in der Anwendung.

Gruß
  Stevko

von Stevko (Gast)


Angehängte Dateien:

Lesenswert?

..Mist wie immer den Anhang vergessen

von Hannes L. (hannes)


Lesenswert?

Hallo Stevko...

Open-Office scheint damit nicht zurecht zu kommen.
M$-Excel benutze ich nicht. Ist mir zu teuer, und geklaute Software
nutze ich aus Prinzip nicht.

Ich kann es also nicht nachvollziehen...

Trotzdem danke...

...

von Wolfram (Gast)


Lesenswert?

Hi Micha,

Deinen Ansatz finde ich cool. Leider kann ichs nicht probieren, da Du
wohl eine Funktion DezinHex (?) verwendest?

Ansonsten würde ich das gerne mal an meiner Applikation ausprobieren.

Danke und Gruß
Wolfram

von Stevko (Gast)


Lesenswert?

@Wolfram:

Aus der Excel-Hilfe:

DEZINHEX:
Wandelt eine dezimale Zahl in eine hexadezimale Zahl um.
Ist diese Funktion nicht verfügbar, müssen Sie das Setup-Programm
ausführen, um die Analyse-Funktionen zu installieren. Nachdem Sie die
Analyse-Funktionen installiert haben, müssen Sie diese mit Hilfe des
Befehls Add-In-Manager im Menü Extras aktivieren.

Gruß
  Stevko

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Micha

Ich mache das so daß ich eine Variable definiere in der jedes Bit einer
gedrückten oder nicht gedrückten Taste entspricht (0 oder 1). Zusätzlich
in Deinem Fall kommt noch für jede Ebene ein bit dazu. In Deinem Fall
also 4+3 Bits.

Mit der Bascom Tastenabfrage springe ich in eine Routine in der jeweils
geprüft wird welche Taste gerade gedrückt wurde und entsprechend werden
die Bits gesetzt bzw andere gelöscht. Der Zahlenwert der Variable sagt
Dir dann welche Taste in welcher Ebene gedrückt wurde. Diesen
Zahlenwert kannst an anderen Stellen des Programms verwenden denn er
enthält den letzten Tastenbefehl und die gewuenschte Ebene.

Gruß

Michael

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.