Hallo SlyD,
wegen der Schleifen und der Blocking Funktion zum Thema: Stopwatch wird ignoriert/ falsch interpretiert:
Ich habe einen neuen Zustand definiert, welcher den Stopwatch bis 5000ms höchzählen enthält. Dieser wird ohne Blocking Funktion übersprungen.
Übersehe ich da etwas?Code:void behaviour_avoid(void) { static uint8_t last_obstacle = LEFT; static uint8_t obstacle_counter = 0; switch(avoid.state) { case IDLE: if((obstacle_right && obstacle_left) || (srf_middle_avoid) || (srf_middle_avoid && srf_left_avoid && srf_right_avoid)) // Wenn Sensoren ACS und SRF08 { avoid.state = AVOID_OBSTACLE_MIDDLE_WAIT;} else if((obstacle_left) || (srf_left_avoid)) // Sensor Links ACS und SRF08 avoid.state = AVOID_OBSTACLE_LEFT; else if((obstacle_right) || (srf_right_avoid)) // Sensor Rechts ACS und SRF08 avoid.state = AVOID_OBSTACLE_RIGHT; break; case AVOID_OBSTACLE_MIDDLE_WAIT: moveAtSpeed(0,0); { setStopwatch4(400); startStopwatch4(); avoid.state = AVOID_OBSTACLE_MIDDLE_MIDDLE; } setStopwatch5(0); case AVOID_OBSTACLE_MIDDLE_MIDDLE: startStopwatch5(); if((getStopwatch5() >=5000)) { setStopwatch4(400); startStopwatch4(); avoid.state = AVOID_OBSTACLE_MIDDLE; } break; case AVOID_OBSTACLE_MIDDLE: avoid.dir = last_obstacle; avoid.speed_left = AVOID_SPEED_ROTATE; avoid.speed_right = AVOID_SPEED_ROTATE; if(!(obstacle_left || obstacle_right || srf_middle_avoid)) { if(obstacle_counter > 3) { obstacle_counter = 0; setStopwatch4(0); } else setStopwatch4(400); startStopwatch4(); avoid.state = AVOID_END; } break; case AVOID_OBSTACLE_RIGHT: avoid.dir = FWD; avoid.speed_left = AVOID_SPEED_L_ARC_LEFT; avoid.speed_right = AVOID_SPEED_L_ARC_RIGHT; if((obstacle_right && obstacle_left) || (srf_middle_avoid)) avoid.state = AVOID_OBSTACLE_MIDDLE_WAIT; if(!obstacle_right) { setStopwatch4(500); startStopwatch4(); avoid.state = AVOID_END; } last_obstacle = RIGHT; obstacle_counter++; break; case AVOID_OBSTACLE_LEFT: avoid.dir = FWD; avoid.speed_left = AVOID_SPEED_R_ARC_LEFT; avoid.speed_right = AVOID_SPEED_R_ARC_RIGHT; if((obstacle_right && obstacle_left) || (srf_middle_avoid)) avoid.state = AVOID_OBSTACLE_MIDDLE_WAIT; if(!obstacle_left) { setStopwatch4(500); startStopwatch4(); avoid.state = AVOID_END; } last_obstacle = LEFT; obstacle_counter++; break; case AVOID_END: if(getStopwatch4() > 1000) { stopStopwatch4(); setStopwatch4(0); avoid.state = IDLE; } break; } }
Gruß
Mac80







Zitieren


Lesezeichen