Anzeige:

Menü für LCD Realisieren

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Menü für LCD Realisieren

Von modellfreund am 17.10.2010 16:13

Hallo,

ich will mein neues µC-Projekt mit einem Menü ausstatten.

Es geht um folgendes:
Aufgrund des letzten Hochwassers ist der Grundwasserspiegel bei uns so gestiegen, dass wir im Keller Wasser hatten. Wir haben eine eine kleine Grube (Tiefe: 30cm), wo wir dann eine Tauchpumpe reinstellen können. Da diese Grube abgedeckt ist, waren wir völlig überrascht, als dann das Wasser im Keller stand.

Also will ich eine Steuerung bauen, die überwacht, ob Wasser in der Grube ist. Außerdem soll ein "Sensor" in ca. 5cm über dem Kellerboden installiert werden wodurch die Pumpe eingeschaltet wird.

Ich habe in letzter Zeit schon mal ein LCD 16*2 an einen Atmega8 angeschlossen und zum laufen gebracht.

Nun will ich als erstes da Menü realisieren was wie folgt aussehen soll:
- Wasserstand (10cm; 20cm; 30cm; 35cm)
- Batteriezustand (0-100%)
- Pumpe (Ein/Aus) wird die Pumpe Manuel geschaltet]
- Alarm (Ein/Aus) erreichen der 10cm-Marke soll ein Alarm ausgelöst werden]
- Automatikbetrieb (Ein/Aus) Automatikbetrieb soll die Pumpe bei erreichen von 35cm automatisch einschalten und bei erreichen von 10cm wieder ausschalten.

Was Menü soll mit 2 Tastern bedient werden (Taster 1: nächster Menü-Punkt; Taster 2: Auswahl/Änderung)

Ich hoffe Ihr könnte mir helfen.

LG Felix

Von Sam am 17.10.2010 17:49

Naja, so ein großes Problem stellt das nicht dar.

Du speicherst die Nummer des aktuellen Menüpunktes (1-5) in einer Variablen. Mit einer einem Taster springst du in eine SUB, in der diese Variable erhöht und das Display dementsprechen neu geschrieben wird (SELECT CASE).
Mit dem zeiten Taster springst du in eine zweite SUB in der per SELECT CASE geprüft wird in welchem Menüpunkt du bist und die entsprechende Variable umgeschrieben.

MfG Sam

Von modellfreund am 17.10.2010 18:01

Kannst Du da mal bitte ein kurzes Programmbeispiel posten.

LG Felix

Von Sam am 17.10.2010 22:02

Hier mal ein kleines prinzipielles Beispiel ohne LCD und viel Ordnung:

Code:
Dim Menuepunkt As Byte
Dim Wasserstand As Byte
Dim Batterie
Dim Pumpe As Bit Bit
Dim Alarm As Bit
Dim Automatik As Bit

Menuepunkt = 1
Wasserstand = 0
Pumpe = 0
Alarm = 0
Automatik = 0


On Taster1 Menuepunkt
On Taster2 Umstellen


Do
Loop

End


Menuepunkt:
   inc menuepunkt
   If Menupunkt > 5 Then Menuepunkt = 1
   Select Case Menuepunkt
      Case 1
         Cls
         Locate 1 , 1
         Lcd "Wasserstand: "
         Lcd Wasserstand

      Case 2
         ...
      Case 3
         ...
      Case 4
         ...
      Case 5
         ...
   End Select
Return


Umstellen:
   Select Case Menupunkt
      Case 3
         inc pumpe
      Case 4
         inc alarm
      Case 5
         inc automatik
   End Select
Return

Von modellfreund am 18.10.2010 18:30

Vielen Dank für deinen Beitrag. Nur so richtig anfangen kann ich damit nicht. Rolling Eyes Ich bekomme das Programm nicht zum laufen.

LG Felix

Von Sam am 18.10.2010 19:29

Das war auch nur ein Beispiel das so natürlich nicht lauffähig ist.

Wenn du mir präzise Fragen stellst kann ich sie auch beantworten.

Die andere Möglichkeit wäre, dass du mir den Schaltplan gibst und ich dir das Programm schreibe. Dann hätte ich aber was gut bei dir.

MfG Sam

Von modellfreund am 18.10.2010 20:17

Hallo,

Zitat:
Die andere Möglichkeit wäre, dass du mir den Schaltplan gibst und ich dir das Programm schreibe.
Das ist sehr nett von Dir, aber ich will eigentlich versuchen es mal selber hin zu bekommen, sonst lerne ich wieder nichts dabei.

Ich versuche jetzt mal Dein Code zu analysieren und Fragen aufzugreifen:

Code:
Dim Menuepunkt As Byte
Dim Wasserstand As Byte
Dim Batterie
Dim Pumpe As Bit
Dim Alarm As Bit
Dim Automatik As Bit

Wird "Batterie" als "Word" deklariert? Theoretisch müsste aber "Byte" auch reichen oder, wenn ich 0 bis 100% Anzeigen lassen will?

Code:
Menuepunkt = 1
Wasserstand = 0
Pumpe = 0
Alarm = 0
Automatik = 0

Code:
On Taster1 Menuepunkt
On Taster2 Umstellen

Hiermit kann ich ehrlich gesagt nicht viel Anfangen.

Code:
Menuepunkt:
   inc menuepunkt
   If Menupunkt > 5 Then Menuepunkt = 1
   Select Case Menuepunkt
      Case 1
         Cls
         Locate 1 , 1
         Lcd "Wasserstand: "
         Lcd Wasserstand

      Case 2
         ...
      Case 3
         ...
      Case 4
         ...
      Case 5
         ...
   End Select
Return

Die Funktion des Blocks ist klar. Was macht der Befehl "Inc" und "select case"?

Code:
Umstellen:
   Select Case Menupunkt
      Case 3
         inc pumpe
      Case 4
         inc alarm
      Case 5
         inc automatik
   End Select
Return

Hier soll sicherlich der Status des Menüpunkts geändert werden, aber wie sicht das genau aus? So?
Code:
 Select Case Menuepunkt
      Case 3
         Inc Pumpe
         If Pumpe > 2 Then Pumpe = 1
      Case 4
         Inc Alarm
         If Alarm > 2 Then Alarm = 1
      Case 5
         Inc Automatik
         If Alarm > 2 Then Alarm = 1
   End Select


Ich will ja erstmal nur, dass das Menü auf dem LCD angezeigt wird und ich über die Taster den Status ändern kann.

LG Felix

Von Sam am 18.10.2010 20:30

Zitat:
Hallo,

Zitat:
Die andere Möglichkeit wäre, dass du mir den Schaltplan gibst und ich dir das Programm schreibe.
Das ist sehr nett von Dir, aber ich will eigentlich versuchen es mal selber hin zu bekommen, sonst lerne ich wieder nichts dabei.


Gut, das ist mir sowieso recht.


Zitat:
Code:
Dim Menuepunkt As Byte
Dim Wasserstand As Byte
Dim Batterie
Dim Pumpe As Bit
Dim Alarm As Bit
Dim Automatik As Bit

Wird "Batterie" als "Word" deklariert? Theoretisch müsste aber "Byte" auch reichen oder, wenn ich 0 bis 100% Anzeigen lassen will?


Entschuldigung, da habe ich den Datentyp vergessen. Den kannst du wählen wie du willst. Wenn du % anzeigen willst, dann genügt natürlich "Byte".

Zitat:
Code:
On Taster1 Menuepunkt
On Taster2 Umstellen

Hiermit kann ich ehrlich gesagt nicht viel Anfangen.


Mit "Taster1" und "Taster2" wollte ich die externen Interrupts beschreiben. Ich kenne deinen Aufbau schließlich nicht.

Zitat:
Code:
Menuepunkt:
   inc menuepunkt
   If Menupunkt > 5 Then Menuepunkt = 1
   Select Case Menuepunkt
      Case 1
         Cls
         Locate 1 , 1
         Lcd "Wasserstand: "
         Lcd Wasserstand

      Case 2
         ...
      Case 3
         ...
      Case 4
         ...
      Case 5
         ...
   End Select
Return

Die Funktion des Blocks ist klar. Was macht der Befehl "Inc" und "select case"?


Der Befehl "INC" erhöht die nachfolgende Variable um 1.
Die SLECT-CASE-Funktion liest eine Variable aus (hier: Menuepunkt) und führt je nach Wert Code aus ("Case 1", wenn Menuepunkt = 1 ...).


Zitat:
Code:
Umstellen:
   Select Case Menupunkt
      Case 3
         inc pumpe
      Case 4
         inc alarm
      Case 5
         inc automatik
   End Select
Return

Hier soll sicherlich der Status des Menüpunkts geändert werden, aber wie sicht das genau aus?


Da die dort zu ändernden Variablen BIT-Variablen sind können sie nur den Zustand 0 oder 1 haben. Wenn sie 0 ist und man sie erhöht wird sie zu 1. Wenn man sie nochmals erhöht läuft sie über und wird wieder zu 0 (Wie bei einem Byte über 255).


Zitat:
So?
Code:
 Select Case Menuepunkt
      Case 3
         Inc Pumpe
         If Pumpe > 2 Then Pumpe = 1
      Case 4
         Inc Alarm
         If Alarm > 2 Then Alarm = 1
      Case 5
         Inc Automatik
         If Alarm > 2 Then Alarm = 1
   End Select


So kann man es natürlich auch schreiben, dann benötigst du aber BYTE-Variablen.


MfG Sam[/quote]

Von modellfreund am 20.10.2010 20:23

Hallo Sam,

ich habe nun mal probiert nur das Menü zu erstellen, ohne den Status ändern zu können. Der Code funktioniert nicht, ich komme aber auch nicht weiter wo der Fehler ist.

Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100


Mcucr = &B00001010
Gicr = &B11000000
Sreg.7 = 1

Taster_1 Alias Pind.2       'grau
Config Taster_1 = Input
Portd.2 = 1

Taster_2 Alias Pind.3       'grau
Config Taster_2 = Input
Portd.3 = 1

Taster_3 Alias Pinb.4       'orange
Config Taster_3 = Input
Portd.4 = 1


Led_1 Alias Portc.4       'rot
Config Led_1 = Output

Led_2 Alias Portc.5       'gelb
Config Led_2 = Output

Led_3 Alias Portc.3       'grün
Config Led_3 = Output

Led_4 Alias Portc.2       'rot
Config Led_4 = Output

Led_5 Alias Portc.1       'gelb
Config Led_5 = Output

Led_6 Alias Portc.0       'grün
Config Led_6 = Output


Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2


Dim Menuepunkt As Byte
Dim Wasserstand As Byte
Dim Batterie As Byte
Dim Pumpe As Bit
Dim Alarm As Bit
Dim Automatik As Bit

On Int0 Menuepunkt


Menuepunkt = 1
Wasserstand = 0
Pumpe = 0
Alarm = 0
Automatik = 0



Menuepunkt:
   Inc Menuepunkt
   If Menuepunkt > 5 Then Menuepunkt = 1
   Select Case Menuepunkt
      Case 1:
         Cls
         Locate 1 , 1
         Lcd "Wasserstand: "

      Case 2:
        Cls
         Locate 1 , 1
         Lcd "Batterie: "

      Case 3:
         Cls
         Locate 1 , 1
         Lcd "Pumpe: "

      Case 4:
         Cls
         Locate 1 , 1
         Lcd "Alarm: "

      Case 5:
         Cls
         Locate 1 , 1
         Lcd "Automatik: "

   End Select
Return


End


Wo liegt das Problem?

LG Felix

Von Sam am 21.10.2010 13:28

Du hast die Hauptschleife vergessen. Da war das LCD wohl ziemlich beschäftigt.

Ich kenne die Hardware nicht. Hast du den Taster auch an INT0.

MfG Sam

Anzeige: