Moin Leute,
Ich programmiere meinen Atmega 32 mit C.
Wie sorge ich dafür dass z.B eine Schleife oder ein UP vollständig
abgearbeitet wird bevor in eine andere Schleife gesprungen wird.
In meinem Programm wird, ausgelöst durch das Setzen von einem Pin, ein
Unterprogramm gestartet und das UP muss vollständig abgearbeitet werden,
aber trotzdem nebenbei z.B.andere PINs überwacht werden.
Also werden im Hauptprogramm die PINs überwacht und dann ggf. in die
entsprechenden, zugehörigen Unterprogramme gesprungen. Soweit kein
Problem, wenn jetzt aber in einem der Unterprogramme auf einen Timer
gewartet wird dann läuft der Programmablauf ja weiter, aber um dieses
Unterprogramm weiterhin abarbeiten zu können muss der Pin beim nächsten
Durchlauf ja immer noch gesetzt sein, sonst würde das Unterprogramm auch
wenn der Timer mittlerweile gesetzt ist, ja nicht mehr aufgerufen und
somit nicht zuende abarbeitet...
Ich baue mir zur Zeit immer sehr aufwändige Schleifenstrukturen in denen
einfache Variablen als Flags gesetzt werden wenn das UP abarbeitet ist,
und die dann abgefragt werden bevor die nächsten Unterprogramme
gestartet werden können
Das wird bei einem größerem Programm doch langsam unübesichtlich und
kompliziert.. hat jemand von euch eine Andere Idee wie man sowas
aufbaut, oder kennt noch irgnedwelche Befehle die ich nicht kenne?
danke fürs drüber nachdenken!!
gruß
gerd
Wenn ich dein Problem richtig verstehe, dann würde ich alle relevanten
Pins per Interrupt überwachen. Immer wenn zB der Pin einen 0-1 Wechsel
machst, springt dein Controller mal kurz in eine ISR und merkt sich den
Wechsel in einem Bitfeld. In deiner Hauptschleife arbeitest du nun
entsprechend der Bitfelder die Unterprogramme ab.
Falls nicht alle Pins Interrupt-fähig sind, dann die Signale per
Hardware ver-odern und einen Master-Interrupt-Pin aufmachen, dann muß
die ISR dispatchen.
> Statusmaschine hört sich zwar auch schön an...
Oder mit der korrekten Übersetzung aus dem Englischen:
state = Zustand --> Zustandsmaschine, Zustandsautomat
Moin,
nen Interrupt zur Abfrage der Pins kann ich nicht nehemen da ich davon
einige mehr hab und zum Teil auch nur Werte von Variablen abgefragt
werden..
Ich muss "blos" dafür sorgen dass mein Unterprogramm ganz bis zuende
abgearbeite wird.
Im konkreten Fall wird durch ein Flag das mit einer if Schleife
überwacht wird, ein UP aufgerufen, welches eine Hydraulikpumpe starten
soll, 3Sekunden Warten, dann ein Hydraulikventil schalten.
Aber wärend der Wartezeit (da wird ein Timer gestartet und
abgefragt..)sollen andere Funktionen auch überwacht/ausgeführt werden.
Jetzt wird wärend der 2sek wartezeit aus der schleife rausgesprungen und
die anderen Aufgaben abarbeitet, wenn sich daraus jetzt ergibt dass das
Flag für das UP nicht mehr gesetzt ist, wird nicht mehr in das UP
gesprungen und auch wenn jetzt meine 3Sek Wartezeit zu ende sind wird
das Ventil nicht angeschaltet...
Wenn man jezt von solchen Programmstukturen mehrere hat (das wird ne
steuerung für eine Maschine..) wird das alles ganz schön kompliziert,
wenn man nur durch setzen von weiteren Flags die gesetzt oder gelöscht
werden dafür sorgen kann dass z.B. das Ventil auf jednefall geschaltet
wird..
State Machine,hört sich gut an, da weiß ich aber wenig bis nix mit
anzufangen, und bei google war ich auch noch nicht wirklich fündig. Kann
man sowas hier gebrauchen?
gruß+dank
gerd
gerd schrieb:> State Machine,hört sich gut an, da weiß ich aber wenig bis nix mit> anzufangen, und bei google war ich auch noch nicht wirklich fündig. Kann> man sowas hier gebrauchen?
Statmachines kann man fast immer brauchen.
Wenn ich in deiner Beschreibung des jetzigen Aufbaus ständig das
Wörtchen 'warten' lese, kann ich mir schon vorstellen, dass du nichts
als Schwierigkeiten hast.
Eine der Grundregeln: Wenn in einem Programm auf etwas gewartet wird,
dann ist das meistens schon der Anfang vom Ende. In einem µC Programm
wird nicht gewartet (ausser sehr kleine Wartezeiten im µs Bereich, die
mit wenigen Taktzyklen durch sind und die man anders nicht vernünftig
hinkriegt).
Warten ist der erste Schritt in ein Programm, welches nicht mehrere
Dinge quasi-simultan erledigen kann.
Eine (oder mehrere, kein Mensch sagt dass man nur eine Statemachine im
System haben kann) Statemachine ist 1 möglicher Ansatz, um diese
Problematik von vorne herein zu vermeiden.
PS:
Danke an alle. 'Statusmaschine' hat sich seltsam angehört, ich konnte
aber nicht sagen warum :-)
>> gruß+dank> gerd