Das Timing-Diagramm zeigt schon mal deutlich, daß man "waitms" die Aufgabe nicht programmiert bekommt.
Dadurch das 3 verschiedene Zykluszeiten vorliegen, verschieben sich die verschiedenen Zyklen relativ zu den anderen.
Jeder Zxklus besteht im Prinzip aus folgenden Zuständen:
Ein, Zeit1, AUS, Zeit2, Ein, Zeit1, AUS, Zeit2, Ein, Zeit1, AUS, Zeit3.
Bei Dach-L und Dach-R sind Zeit1 und Zeit2 anscheinend identisch.
Entweder man arbeitet mit ISRs und und ändert bei jedem Aufruf anhand des Zustands (den man mitzählen muß) die Zeiten, oder man arbeitet ganz ohne ISRs indem man den Wert eines Timers einer Variablen zuweist und bei jedem Durchlauf der Schleife überprüft ob der aktuelle Timerwert minus dem gespeicherten Wert gleich oder größer einer Variablen ist, die den für den jeweiligen Zustand richtige Zeit enthällt.
Man braucht dann also 4 Variablen die für jeden der 4 Zyklen den Zustand speichern.
Maximal 24 Konstanten (z.B. in 4 Arrays)für die Zeiten (womit man auch die Frontblitzer asynchon ansprechen könnte)
4 Variablen für den kleineren Timerwert
4 Variablen für die Vergleichsoperator die je nach Zustand mit den Zeitwerten der Konstanten geladen wird.
Mal schnell ein Pseudocodebeispiel.
Vermutlich sind noch Fehler drin, ich hoffe aber der Gedanke wird verständlich.
Code:
Preset/definition
Z1-ausgang = low
Z1-timealt = 0
Z1-zustand = 0
Z1-const(100,100,100,100,100,700)
Schleife
IF Timer - Z1-timealt >= Z1-zeit (
Toggel Z1-ausgang
Z1-zustand ++ 1
IF Z1-zustand >= 6 (Z1-zustand = 0)
Z1-zeit = Z1-const(Z1-zustand)
Z1-timealt = Timer
)
Ende
Den Block nimmt man für jeden Zyklus ein mal (Z1 bis Z4)
Im Preset definiert man die Startbedingung (macht die Schleife schlanker. Ich weis aber nicht ob das so in Bascom geht)
Je Block gibt es ein IF, ist die Bedingung nicht erfüllt, wird der ganze Block übersprungen und der nächste Programmblock kann bearbeitet werden (bis die Schleife einmal komplett durch ist).
Ist die Bedingung erfüllt, wird der entsprechende Ausgang umgeschaltet.
Dann wird der Zustandszähler inkrementiert, da es ja einen Zustandswechsel gegeben hat.
Darauf folgt eine Prüfung auf Wertebereichsüberschreitung des Zustandszähler (ist gegeben wenn der Zyklus einmal durchgelaufen ist) und bei Bereichsüberschreitung erfolgt das Zurücksetzen.
Danach wird die Vergleichsvariable für den Zeitvergleich aus der entsprechenden Konstante gesetzt.
Und zum Schluß noch der aktuelle Timerwert übernommen in die Variable für die Startzeit des aktuellen Zustands.
Im Gegensatz zu ISRs kann es bei diesem Konstrukt dazu kommen, das die einzelnen Zustände um einen Schleifendurchlauf länger dauern als die vorgegebene Zeit.
Wen das nicht sört, spart so ISRs für andere Aufgaben.
Lesezeichen