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.
Ich denke, die Zeit ist reif, dass du dich mit dem Konzept einer Statusmaschine (engl. state machine) beschäftigst.
Statusmaschine hört sich zwar auch schön an, aber der geläufigere Begriff im Deutschen ist "endlicher Automat".
> 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
>State Machine,hört sich gut an, da weiß ich aber wenig >bis nix mit anzufangen schon mal dem Link Statemachine von Falk Brunner gefolgt?
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.