-         

Ergebnis 1 bis 8 von 8

Thema: State Machine Aktualisierungsproblem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    40
    Beiträge
    15

    State Machine Aktualisierungsproblem

    Anzeige

    Hallo zusammen,
    ich habe ein kleines Problem mit meinem Code (zu mindestens hoffe ich, dass es nur klein ist ). Habe das Beispiel von http://www.roboternetz.de/wissen/ind...e_Machine_Menu auf meine Bedürfnisse umgestellt um es auf einem Display darzustellen.
    Das Problem ist, wenn ich in U110 gehe, soll je nach dem aus welchem Menüpunkt ich komme, die entsprechende Zeile farblich hervorgehoben werden. Nur leider klappt das nicht so wie ich mir das vorstelle, bzw. wird die richtige Zeile erst gehighlighted wenn ich eine Taste drücke, die keine Auswirkung auf die Darstellung des Menüs hat.



    Code:
    Dim Keycode_string As String * 6
                   'Key_plus|key_minus|key_prev|key_next
    Keycode_string = "{056}{050}{052}{054}{057}{055}"
    Dim Keycode(6) As Byte At Keycode_string Overlay
    
    Do
       Debounce Pinc.6 , 0 , Up_press , Sub                'Keycode zuweisen hoch
       Debounce Pinc.7 , 0 , Down_press , Sub                   'runter
       Debounce Pinc.4 , 0 , Minus_press , Sub                  'links
       Debounce Pinc.3 , 0 , Plus_press , Sub                   'rechts
       Debounce Pinc.5 , 0 , Ok_press , Sub                     'OK
       Debounce Pinc.2 , 0 , Abbort_press , Sub                 'Abbrechen
    Loop
    
    
    Change_state:
        lds R8, {State}
        lds R9, {State + 1}
        For I = 1 To 6
          Read W
          'Print Key
          If Key = Keycode(i) Then
               If W <> Loadlabel(null) Then
                  State_renew = 1
                  Key = Key_null                                
                  State = W
               End If
          End If
        Next I
    
        Read State_gosub     
        Read Lcd_textbuffer                                    
        Read Test_id
    Return
    
    
    
        S110:                                                   'Programm 1
               Adr2 Null : Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S120 : Adr2 S100
               Adr2 U110                                        'Subroutine for current State
               Data " UMenu 1_10  "
               Data 1%
    
    
           S111:                                                'Programm 1
                 Adr2 Null : Adr2 Null : Adr2 S110 : Adr2 S112 : Adr2 S120 : Adr2 S100
                 Adr2 U110                                      'Subroutine for current State
                 Data " UMenu 1_11"
                 Data 2%
    
           S112:                                                'Programm 1
                 Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S113 : Adr2 S120 : Adr2 S100
                 Adr2 U110                                      'Subroutine for current State
                 Data " UMenu 1_12"
                 Data 3%
    
    
    
    Caller:
       LDS R31, {State_gosub+1}                                 'High see Bascom-Doc Mixing ASM and BASIC
       LDS R30, {State_gosub}                                   'Low
       LSR R31                                                  'Division durch 2 (Alternativ ADR verwenden)
       ROR R30
       'Call zum Sub
       ICALL
    Return
    
    
    U110:
       Label_count = 1
       For Point = 20 To 60 Step 10
         If Test_id = Label_count Then                       
          Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , Black , Green)
         Else
          Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , White , Dark_red)
         End If
          Label_count = Label_count + 1
       Next Point
    Return
    
    
    Down_press:  'label für eine gedrückten Button 
       Key = "{054}"                                            
       Gosub Change_state_by_sub
       Gosub Caller
    Return
    Ich hoffe es ist Verständlich was ich da an Code gepostet habe.....

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Die Subs für Up_press etc. hast Du nicht mitgeliefert.
    Es scheint so zu sein, dass Du in der Do-Loop fest hängst, weil Sie rein gar nichts ausführt, solange Du keine Taste gedrückt hast. Erst wenn Du eine (falsche) Taste drückst, wird eine Sub aufgerufen und die Anzeige aktualisiert.

    Dein Programm schein etwas größer zu sein. Ggf. auch mal den Stack prüfen...

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    40
    Beiträge
    15
    Ich liefere mal die Subs nach
    Code:
    Up_press:
       Key = "{052}"                                            ' Hoch
       Gosub Caller
    Return
    
    Down_press:
       Key = "{054}"                                            ' Minus
       Gosub Caller
    Return
    
    
    Minus_press:
      X(id) = X(id) - 1                                         ' Plus
      Gosub Caller
    Return
    Vom ablauf her funktioniert das Programm ja, es ist halt immer nur eine Position zu spät mit dem highlighting. Die Restlichen Subs haben den gleichen aufbau nur das halt der Key_code ein anderer ist

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Nicht so hastig! Lies erst mal meine vorigen Post und denk in Ruhe drüber nach, ob Du nach einem Statuswechsel der State Machine auch wirklich das Display im neuen Zustand aktualisierst.


    Du musst für jeden Tastendruck mit Statuswechsel die SM zweimal abfragen:
    Erst fragst Du wohin Du wechselt, und dann im neuen State noch was auf dem Display dargestellt werden soll.
    Deine Sub Up_press wechselt z.B. keinen Status. Sie aktualisiert nur das Display.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    40
    Beiträge
    15
    Vielen Dank, da habe ich wohl beim Cpoy/Paste mit anschlißendem löschen von Auskommentierten Zeilen eine zu viel gelöscht. Warum ich aber die zwei Zeilen
    Code:
    Gosub Change_state
    Gosub Caller
    zwei mal aufrufen muss ist mir noch nicht ganz klar.
    Habe ich das richtig Verstanden das beim ersten Durchlauf die SM den wechsel mit bekommt und beim zweiten Durchlauf erst die "Darstellunge" geändert wird?


    Allerdings beschäftigt mich jetzt das Problem das ich mit weitern
    Data-Zeilen in der Menüstrucktur, Zugriffe auf verschieden Arrays erhalte möchte um diese dann in einer For-Schleife auszulesen.

    Kennt jemand ein Beispiel an das ich mich halten kann oder einen Ansatz. Wie ich einen Pointer auf ein Array lege?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Ich helfe Dir ja gern, aber offensichtlich sitzt Du vor einem Farbdisplay von Display3000.com mit einem Atmega128 und versuchst ein 6 Tasten Menü zu programmieren.
    Das ist für den Anfang eine ziemlich dicke Hardware. Ich empfehle kleine Schritte.
    Du kannst viele Probleme erst einmal als kleines Teilprogramm im Bascom-Simulator knacken.


    >Wie ich einen Pointer auf ein Array lege?
    DIM Array(xx) wird mit "LOADADR Variable, Register" und
    Label: DATA xx wird mit "LOADWORDADR Label" adressiert

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    40
    Beiträge
    15
    Hi Tomas, du hast eine gute Glaskugel . Danke für den Tip.

    Das Problem ist nicht, dass ich nicht Programmiern kann, sondern das ich in VB ein absoluter "Anfänger" bin. C ist da für mich doch verständlicher

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Warum bleibst Du nicht bei C und nimmst WinAVR??

    Habe ich das richtig Verstanden das beim ersten Durchlauf die SM den wechsel mit bekommt und beim zweiten Durchlauf erst die "Darstellunge" geändert wird?
    Naja, Du liest doch erst im zweiten Durchlauf das Label der "neuen" Sub aus.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •