Loro
16.03.2009, 12:20
Hallo zusammen, ich bins mal wieder und wieder mit meinem Lieblings Thema, der State Machine.
Ich habe Folgendes Problem, beim Lesen der States werden nicht alle Daten gelesen.
In der Sub "Change_state" wird der letzt READ nicht ausgeführt also "Read Change_allow" Wenn ich die Read-Anweisungen vertausche ist es das gleich, die letzte Anweisung wird nicht gelesen.
Hat jemand eine Idee woran das liegen könnte, im Moment sehe nicht meinen Fehler nicht und das schon seit zwei Tagen :-)
Hier der Code
Main Loop:
Do
'Menüeintrag und Tastencodes finden und ggf. State wechseln
'hier nur Tastendruck auswerten
Gosub Change_state
'Pointer nach Statuswechsel neu setzen
If State_renew = 1 Then Gosub Change_state
'Unterprogramm des aktuellen State anspringen
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
'Pina1-2 werden vom Diplay belegt, Pina6 u PinA7 haben eine schwache Spannung
Debounce Pina.3 , 0 , Up_press , Sub
Debounce Pina.4 , 0 , Down_press , Sub
Debounce Pina.5 , 0 , Plus_press , Sub
Debounce Pina.6 , 0 , Minus_press , Sub
Debounce Pina.7 , 0 , Ok_press , Sub
If Change_allow = 1 Then
If Pina.5 = 0 Then
Gosub Plus_press
'Value_change = 1
Elseif Pina.5 = 1 Then
Gosub Reset_plus
End If
If Pina.6 = 0 Then
Gosub Minus_press
'Value_change = 1
Elseif Pina.6 = 1 Then
Gosub Reset_minus
End If
End If
'LCD refresh wenn Menü verändert
If State_renew = 1 Then
State_renew = 0
Gosub Lcdprint
End If
Loop
End
Die States:
'--------------------------------------------------------------------
'Subroutine: Change_state_
'Call from: main loop
'Status der State Machine feststellen und ggf. Wechseln
'--------------------------------------------------------------------
Change_state:
lds R8, {State}
lds R9, {State + 1}
For Icount = 1 To Key_buttons
Read W
If Key = Keycode(icount) Then
If W <> Loadlabel(null) Then
State_renew = 1
Key = Key_null 'reset key status after get a new state of state
'machine (prevent influence on GOSUBs)
State = W
End If
End If
Next Icount
Read State_gosub 'Adresse des akt. Unterprogramms einlesen
Read Lcd_textbuffer 'read LCD text
Read Options_id
Read Array_id 'Identifier für Array Information
Read Change_allow
Return
P1_1: 'Programm 1
Adr2 P1_2 : Adr2 Null : Adr2 Null : Adr2 P1_1_edit : Adr2 Null : Adr2 Null
Adr2 Over_view 'Subroutine for current State
Data Title1
Data 1% 'Aktulee Zeile (Hervorheben)
Data $10
Data 0% 'Change_allow
P1_1_edit:
Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
Adr2 Change 'Subroutine for current State
Data Title1
Data 1% 'Aktulee Zeile (Hervorheben)
Data $10
Data 1% 'Change_allow
[/b]
Ich habe Folgendes Problem, beim Lesen der States werden nicht alle Daten gelesen.
In der Sub "Change_state" wird der letzt READ nicht ausgeführt also "Read Change_allow" Wenn ich die Read-Anweisungen vertausche ist es das gleich, die letzte Anweisung wird nicht gelesen.
Hat jemand eine Idee woran das liegen könnte, im Moment sehe nicht meinen Fehler nicht und das schon seit zwei Tagen :-)
Hier der Code
Main Loop:
Do
'Menüeintrag und Tastencodes finden und ggf. State wechseln
'hier nur Tastendruck auswerten
Gosub Change_state
'Pointer nach Statuswechsel neu setzen
If State_renew = 1 Then Gosub Change_state
'Unterprogramm des aktuellen State anspringen
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
'Pina1-2 werden vom Diplay belegt, Pina6 u PinA7 haben eine schwache Spannung
Debounce Pina.3 , 0 , Up_press , Sub
Debounce Pina.4 , 0 , Down_press , Sub
Debounce Pina.5 , 0 , Plus_press , Sub
Debounce Pina.6 , 0 , Minus_press , Sub
Debounce Pina.7 , 0 , Ok_press , Sub
If Change_allow = 1 Then
If Pina.5 = 0 Then
Gosub Plus_press
'Value_change = 1
Elseif Pina.5 = 1 Then
Gosub Reset_plus
End If
If Pina.6 = 0 Then
Gosub Minus_press
'Value_change = 1
Elseif Pina.6 = 1 Then
Gosub Reset_minus
End If
End If
'LCD refresh wenn Menü verändert
If State_renew = 1 Then
State_renew = 0
Gosub Lcdprint
End If
Loop
End
Die States:
'--------------------------------------------------------------------
'Subroutine: Change_state_
'Call from: main loop
'Status der State Machine feststellen und ggf. Wechseln
'--------------------------------------------------------------------
Change_state:
lds R8, {State}
lds R9, {State + 1}
For Icount = 1 To Key_buttons
Read W
If Key = Keycode(icount) Then
If W <> Loadlabel(null) Then
State_renew = 1
Key = Key_null 'reset key status after get a new state of state
'machine (prevent influence on GOSUBs)
State = W
End If
End If
Next Icount
Read State_gosub 'Adresse des akt. Unterprogramms einlesen
Read Lcd_textbuffer 'read LCD text
Read Options_id
Read Array_id 'Identifier für Array Information
Read Change_allow
Return
P1_1: 'Programm 1
Adr2 P1_2 : Adr2 Null : Adr2 Null : Adr2 P1_1_edit : Adr2 Null : Adr2 Null
Adr2 Over_view 'Subroutine for current State
Data Title1
Data 1% 'Aktulee Zeile (Hervorheben)
Data $10
Data 0% 'Change_allow
P1_1_edit:
Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
Adr2 Change 'Subroutine for current State
Data Title1
Data 1% 'Aktulee Zeile (Hervorheben)
Data $10
Data 1% 'Change_allow
[/b]