PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : State Machine Aktualisierungsproblem



Loro
26.08.2008, 23:10
Hallo zusammen,
ich habe ein kleines Problem mit meinem Code (zu mindestens hoffe ich, dass es nur klein ist :-k ). Habe das Beispiel von https://www.roboternetz.de/wissen/index.php/Bascom_State_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.





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.....

-tomas-
27.08.2008, 10:53
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...

Loro
27.08.2008, 11:39
Ich liefere mal die Subs nach
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

-tomas-
27.08.2008, 13:02
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.

Loro
27.08.2008, 21:52
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


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?

-tomas-
27.08.2008, 22:38
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

Loro
27.08.2008, 23:32
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 :-)

-tomas-
28.08.2008, 00:07
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.