PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei Schleifen gleichzeitig laufen lassen



hendrik87
10.10.2007, 19:10
Hallo

Ich programmier von Zeit zu Zeit immer mal so kleine Programme für den RN-Control. Meistens erreiche ich auch mein Ziel. Nun wollte ich aber mal wissen, ob man irgendwie zwei Schleifen gleichzeitig laufen lassen kann? Zum Beispiel so:

1. Eine Schleife die für den Countdown auf dem Display zuständig ist
und gleichzeitig läuft noch eine Schleife
2. die so lange läuft, bis ein Port = 1 ist.

Ist sowas möglich oder muss man da irgendwie eine große Schleife bauen?

Gruß Hendrik

Jon
10.10.2007, 19:37
Das ist nicht möglich. Da bräuchtest du einen multitasking fähigen µC. Und das sind die AVRs nicht. Da müsstest du einen Propeller-Chip verwenden.

jon

vklaffehn
10.10.2007, 19:39
Moin!
Ich denke mal, dafür wären Interrupts gut, für den Timer z.B. einen (welch Überaschung) Timerinterrupt, und den Taster evtl. an einen Interruptfähigen Pin anschließen.
MfG
Volker

Jon
10.10.2007, 19:50
Das würde gehen, wenn nur eine Schleife laufen würde, die bei einem Interrupt unterbrochen wird.
Zwei Schleifen nebeneinander gehen bei einem AVR nicht.

jon

dennisstrehl
10.10.2007, 19:56
Das könnte man beispielsweise über ein Hauptprogramm und einen Timer regeln. Der Timerinterrupt bringt den µC in's Hauptprogramm, das entscheidet dann welche Schleife aufgerufen wird. Das kann z.B. immer abwechselnd passieren, z.B. alle 1ms wechseln.

hendrik87
10.10.2007, 20:00
Mit den zwei Schleifen sollte jetzt auch nur ein Beispiel sein. Ein anderes Beispiel wär z.B. das man bei einem Auto die eine Schleife die Geschwindigkeit errechnen lässt un die andere Schleife den Verbrauch und vielleicht eine dritte für die Menüführung. (Anzeigen aller Daten)
Naja, hatte jetzt nichts konkretes vor zu programmieren, nur ist mir die Frage irgendwie immer wieder hoch gekommen, weil man dann wohl so einiges leichter programmieren könnte.

for_ro
10.10.2007, 20:42
Echt parallel geht das nicht. Aber das ist bei den meisten Prozessoren und Controllern nicht möglich.
Braucht es in der Regel ja auch gar nicht.
Normalerweise reagiert dein Programm auf Einflüsse von außen, wie z.B. ein Geber, der in Abhängigkeit von der Geschwindigkeit eine größer werdende Spannung ausgibt. Außerdem ist da noch ein Verbrauchssensor, der den Spritverbrauch durch Impulse überträgt.
Wenn du in deinem Programm die beiden über den ADC und Portabfrage einliest, die Werte umrechnest und dann auf dem Display darstellt, merkst du doch überhaupt nicht, ob die nun parallel oder nacheinander berechnet wurden. Hauptsache, es geht schnell genug.
Die Ausgabe der z.B. 3-stelligen Geschwindigkeit passiert auch nicht gleichzeitig, sondern eine Ziffer nach der anderen.
Und nebenbei kannst du dann auch noch auf eine Taste drücken, um damit die angezeigten Daten bzw. das Menu umzuschalten.
Evtl. willst du unmittelbar auf einen Zustandswechsel an einem Port reagieren, dann benutzt du einen externen Interrupt. Oder du willst nach einem bestimmten Zeitintervall eine Aktion durchführen, dann braucht es einen Timer.
Das alles läuft so quasi-parallel ab, dass du das Nacheinander wahrscheinlich nicht bemerken kannst.
Und wenn du jede Aufgabe sauber in separate Funktionen oder Subs aufteilst, dann lässt sich dies auch einfach programmieren. Nur gibt es häufig Abhängigkeiten zwischen den Blöcken, so dass sich die Trennung nicht so strickt durchführen lässt.

Gruß

Rolf

StackDaniels
12.10.2007, 23:25
Und vielleicht kannst du durch eine geeignete Kombination der Schleifenbedingungen die beiden Schleifen zu einer zusammenfassen. (Ich kenn jetzt die Details deines Codes nicht, aber prinzipiell is das glaub ich schon möglich)

kolisson
13.10.2007, 00:19
irgenwie hatte er ja recht:



Moin!
Ich denke mal, dafür wären Interrupts gut, für den Timer z.B. einen (welch Überaschung) Timerinterrupt, und den Taster evtl. an einen Interruptfähigen Pin anschließen.
MfG
Volker

wenn man so die erste frage von hendrik87 betrachtet. ...

>>> auch jon hat recht: " zwei schleifen gehen nicht !"

es sei denn, die eine läuft innerhalb der anderen.


wenn man jedoch die zweite fragestellung von hendrik87 betrachtet..

ich quote mal:



Mit den zwei Schleifen sollte jetzt auch nur ein Beispiel sein. Ein anderes Beispiel wär z.B. das man bei einem Auto die eine Schleife die Geschwindigkeit errechnen lässt un die andere Schleife den Verbrauch und vielleicht eine dritte für die Menüführung. (Anzeigen aller Daten)
Naja, hatte jetzt nichts konkretes vor zu programmieren, nur ist mir die Frage irgendwie immer wieder hoch gekommen, weil man dann wohl so einiges leichter programmieren könnte.


käme ich eher zu dem schluss, dass hendrik87 zuviel schleifen im kopf hat.

eine ideale schleife ist eine wie folgt:

DO
LOOP

es passiert einfach nix.

dann kommen die int routinen:

die erste über timer (sagen wir mal 1 int je sekunde)
>>> wenn der mikro mit 1mhz getaktet ist und jeder befehl nur 1 takt wäre, würde er also 1.000.000 mal das "do loop " durchlaufen und dann einmal in die int-routine fallen. da ich nicht genau weiss, was bascon wann macht, kürzen wir die 1.000.000 einfach mal ganz sicher durch 1000.

selbst dann wird der mikro noch 1000mal je sekunde nichts machen ... also durch do... loop laufen.

jetzt nehmen wir in der int-routine die messwerte des benzinverbrauchs-sensors und die der geschwindigkeit.


um die werte sinnvoll zu machen, nehmen wir das mindestens 10 mal und bilden den mittelwert.



ein zweiter int bringt uns dann alle 12 sekunden auf die routine zur ausgabe auf das display.


so in etwa muss sowas laufen.


gruss klaus