Forum: Mikrocontroller und Digitale Elektronik RP6 While-Schleife


von Nico N. (nico_n)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe bei diesem Programm ein Problem mit der while-Schleife.
Das Programm soll so funktionieren:
solange kein Objekt links oder rechts ist, soll er mit Speed(200,200)
fahren. Ist links oder rechts ein Objekt, soll er in die entsprechend 
andere Richtung drehen.

Leider fährt er ohne Reaktionen mit Speed(200,200) immer weiter.

Vielen Dank schon mal im Voraus.

von SlyD (Gast)


Lesenswert?

Hallo,

Du solltest Dir das "Task" System des RP6 nochmal anhand der 
Beispielprogramme. genauer anschauen.  Füge auch Ausgaben über die 
serielle Schnittstelle ins Programm ein oder lass zumindest die LEDs 
passend zum Programmzustand aufleuchten damit Du siehst was intern vor 
sich geht.


Das task System ist ja dazu da, dass man mehrere Dinge nebenläufig 
erledigen kann (Motoren regeln, IR Sensoren abfragen, allgemeine 
Programmlogik ausführen) - Du mischst es aber mit blockierenden 
Funktionen (rotate/move(...,BLOCKING)).
Das geht zwar, aber man muss das task System schon verstanden haben um 
das richtig anwenden zu können.


task_RP6System sollte eigentlich nur an einer Stelle in jeder(!) 
Endlosschleife aufgerufen werden.
Die anderen Funktionen zum Steuern des Roboters wie moveAtSpeed usw. 
werden nur dann aufgerufen wenn sich irgendwas ändert (Sensorwert, 
Timerwert,...). Sollte man nicht dauernd aufrufen.
Kann man zwar machen, aber es ist unnötig und funktioniert so evtl. 
nicht wie gewünscht.

Das hier:
 while(!obstacle_left || !obstacle_right)
 {moveAtSpeed(100,100);}

wird schon das "Ende" des Programms sein sobald einmal ein Hindernis 
erkannt wird.
Denn das ACS wird hier nie wieder aktualisiert und der moveAtSpeed 
Befehl hat ebenfalls keine Auswirkung (weil task_RP6System nicht 
aufgerufen wird) und es bleibt dann einfach in der Schleife hängen.


Eine andere Sache ist das Umschalten von
setACSPwrMed(); auf setACSPwrLow();
in dem Programm. Lass das lieber erstmal weg und bekomm es ohne ans 
laufen (wenn alles andere mal tut, dann kannst Du das wieder probieren). 
Das wird so nämlich nicht das bewirken was Du Dir gedacht hast.
task_RP6System direkt nach dem Umschalten der Reichweite EINMAL aufrufen 
und dann sofort abfragen ob sich was geändert hat funktioniert nicht, 
das ACS braucht mehrere 10 Millisekunden bis sich der Zustand 
aktualisiert, da kannst Du die Funktion tausende male aufrufen ohne das 
sich was ändert. Die CPU arbeitet sehr schnell, die Sensoren sind im 
Vergleich dazu sehr langsam...

Hoffe das hilft Dir weiter.

MfG,
SlyD

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
Noch kein Account? Hier anmelden.