-
Vielen Dank für Deine Antwort
Leider geht beim ersten Programm das ACS garnicht. Bei meinem Programm hat es wie, du schon gesagt hast das ACS nur immerwieder mal aufgerufen.
Woran könnte es liegen?
Also Roboter fährt ganz normal geradeaus, Rudermaschine dreht sich jedoch reagieren weder Bumper noch ACS
-
Seltsam, dass es überhaupt mal funktioniert hatte:
Code:
powerON();
enableACS();
setACSPwrHigh();
Ich habe meinen RP6 jetzt auch mal aktiviert. Mit der Änderung oben sehe ich mit der Digicam die ACS-LEDs blinken. Wenn ich mit der TV-Fernbedienung auf den IR-Empfänger ziele, dann startet er auch das ACS-Ausweichprogramm. Aber sonst tut sich nichts. Selbst so nicht:
Code:
while(1)
{
//setLEDs(0b100100);
task_ACS();
if(obstacle_right || obstacle_left) setLEDs(63); else setLEDs(0b100100);
task_RP6System();
Wenn ich nun die Bumpers betätige, startet er das Bumpersprogramm, wenn ich loslasse, wechselt er zum ACS-Programm?! setLEDs(63) kommt gar nicht.
Muss ich mal forschen, was da nicht funzt. Bin wohl etwas aus der Übung :)
Gruß
mic
-
Oje:
Code:
#include "RP6RobotBaseLib.h"
uint8_t i, servoposition;
void acsStateChanged(void)
{
setLEDs(8);
if(obstacle_right && obstacle_left) // beide Seiten?
rotate(60, RIGHT, 100, true);
else if(obstacle_left) // nur links
rotate(80, RIGHT, 50, true);
else if(obstacle_right) // bleibt nur noch rechts übrig
rotate(80, LEFT, 50, true);
changeDirection(FWD); // weiterfahren
moveAtSpeed(100,100);
}
void bumpersStateChanged(void)
{
setLEDs(1);
if(bumper_left || bumper_right)
{
changeDirection(BWD);
move(100, BWD, DIST_MM(200), true);
rotate(50, RIGHT, 120, true);
}
changeDirection(FWD);
moveAtSpeed(100,100);
}
int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(500);
setLEDs(0b001001);
DDRA |= 1;
BUMPERS_setStateChangedHandler(bumpersStateChanged);
ACS_setStateChangedHandler(acsStateChanged);
powerON();
enableACS();
setACSPwrLow();
changeDirection(FWD);
moveAtSpeed(100,100);
servoposition=0; // 0 ist sleep(8), 1 ist sleep(23)
startStopwatch1(); // Stoppuhr starten
while(1)
{
setLEDs(0b100100);
task_RP6System();
//sleep(50); // das Tasksystem muss man nicht so häufig aufzurufen
if(getStopwatch1() > 2000) // zwei Sekunden sind vorbei
{
setStopwatch1(0); // Stoppuhr zurücksetzen
setLEDs(0b010010);
for(i=0; i<50; i++) // ein Sekunde lang Servo bewegen
{
PORTA |= 1;
if(servoposition) sleep(23); else sleep(8);
PORTA &= ~1;
sleep(100); // Impulspause ist sleep() und Task zusammen!
task_RP6System(); // beim Servoschwenken weiterfahren
}
if(servoposition) servoposition=0; // andere Servoposition wählen
else servoposition=1;
}
}
return(0);
}
Man sollte eben mit dem Tasksystem kein sleep() verwenden ;)
-
Irgendwie wird's nicht wirklich besser, ich breche hier mal ab:
Code:
#include "RP6RobotBaseLib.h"
uint8_t i, servoposition;
void acsStateChanged(void)
{
setLEDs(statusLEDs.byte | 0b001001);
if(obstacle_right && obstacle_left) // beide Seiten?
rotate(60, RIGHT, 100, true);
else if(obstacle_left) // nur links
{
setLEDs(statusLEDs.byte & ~1);
rotate(80, RIGHT, 50, true);
}
else if(obstacle_right) // bleibt nur noch rechts übrig
{
setLEDs(statusLEDs.byte & ~8);
rotate(80, LEFT, 50, true);
}
setLEDs(statusLEDs.byte & ~0b001001);
changeDirection(FWD); // weiterfahren
moveAtSpeed(100,100);
}
void bumpersStateChanged(void)
{
setLEDs(statusLEDs.byte | 0b001001);
if(bumper_left || bumper_right)
{
changeDirection(BWD);
move(100, BWD, DIST_MM(200), true);
rotate(50, RIGHT, 120, true);
}
setLEDs(statusLEDs.byte & ~0b001001);
changeDirection(FWD);
moveAtSpeed(100,100);
}
int main(void)
{
initRobotBase();
setLEDs(0b111111);
DDRA |= 1;
BUMPERS_setStateChangedHandler(bumpersStateChanged);
ACS_setStateChangedHandler(acsStateChanged);
powerON();
enableACS();
setACSPwrMed();
mSleep(500);
setLEDs(0b000000);
changeDirection(FWD);
moveAtSpeed(100,100);
servoposition=8;
startStopwatch1(); // Stoppuhr starten
while(1)
{
task_RP6System();
if(getStopwatch1() > 2000) // zwei Sekunden sind vorbei
{
setStopwatch1(0); // Stoppuhr zurücksetzen
if(servoposition==8) // Servoseite anzeigen
setLEDs((statusLEDs.byte & ~16) | 2);
else
setLEDs((statusLEDs.byte & ~2) | 16);
for(i=0; i<50; i++) // ein Sekunde lang Servo bewegen
{
PORTA |= 1; // Impuls senden
cli(); // vorsichtshalber atomar
timer=0; // timer wird in ISR alle 100µs inkrementiert
sei();
while(timer < servoposition) task_RP6System();
PORTA &= ~1; // Impulspause
cli(); // vorsichtshalber atomar
timer=0; // timer wird in ISR alle 100µs inkrementiert
sei();
while(timer < (200-servoposition)) task_RP6System();
}
if(servoposition==8) servoposition=23; // andere Servoposition wählen
else servoposition=8;
}
if((getStopwatch1() % 125) == 0) // Betriebsanzeige
{
if(statusLEDs.byte & 4)
setLEDs((statusLEDs.byte & ~4) | 32); // (Spielerei :)
else // krass!
setLEDs((statusLEDs.byte & ~32) | 4);
}
}
return(0);
}