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);
}
Lesezeichen