Schau dir mal diesen Code genau an:
Alles anzeigen
Wenn der Taste Start gedrückt wird (Zeile 27), wird der Zustand ST_TIME_RUN in Zeile 29 aktiviert.
Bedeutet, die Taste Start bewirkt einen Zustandswechsel in den Zustand ST_TIME_RUN. Und dort wird der Schaltausgang gesetzt.
Dein 1. Fehler ist, dass du schon in Zeile 31 den Schaltausgang setzt und dann im Zustand ST_TIME_RUN nochmal.
Zeile 31 löschen!
Wenn du verhindern willst, dass der Schaltausgang schaltet, wenn der 'Timer_Wert' auf 0 steht und die Start-Taste gedrückt wird, dann must du dafür sorgen, dass du den Zustand ST_TIME_RUN nicht aktivierst, wenn 'Timer_Wert' = 0 ist.
Du musst also bevor du den Zustand änderst abfragen, ob Timer_Wert = 0 ist, und wenn ja, dann z.B. Zustand ST_MENU_ABBRUCH oder ST_IDLE aktivieren (deine Wahl). Nur wenn Timer_Wert <> 0 ist, dann macht es Sinn, den Zustand in ST_TIME_RUN zu ändern.
BASCOM-Quellcode: Zustand ST_MENU_EDIT
- ' ------------------------------
- Case ST_MENU_EDIT ' Menu Zeit bearbeiten
- ' ------------------------------
- If FSM_StateChanged() = True then
- Timer_Wert = 000
- Call MUX_SetString( "000")
- Call MUX_SetDot(2)
- Call TMR_ResetInterval()
- End If
- If getTaste_Menu() = True then ' Menu bricht die Bearbeitung ab
- Call FSM_SetState(ST_MENU_ABBRUCH)
- ElseIf getTaste_Plus() = True then ' Timer-Wert erhöhen (+10)
- If Timer_Wert < 900 then
- Timer_Wert = Timer_Wert + 10
- Call MUX_SetZahl(Timer_Wert)
- End If
- ElseIf getTaste_Minus() = True then ' Timer-Wert verringern (-10)
- If Timer_Wert > 1 then
- Timer_Wert = Timer_Wert - 10
- Call MUX_SetZahl(Timer_Wert)
- End If
- ElseIf getTaste_Start() = True then ' Timer starten
- Call FSM_SetState(ST_TIME_RUN)
- Set pin_Schaltausgang
- End If
- If TMR_Interval_2Hz = True then
- Reset TMR_Interval_2Hz
- Call MUX_ToggleDot(2) ' Punkt blinken lassen
- Call MUX_ToggleDot(1)
- End If
- ' ------------------------------
- Case ST_MENU_ABBRUCH ' Menu Abbruch
- ' ------------------------------
Bedeutet, die Taste Start bewirkt einen Zustandswechsel in den Zustand ST_TIME_RUN. Und dort wird der Schaltausgang gesetzt.
Dein 1. Fehler ist, dass du schon in Zeile 31 den Schaltausgang setzt und dann im Zustand ST_TIME_RUN nochmal.
Zeile 31 löschen!
Wenn du verhindern willst, dass der Schaltausgang schaltet, wenn der 'Timer_Wert' auf 0 steht und die Start-Taste gedrückt wird, dann must du dafür sorgen, dass du den Zustand ST_TIME_RUN nicht aktivierst, wenn 'Timer_Wert' = 0 ist.
Du musst also bevor du den Zustand änderst abfragen, ob Timer_Wert = 0 ist, und wenn ja, dann z.B. Zustand ST_MENU_ABBRUCH oder ST_IDLE aktivieren (deine Wahl). Nur wenn Timer_Wert <> 0 ist, dann macht es Sinn, den Zustand in ST_TIME_RUN zu ändern.