Bascom Menü Probleme

tenor

Mitglied
30. Sep. 2012
169
0
16
44
Sprachen
  1. BascomAVR
Hallo!
ich habe einige Problem mit meiner Menüsteuerung.
Bei dem vorherigen Versuch war das Prinzip vollkommen ausreichend und übersichtlich.
Aktuell habe ich da so meine Probleme und habe beim testen des Codes Probleme mit den Sprungmarken.
Hier mal der Code:
Code:
Main:
Cls
Menu = 0
Hauptmenu = 0
Menuzeit = 0
Gosub Settime
Gosub Setdate
Do
   Debounce T_menu , 0 , Menuconfig
   If Menu = 0 Then                                         'Wenn das Menu aktiv ist, reguläre Anzeige überspringen
      Select Case _wd
         Case 1
            Locate 1 , 1 : Lcd "Montag"
         Case 2
            Locate 1 , 1 : Lcd "Dienstag"
         Case 3
            Locate 1 , 1 : Lcd "Mittwoch"
         Case 4
            Locate 1 , 1 : Lcd "Donnerstag"
         Case 5
            Locate 1 , 1 : Lcd "Freitag"
         Case 6
            Locate 1 , 1 : Lcd "Samstag"
         Case 7
            Locate 1 , 1 : Lcd "Sonntag"
      End Select
      Locate 2 , 1
      Lcd Date$ ; " " ; "  " ; _hour ; ":" ; _min ; " Uhr"
      Locate 3 , 1
      Lcd Temperatur : Lcd " C"
      If Messen > 4 Then
         Gosub Gettemp
         Messen = 0
      End If
      If Zeitabgleich > 10 Then
         Gosub Getdatetime                                  ' Datum und Uhrzeit auslesen
         Zeitabgleich = 0
      End If
   End If
Loop
'#########################################################################################
Menuconfig:
Menu = 1
Incr Hauptmenu
Menuconst:
Cls
If Menuzeit = 0 Then
If Hauptmenu > 2 Then Hauptmenu = 1
   Do
      Debounce T_runter , 0 , Menuconfig
      Select Case Hauptmenu
         Case 1
            Locate 1 , 1 : Lcd "Datum - Uhrzeit"
            Locate 2 , 1 : Lcd "Einstellung"
            Debounce T_rechts , 0 , L_menuzeit
         Case 2
            Locate 1 , 1
            Lcd "LED Einstellung"
      End Select
   Loop
End If
L_menuzeit:
Incr Menuzeit
Cls
Do
   Debounce T_menu , 0 , Main
   If Menuzeit > 5 Then Menuzeit = 0
   Debounce T_runter , 0 , L_menuzeit
   'If Menuzeit = 1 Then Debounce T_runter , 0 , Subtrahieren
   Select Case Menuzeit
      Case 1 :
         Locate 1 , 1
         Lcd "Uhrzeit bearbeiten:"
         Locate 2 , 1
         Lcd "Stunde einstellen     "
         Locate 3 , 1
         Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
         If T_rechts = 1 Then
            Bitwait T_rechts , Reset
            Do
               Locate 2 , 1
               Lcd "Aktuelle Stunde  "
               Locate 3 , 1
               Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
               Debounce T_runter , 0 , Subtrahieren , Sub
               Debounce T_hoch , 0 , Addieren , Sub
            Loop Until T_links = 1
            Bitwait T_links , Reset
         End If
      Case 2 :
         Locate 1 , 1
         Lcd "Uhrzeit bearbeiten:"
         Locate 2 , 1
         Lcd "Minute stellen"
         Locate 3 , 1
         Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
      Case 3 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Tag stellen"
         Locate 3 , 1
         Lcd _day
      Case 4 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Monat stellen"
         Locate 3 , 1
         Lcd _month
      Case 5 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Jahr stellen"
         Locate 3 , 1
         Lcd "20" : Lcd _year
      End Select
      If Menuzeit = 0 Then Goto Main
Loop


Addieren:
Select Case Menuzeit
   Case 1 :
      _hour = _hour + 1
      If _hour > 23 Then _hour = 0
   Case 2 :
      _min = _min + 1
      If _min > 59 Then _min = 0
   Case 3 :
      _day = _day + 1
      If _day > 31 Then _day = 0
   Case 4 :
      _month = _month + 1
      If _month > 12 Then _month = 1
   Case 5 :
      _year = _year + 1
      If _year > 99 Then _year = 01
End Select
Return

Subtrahieren:
Select Case Menuzeit
   Case 1 :
      _hour = _hour - 1
      If _hour = 255 Then _hour = 23
   Case 2 :
      _min = _min - 1
      If _min = 255 Then _min = 59
   Case 3 :
      _day = _day - 1
      If _day = 255 Then _day = 31
   Case 4 :
      _month = _month - 1
      If _month = 255 Then _month = 12
   Case 5 :
      _year = _year - 1
      If _year = 255 Then _year = 99
End Select
Return

Menuback:
Menu = Menu - 1
'If Menu = 255 Then Menu = 5                                 'Menu rückwärts durchwählen
Goto Menuconst

Besonders diese Stelle bschäftigt mich gerade:
Code:
   Debounce T_menu , 0 , Main
   If Menuzeit > 5 Then Menuzeit = 0
   Debounce T_runter , 0 , L_menuzeit
   'If Menuzeit = 1 Then Debounce T_runter , 0 , Subtrahieren
   Select Case Menuzeit
      Case 1 :
         Locate 1 , 1
         Lcd "Uhrzeit bearbeiten:"
         Locate 2 , 1
         Lcd "Stunde einstellen     "
         Locate 3 , 1
         Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
         If T_rechts = 1 Then
            Bitwait T_rechts , Reset
            Do
               Locate 2 , 1
               Lcd "Aktuelle Stunde  "
               Locate 3 , 1
               Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
               Debounce T_runter , 0 , Subtrahieren , Sub
               Debounce T_hoch , 0 , Addieren , Sub
            Loop Until T_links = 1
            Bitwait T_links , Reset
         End If
      Case 2 :
         Locat

In die untere Abzweigung "aktuelle Stunde" springt er rein und beim drücken von t_links auch wieder raus. hin und her geht.
alle weiteren Tasten inkl. den subroutinen addieren und subtrahieren werden ignoriert..

Die meisten Cases sind noch nicht bearbeitet, hatte das Menü gerade umgestellt.

Bisher habe ich kein einfaches Menü für Bascom gefunden.
Diese State Maschine ist auch mehr als nur ein bißchen komplex...

Hat jemand einen Vorschlage?

Danke schon mal!
 
Mehr Infos

Hallo tenor,

sei doch bitte mal so nett und stelle den gesamten Code ein. Mich interessiert besonders der Anfang, wo Du die Ports configurierst und, ich denk mal per Alias, zuweist.
Ich persoenlich arbeite sehr ungern mit debounce...Ich entprelle Hardwareseitig und nutze Interrupts (INT0, PCINTx). Wobei die PCINT's etwas komplizierter bei der Auswertung sind,
dafuer am Ende aber zuverlaessig....

Aber wie gesagt, stell mal bitte den gesamten Code ein, zur Not als Anlage.....


LG

Klaus
 
Diese State Maschine ist auch mehr als nur ein bißchen komplex...


Hallo!

Puh, wenn das ein Auszug einer State Machine ist, dann wäre Markus hier wohl der beste Ansprechpartner!

Er liest hier zwar bestimmt öfter mal mit, hat aber leider wenig Zeit direkt mitzuhelfen.
Vielleicht findet er ja den Thread und meldet sich kurz zu Wort. :wink:


Generell frage ich mich, ob es denn unbedingt die State Machine sein muss.
Ist dein Programm denn so umfangreich? :hmmmm:
Würde nicht ein kleines Menüprogramm dafür reichen?

Ich kann dich aber verstehen, wenn du da nun erst mal weiter machen möchtest.
Ansonsten fängst du ja wieder ganz von vorne an.


Grüße,
Cassio
 
Hallo!

Das ist kein Auszug aus der State Maschine, das habe ich mir so überlegt.
Hatte gestern Abend auch einen ersten Erfolg in dem ich andere Tastenbelegungen verwendet hatte.

Ich wollte mit der Taste runter, zum einen in den unteren Menü Punkt wechseln und zum anderen gleich den Wert ändern.

Ich frage mich nur ob es nicht einfache und somit bessere Lösungen gibt, denn diese State Maschine scheint es nicht zu sein ;)
Soo komplex ist das Programm noch nicht, aber ich muss schon recht viele Parameter editierbar machen und diese will
man ja nicht in einer Liste nur durchklicken, sondern diese sollten halt gruppiert sein.

Uhrzeit und Datum haben ja schon 6 Variablen, dazu kommen noch mindestens 3 Zeitwerte für die zu steuernden Pumpen.
Die Lichtsteuerung wird wohl am aufwendigsten, hier müssen Zeiten bestimmt werden wann hoch gedimmt und wann runter gedimmt wird, wann eine Mittagspause kommt....
Später einmal soll jeder RGB Kanal einzeln editierbar sein, so dass sich die Lichtfarbe noch editieren lässt...

Daher ist eine ordentliche Struktur schon sinnvoll :)

Mir gefällt das mit dem hin und her springen halt nicht so.
Zum entprellen der Tasten mit dem debounce Befehl, ist ja auch immer eine Sprungmarke erforderlich.
Zum jeden erhöhen eines Wertes muss ich dann wieder mit dem debounce Befehl raus springen... und wieder zurück.

Wie gesagt aktuell mit der Uhrzeit alleine, scheint das jetzt zu funktionieren.
Denke aber das die Menüs zum addieren und subtrahieren dann alles sprengen werden...

Aktuell sieht es so aus:
Code:
Main:
Cls
Menu = 0
Hauptmenu = 0
Menuzeit = 0
Gosub Settime
Gosub Setdate
Do
   Debounce T_menu , 0 , Menuconfig
   If Menu = 0 Then                                         'Wenn das Menu aktiv ist, reguläre Anzeige überspringen
      Select Case _wd
         Case 1
            Locate 2 , 11 : Lcd "Montag"
         Case 2
            Locate 2 , 11 : Lcd "Dienstag"
         Case 3
            Locate 2 , 11 : Lcd "Mittwoch"
         Case 4
            Locate 2 , 11 : Lcd "Donnerstag"
         Case 5
            Locate 2 , 11 : Lcd "Freitag"
         Case 6
            Locate 2 , 11 : Lcd "Samstag"
         Case 7
            Locate 2 , 11 : Lcd "Sonntag"
      End Select
      Locate 1 , 11
      Tag = Str(_day)                                       'Formatierung auf 2 Stellen
      Tag = Format(tag , "00")
      Monat = Str(_month)                                   'Formatierung auf 2 Stellen
      Monat = Format(monat , "00")
      Lcd Tag ; "." ; Monat ; ".20" ; _year
      Locate 1 , 1
      Lcd _hour ; ":" ; _min ; " Uhr"
      Locate 2 , 1
      Lcd Temperatur : Lcd " C"
      If Messen > 4 Then
         Gosub Gettemp
         Messen = 0
      End If
      If Zeitabgleich > 10 Then
         Gosub Getdatetime                                  ' Datum und Uhrzeit auslesen
         Zeitabgleich = 0
      End If
   End If
Loop
'#########################################################################################
Menuconfig:
Menuzeit = 0
Menu = 1
Incr Hauptmenu
Menuconst:
Cls
If Menuzeit = 0 Then
If Hauptmenu > 2 Then Hauptmenu = 1
   Do
      Debounce T_runter , 0 , Menuconfig
      Debounce T_menu , 0 , Main
      Select Case Hauptmenu
         Case 1
            Locate 1 , 1 : Lcd "Uhrzeit - Datum"
            Debounce T_rechts , 0 , L_menuzeit
         Case 2
            Locate 1 , 1
            Lcd "Beleuchtung"
      End Select
   Loop
End If
L_menuzeit:
Hauptmenu = 0
Incr Menuzeit
L_menuzeitconst:
Cls
Do
   Debounce T_menu , 0 , Main
   If Menuzeit > 6 Then Goto Menuconfig
   Debounce T_rechts , 0 , L_menuzeit
   Debounce T_runter , 0 , Subtrahieren
   Debounce T_hoch , 0 , Addieren
   Select Case Menuzeit
      Case 1 :
         Locate 1 , 1
         Lcd "Uhrzeit bearbeiten:"
         Locate 2 , 1
         Lcd "Stunde einstellen     "
         Locate 3 , 1
         Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
      Case 2 :
         Locate 1 , 1
         Lcd "Uhrzeit bearbeiten:"
         Locate 2 , 1
         Lcd "Minute stellen"
         Locate 3 , 1
         Lcd _hour : Lcd ":" : Lcd _min : Lcd " " : Lcd "Uhr"
      Case 3 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Tag stellen"
         Locate 3 , 1
         Tag = Str(_day)                                    'Formatierung auf 2 Stellen
         Tag = Format(tag , "00")
         Lcd Tag
      Case 4 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Monat stellen"
         Locate 3 , 1
         Select Case _month
            Case 1:
               Locate 3 , 1
               Lcd "Januar"
            Case 2:
               Locate 3 , 1
               Lcd "Februar"
            Case 3:
               Locate 3 , 1
               Lcd "Maerz"
            Case 4:
               Locate 3 , 1
               Lcd "April"
            Case 5:
               Locate 3 , 1
               Lcd "Mai"
            Case 6:
               Locate 3 , 1
               Lcd "Juni"
            Case 7:
               Locate 3 , 1
               Lcd "July"
            Case 8:
               Locate 3 , 1
               Lcd "August"
            Case 9:
               Locate 3 , 1
               Lcd "September"
            Case 10:
               Locate 3 , 1
               Lcd "Oktober"
            Case 11:
               Locate 3 , 1
               Lcd "November"
            Case 12:
               Locate 3 , 1
               Lcd "Dezember"
         End Select
      Case 5 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Jahr stellen"
         Locate 3 , 1
         Lcd "20" : Lcd _year
      Case 6 :
         Locate 1 , 1
         Lcd "Datum bearbeiten"
         Locate 2 , 1
         Lcd "Wochentag stellen"
         Select Case _wd
            Case 1:
               Locate 3 , 1
               Lcd "Montag"
            Case 2:
               Locate 3 , 1
               Lcd "Dienstag"
            Case 3:
               Locate 3 , 1
               Lcd "Mittwoch"
            Case 4:
               Locate 3 , 1
               Lcd "Donnerstag"
            Case 5:
               Locate 3 , 1
               Lcd "Freitag"
            Case 6:
               Locate 3 , 1
               Lcd "Samstag"
            Case 7:
               Locate 3 , 1
               Lcd "Sonntag"
         End Select
   End Select
Loop


Addieren:
Select Case Menuzeit
   Case 1 :
      _hour = _hour + 1
      If _hour > 23 Then _hour = 0
   Case 2 :
      _min = _min + 1
      If _min > 59 Then _min = 0
   Case 3 :
      _day = _day + 1
      If _day > 31 Then _day = 0
   Case 4 :
      _month = _month + 1
      If _month > 12 Then _month = 1
   Case 5 :
      _year = _year + 1
      If _year > 99 Then _year = 01
   Case 6 :
      _wd = _wd + 1
      If _wd > 7 Then _wd = 1
End Select
Goto L_menuzeitconst

Subtrahieren:
Select Case Menuzeit
   Case 1 :
      _hour = _hour - 1
      If _hour = 255 Then _hour = 23
   Case 2 :
      _min = _min - 1
      If _min = 255 Then _min = 59
   Case 3 :
      _day = _day - 1
      If _day = 255 Then _day = 31
   Case 4 :
      _month = _month - 1
      If _month = 255 Then _month = 12
   Case 5 :
      _year = _year - 1
      If _year = 255 Then _year = 99
   Case 6 :
      _wd = _wd - 1
      If _wd = 255 Then _wd = 7
End Select
Goto L_menuzeitconst

Ausser der Zeit wurde noch nicht viel geregelt, dafür finde ich das Programm etwas zu groß.

Daher wollte ich mal nach Alternativen fragen ;)
 
Hallo tenor,

sei doch bitte mal so nett und stelle den gesamten Code ein. Mich interessiert besonders der Anfang, wo Du die Ports configurierst und, ich denk mal per Alias, zuweist.
Ich persoenlich arbeite sehr ungern mit debounce...Ich entprelle Hardwareseitig und nutze Interrupts (INT0, PCINTx). Wobei die PCINT's etwas komplizierter bei der Auswertung sind,
dafuer am Ende aber zuverlaessig....

Aber wie gesagt, stell mal bitte den gesamten Code ein, zur Not als Anlage.....


LG

Klaus

Hallo Klaus,
hier noch die fehlende Deklaration, ist eigentlich recht unspektakulär, die Namen wie T_hoch sind da schon einfacher ;=
Code:
$regfile = "m644def.dat"
$crystal = 16000000
$lib "i2c_twi.lbx"
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 20 * 4
Config 1wire = Pind.3
Config Timer1 = Timer , Prescale = 256                      'Timer1 für den Sekundentakt
On Timer1 Timer_irq

Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
Declare Function Decigrades(byval Sc(9) As Byte) As Integer

Lcd_backlight Alias Pina.6                                  ' LCD - LED Hintergrundbeleuchtung
Dosierpumpe1 Alias Pina.7
Dosierpumpe2 Alias Pinc.7
Dosierpumpe3 Alias Pinc.6
Heizung Alias Pinc.4
Backlight Alias Pinc.3
Led_weiss Alias Pind.4
T_runter Alias Pinb.0
T_rechts Alias Pinb.1
T_hoch Alias Pinb.2
T_links Alias Pinb.3
T_menu Alias Pinb.4
T6 Alias Pind.0
T7 Alias Pind.1
T8 Alias Pind.2

Config Porta = Output                                       'LCD Display
Config Portc = Output
Config Portb = Input
Config T6 = Input
Config T7 = Input
Config T8 = Input
Config Led_weiss = Output
Config Pind.3 = Input                                       ' DS18B20
Config Pind.4 = Output                                      ' PWM Kanal LED Weiss
Config Pind.5 = Output                                      ' PWM Kanal LED Backlight
Config Clock = User
Config Date = Dmy , Separator = .                           ' Datumsformat DD.MM.YY

Const Timervorgabe = 3036
Const Ds1307w = &HD0                                        ' Addresse des DS1307 zum schreiben
Const Ds1307r = &HD1
Dim Menu As Byte
Dim Pwm(6) As Byte
Dim Twi_control As Byte                                     ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim B As Byte                                               ' Zeichen von UART
Dim Error As Byte
Dim _wd As Byte                                             ' Wochentag
Dim _sec_bcd As Byte , _min_bcd As Byte , _hour_bcd As Byte , _day_bcd As Byte , _month_bcd As Byte , _year_bcd As Byte
Dim I As Integer , Sekunde As Integer
Dim Temperatur As String * 5
Dim Messen As Integer
Dim W As Word
Dim Dg As Integer
Dim Dg1 As Byte
Dim Dsid1(8) As Byte                                        ' Adresses des DS18B20
Dim Sc(9) As Byte
Dim Zeit As String * 8
Dim Zeitabgleich As Integer
Dim Menuzeit As Integer
Dim Hauptmenu As Integer
Dim Std_aktiv As Integer
Dim Monat As String * 2
Dim Tag As String * 2

Wenn debounce ohne Sprungmarke funktionieren würde wäre das super!
Ich habe insgesamt 8 Taster, bräuchte ja für jeden einen ext. Interrupt, denke das sprengt den Rahmen ;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)