mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmablauf in C: Wie dafür sorgen dass Schleife vollst. bearbeitet wird?


Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: rudi_ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quelltext?

Autor: Matthias D. (marvin42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, die Zeit ist reif, dass du dich mit dem Konzept einer 
Statusmaschine (engl. state machine) beschäftigst.

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statusmaschine hört sich zwar auch schön an, aber der geläufigere 
Begriff im Deutschen ist "endlicher Automat".

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Statusmaschine hört sich zwar auch schön an...
Oder mit der korrekten Übersetzung aus dem Englischen:
state = Zustand --> Zustandsmaschine, Zustandsautomat

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Grübler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.