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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.