NXT / NXC: Mehrere Motoren gleichzeitig fahren?

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Klingelikoer
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 12. Jan 2016 16:55

NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon Klingelikoer » 12. Jan 2016 19:51

Hallo an Alle,

ich bin relativ Neu in der Geschichte NXT, auch wenn er schon ne weile zu Hause rumliegt...

Das Thema "Mehrere Motoren gleichzeitig fahren" ist für mich gerade auch aktuell.
Nun habe ich mir den Codeausschnitt von "robofreak" mal etwas genauer angeschaut, und selbst ein wenig erweitert.

Mir fiel dabei allerdings das Problem auf, dass nach einmaligem Aufrufen, beim zweiten Mal die Motoren nicht mehr angesteuert und das Programm nach gewisser Zeit beendet wird. Alles wäre alles gefahren.

Ich hab dies mit dem Orginalen, und meinem veränderten Programm getestet.
Die Art des Tests sah in etwa so aus:

*Geschwindigkeiten vorgeben (positiv)
=> Void starten
*Geschwindigkeiten vorgeben (negativ)
=> Void starten (Keine Bewegung, nur Programmende)

Wurde diese Eigenart schon mal beobachtet? Hat da jemand schon mal was drüber berichtet?

Gruß

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage zur Programmierung vom NXT

Beitragvon HaWe » 12. Jan 2016 20:16

hallo,
welche Programmiersprache?
Bitte auch den Code posten!
(und bitte keine Fragen an uralt-Topics dranhängen, sondern ein neues Topic erstellen!)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Klingelikoer
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 12. Jan 2016 16:55

Re: Frage zur Programmierung vom NXT

Beitragvon Klingelikoer » 13. Jan 2016 18:41

Hallo,

vielen Dank für die Info!
Anbei nun mal der Programmauschnitt. Dieser war nur zum Testen da, gibt also keine großen Verzweigungen..
Der Baustein tut was er soll, passt die Richtung anhang der positiven/negativen Geschwindigkeit an. Auch die Gradzahlen sollten passen.
Allerdings alles halt nur ein mal..

Programmiert wurde wie zu sehen mit BricxCC in NXC.

Schönen Abend, Gruß
Dateianhänge
Programmausschnitt.png

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon HaWe » 13. Jan 2016 19:23

Hallo!
bitte poste den Code als Text, nicht als Foto - das kann man nicht vernünftig lesen.
Und dann bitte in Code-Tags einschließen, dass die Formatierung erhalten bleibt!
Als Titel muss es dann am besten heißen:

"NXT / NXC: Mehrere Motoren gleichzeitig fahren?"
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Klingelikoer
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 12. Jan 2016 16:55

NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon Klingelikoer » 13. Jan 2016 20:38

Hallo,

leider bin ich nicht so oft in Foren unterwegs, daher nicht so vertraut mit solchen Darstellungen.
Sorry - und Danke für die Tipps.

Nun hoffentlich besser lesbar:

Code: Alles auswählen

 //Vars Anfang
#define Pos_m1 100
#define Pos_m2 160
#define Pos_m3 190
int V_m1 = 0;
int V_m2 = 0;
int V_m3 = 0;
//Vars Ende

// Antriebsbaustein Motoren
void rotate_engines(byte port1,int deg1,int v1,byte port2,int deg2,int v2,byte port3,int deg3,int v3)
{
/***********************************************
Antriebsbaustein zum Ansteuern von Motoren 1-3
Nichtbenutzte Motoren ==> V = 0 & Winkel = 0

***********************************************/
 ResetRotationCount(port1);
 ResetRotationCount(port2);
 ResetRotationCount(port3);

 if((v1!=0)&&(deg1!=0))    OnFwd(port1,v1);  //Motoren nur einschalten wenn
 if((v2!=0)&&(deg2!=0))    OnFwd(port2,v2);  //Winkel & Geschwindigkeit angegeben wurde.
 if((v3!=0)&&(deg3!=0))    OnFwd(port3,v3);

 do  {             //Bei Erreichen der Winkel Motoren abschalten.
   if((abs(MotorRotationCount(port1))>=deg1)||(v1==0)||(deg1==0))  Off(port1);
   if((abs(MotorRotationCount(port2))>=deg2)||(v2==0)||(deg2==0))  Off(port2);
   if((abs(MotorRotationCount(port3))>=deg3)||(v3==0)||(deg3==0))  Off(port3);
     }             //'do' wird nur ausgeführt solange Winkel <= ist und Winkel und Geschwindigkeit ungleich 0 sind. (Seperat für jeden Antrieb)
 while((abs(MotorRotationCount(port1))<= (deg1+1))||(abs(MotorRotationCount(port2))<= (deg2+1))||(abs(MotorRotationCount(port3))<= (deg3+1)))
}

task main()
{
//Zwei Achsen "gleichzeitig" ausfahren
       V_m1 =  0;
       V_m2 = 30;
       V_m3 = 30;
       rotate_engines(OUT_A,Pos_m1,V_m1,OUT_B,Pos_m2,V_m2,OUT_C,Pos_m3,V_m3);
       Wait(2000);
//Zwei Achsen "gleichzeitig" einfahren
       V_m1 =  0;
       V_m2 = -30;
       V_m3 = -30;
       rotate_engines(OUT_A,Pos_m1,V_m1,OUT_B,Pos_m2,V_m2,OUT_C,Pos_m3,V_m3);
       Wait(2000);
}


Gruß

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon HaWe » 13. Jan 2016 20:55

danke, damit kann man arbeiten! 8-)

ja, das kann man prinzipiell so machen, erfordert aber noch einiges an Nach-Arbeiten....
allerdings bietet NXC auch Funktionen
a) zum Synchronisieren und
b) zum völlig unabhängig laufen lassen.

Letzteres macht man am besten, indem man für jeden Motor einen eigenen Task startet, der solange arbeitet, bis der Motor sein Ziel erreicht hat.

Code: Alles auswählen

char OUTA_busy=0, OUTB_busy=0;


task OUTA_task() {
   OUTA_busy=1;
   //... dein code
   OUTA_busy=0;
}

task OUTB_task() {
   OUTB_busy=1;
   //... dein code
   OUTB_busy=0;
}


Solange einer läuft, setzt er seine entsprechende globale Variable ("semaphor") auf OUTA_busy=1 bzw OUTB_busy=1,
sobald der jeweilige fertig ist, auf OUTA_busy=0 bzw OUTB_busy=0.

Dann wartet man, bis beide semaphore auf Null sind und macht dann weiter:

Code: Alles auswählen

start OUTA_task;
start OUTB_task;
while( OUTA_busy || OUTB_busy );


muss man vorzeitig einen Task abbrechen, geht das jederzeit mit
stop OUTA_task; // bzw. OUTB_task


Hilft das?
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon HaWe » 13. Jan 2016 21:20

ps,
da man an NXC-tasks keine Variablen übergeben kann, muss man hier globale Variablen als Steuer-Parameter setzen, auf die dann der betr. Task zugreifen kann.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Klingelikoer
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 12. Jan 2016 16:55

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon Klingelikoer » 13. Jan 2016 21:27

Ich werde es morgen mal testen.
Globale variablen? - Wie werden die denn angelegt?

Zu tasks werde ich sicher auch nebenbei was in diversen Tutorials finden, soweit ich mich erinnere war dort allerdings immer nur ein Beispiel ohne variablen/Werten von außen.

Gruß

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon HaWe » 13. Jan 2016 21:46

die globalen Variablen werden wie immer in C außerhalb / oberhalb einer Funktion deklariert, wie ich es oben bei
char OUTA_busy, OUTB_busy;
gemacht habe.

Und weil tasks eben keine Übergabe-Variablen bekommen können, müssen sie sie als globale Variablen verabreicht bekommen.

Multitasking ist essentiell wichtig, einfache Demo-Beispiele sind hier:
viewtopic.php?f=25&t=4937#p59599
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Klingelikoer
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 12. Jan 2016 16:55

Re: NXT / NXC: Mehrere Motoren gleichzeitig fahren?

Beitragvon Klingelikoer » 13. Jan 2016 22:01

Gut dann stand ich nur auf dem Schlauch.
So habe ich sie in meinem Beispiel ja auch schon deklariert.
Falls es nochmal zu ner Frage kommt melde ich mich nochmal.
Bis dahin: Vielen Dank und schönen Abend.


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss