PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] zwei Unterprogramme sollen zur gleichen Zeit laufen



Gast
22.03.2004, 16:38
Hi,
ich schaffe es nicht zwei Unterprogramme auf der CC1 gleichzeitig laufen zulassen.

z.B die eine LED soll blinken und die andere soll 2 min an sein und danach
4 min an sein ( später: Motor läuft 2min mit 2 Volt dann 4min mit 4 Volt über PWM)

Das kann doch nicht so schwer sein! :oops:

MedanoCC
22.03.2004, 17:10
Das geht ja auch nicht! Die CC1 ist nicht Multithreadfähig. Auch kein preemptives MT ist vorhanden! So musst Du selber ein preemptives Multithreading erstellen.

Dazu z.B. einen Zähler laufen lassen, der bei jedem 2. Takt die eine LED an und ausmacht (toggled) und der Zähler soll bei jedem 6. Takt überprüfen, ob er die andere LED an oder ausmachen soll.
Stell Dir das so vor wie eine Zeitleiste, bei der Du einträgst, wann welcher "Thread" bearbeitet werden soll.

Manf
22.03.2004, 17:56
Die beiden Unterprogramme gehen nicht gleichzeitig, aber ein Scheduler der alle Events der Reihe nach abarbeitet sollte doch kein Problem sein.

Wenn es denn zwei getrennte Unterprogramme sein sollen, dann müssen sie halt in der kleinsten Zeiteinheit aufgerufen werden und selbst die notwendigen Ausgaben nach dem zentralen Timer durchführen und die Kontrolle sofort wieder zurückgeben.
Manfred

22.03.2004, 20:12
Ich dank Euch erstmal und werde alles nocheinmal überdenken.

Groß Ralf

recycle
22.03.2004, 22:40
z.B die eine LED soll blinken und die andere soll 2 min an sein und danach
4 min an sein ( später: Motor läuft 2min mit 2 Volt dann 4min mit 4 Volt über PWM)


Ich kenn mich zwar mit der C-Control nicht aus, aber ich vermute mal der Befehl "Pause"in deinem Quellcode, wird einfach nur bewirken, dass der Controler für die angegebene Zeit gar nichts macht, bzw. Nullrunden dreht.

Dass während einer Pause von 2 Minuten das 2. Unterprogramm auch nicht ausgeführt wird ist völlig klar.

Die C-Control kenn ich wie gesagt nicht, aber auf dem PC würde man den Rechner auch nicht 2 Minuten in einer Leerschleife rumrödeln lassen, sondern die Startzeit in einer Variablen speichern und dann in einer Schleife regelmässig abfragen, ob aktuelle Zeit minus der Startzeit = 2 Minuten ist.

Irgendsowas ähnliches wird bei der C-Control über einen Timer sicherlich auch möglich sein.

onkelotto
30.03.2004, 09:08
bin bislang lediglich lesender Teilnehmer dieses spannenden Forums, nun will ich mich auch mal einbringen.

@Gast

dein "Problem" läßt sich sich, wenn es wirklich nur um eine zeitabhängige Bedingung geht, wunderbar mit dem mod - Befehl lösen.

Beispiel:

Die Minute wird durch 15 geteilt. Bei der Division bleibt kein Rest (MOD 15 = 0) z.B. bei Uhrzeit 30 Minuten geteilt durch 15.

der code dazu sieht so aus:

if minute MOD 15 = 0 then goto irgendwohin

hier wird somit alle 15 minuten die Unterroutine irgendwohin angesprungen.

Das ganze kann man natürlich mit allen in CCBasic zur Verfügung stehenden Zeiteinheiten machen.

Gottfreak
30.03.2004, 10:04
Der Haken der Lösung mit MOD ist, dass auch genau in der Minute/Sekunde, die man gerne hätte, die Abfrage stattfinden müsste(wird diese erst in der nächsten Sekunde passiert, holt der Controller die Anweisung nicht nach.).
Geringfügig aufwändiger aber auch sicherer ist es, immer wenn ein paralllelprogramm aufgerufen wird, die Zeit zu speichern und regelmäíg zu überprüfen, wie lange das schon her ist. So in de Art:
if zeit > letztesmal + Intervall then...

onkelotto
30.03.2004, 13:40
das ist natürlich absolut richtig, der MOD Befehl ist in diesem Fall lediglich der kürzeste Weg um das Szenario mit unterschiedlich blinkenden LED´s in den Griff zu kriegen.