PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage zu programm



proevofreak
05.03.2008, 20:42
hallo leute, hab grad folgendes wahrscheinlich für die meisten von euch recht einfaches programm geschrieben..... nun würde ich gerne wissen warum das led lauflicht in diesem programm nicht funktioniert?

#include "RP6RobotBaseLib.h"



int main(void)
{
initRobotBase(); // Mikrocontroller initialisieren


startStopwatch1(); // Stopwatch1 starten!
powerON();


uint8_t runningLight = 1;

while(true)
{move(60, FWD, DIST_MM(300), true);
rotate(50, LEFT, 180, true);
// Ein kleines LED Lauflicht:
if(getStopwatch1() > 100) // Sind 100ms (= 0.1s) vergangen?
{
setLEDs(runningLight); // LEDs setzen
runningLight <<= 1; // Nächste LED (shift Operation)
if(runningLight > 32) // Letzte LED?
runningLight = 1; // Ja, also wieder von vorn beginnen!
setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
}
}
return 0;
}

radbruch
05.03.2008, 21:53
Hallo


nun würde ich gerne wissen warum das led lauflicht in diesem programm nicht funktioniert?
Du meinst vermutlich, warum die LEDs während der Fahrt nicht laufen. Das liegt am true in move() und rotate(). Mit diesen true wird der blockierende Modus dieser Funktionen eingeschaltet, das bedeutet, der RP6 macht nicht anderes bis das Ziel der jeweiligen Fahrt erreicht ist.

Mit einem false als Parameter und dem Task-System des RP6 kann man das ändern. Allerdings muss man dann dafür sorgen, das der entsprechende Task (in diesem Fall "task_motionControl()") regelmässig aufgerufen wird:


#include "RP6RobotBaseLib.h"



int main(void)
{
initRobotBase(); // Mikrocontroller initialisieren


startStopwatch1(); // Stopwatch1 starten!
powerON();


uint8_t runningLight = 1;

while(true)
{
move(60, FWD, DIST_MM(300), false);
while(!isMovementComplete()) // solange wir fahren
{
// Ein kleines LED Lauflicht:
if(getStopwatch1() > 100) // Sind 100ms (= 0.1s) vergangen?
{
setLEDs(runningLight); // LEDs setzen
runningLight <<= 1; // Nächste LED (shift Operation)
if(runningLight > 32) // Letzte LED?
runningLight = 1; // Ja, also wieder von vorn beginnen!
setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
}
task_motionControl();
}
rotate(50, LEFT, 180, false);
while(!isMovementComplete()) // solange wir fahren
{
// Ein kleines LED Lauflicht:
if(getStopwatch1() > 100) // Sind 100ms (= 0.1s) vergangen?
{
setLEDs(runningLight); // LEDs setzen
runningLight <<= 1; // Nächste LED (shift Operation)
if(runningLight > 32) // Letzte LED?
runningLight = 1; // Ja, also wieder von vorn beginnen!
setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
}
task_motionControl();
}
}
return 0;
}

Gruß

mic

proevofreak
06.03.2008, 19:51
danke für deine antwort hat mir weitergeholfen.... mich würde jetzt nur noch interessieren wie du auf while(!isMovementComplete()) kommst? hab ich des in der library übersehen oder woher hast du diese schleifenbezeichnung? gruß

radbruch
06.03.2008, 19:58
Hallo

Das ist eine kleine Funktion in der Lib:


/**
* You can use this function to check if there is any movement going on or if
* every operation like moving a specific distance or rotating has been finished.
*/
inline uint8_t isMovementComplete(void)
{
return !(motion_status.move_L || motion_status.move_R);
}

Aus RP6RobotBaseLib.c v1.3 Zeile 736ff

Hab' ich mal in den Demos gesehen (glaube ich).

Gruß

mic