Zitat Zitat von Rabenauge Beitrag anzeigen
Echtes Multitasking funktioniert mit nem Single-Core nicht. Meine Lösung dürfte aber ein ziemlich guter Kompromiss sein, weil alles zeitkritische in separaten Tasks "am Stück" erledigt werden kann. Insofern lautet die halbe Antwort: ja.
Es ist egal, wie lange ein einzelner Task braucht.

bei der umstellung vom FB betrieb auf selbständiges fahren gibts probleme. Und zwar fährt der roboter "abschnittsweise", also stotternd. Der verursacher sind die aufrufe für die entfernungsmessung, ohne die pingabfragen fährt der ganz ok... Die frequenz des "stotterns" ist abhängig von der grösse des ping-intervalls...
---------------------------------------------------------------
@rabenauge: Kann ich solche programmabschnitte mit dem "timer-system" kombinieren, oder muss ich völlig umdenken? Es müsste z.b. noch die bewegung des Servos dazukommen..., da geht ja richtung kontinuierliche bewegung wahrscheinlich garnix...
Wie fragst Du die US module ab? nach der lib, oder anders?
---------------------------------------------------------------
das hier ist der haupt-fahrt-code welches aus der loop() aufgerufen wird:

Code:
void alle_motoren_vorwaerts_hindernis(void)
{
  currentMillis = millis();
  dauer_fahrt = 200;
  if (currentMillis - previousMillis > dauer_fahrt)
  {
    if (start_ping_rechts || start_ping_links == true)
    {
      aktuelle_ping_millis = millis();
      if (aktuelle_ping_millis - vergangene_ping_millis > interval_ping)
      {
        vergangene_ping_millis = aktuelle_ping_millis;
        ping_distanz_rechts();
        ping_distanz_links();
      }
    }
    //servo_und_ping();

    if (hindernis_rechts == true)
    {
      ausweichen_hindernis_rechts();
      hindernis_rechts = false;
    }
    if (hindernis_links == true)
    {
      ausweichen_hindernis_links();
      hindernis_links = false;
    }
    else
    {
      hindernis_rechts = false;
      hindernis_links = false;
      Serial.println("alle motoren vorwaerts_hindernis");

      vorwaerts();
    }
  }
}
vor dem start frage ich noch die US-module ab, der roboter soll ja nicht nach vorne anfahren, wenn er vor einer wand steht, die abfrage ist "entprellt", damit es nicht mehrere ergebnisse gibt, es wird für rechts und links abgefragt:

Code:
void hindernis_vorh_rechts_entprellt(void)
{
  if (start_ping_rechts == false)


    aktuelle_ping_millis = millis();
    if (aktuelle_ping_millis - vergangene_ping_millis > interval_ping)
    {
      vergangene_ping_millis = aktuelle_ping_millis; 
      ping_distanz_rechts();
    }

    if (uS_rechts != NO_ECHO)
    {
      if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0)
      {
        hindernis_rechts = true;
        mehrfach_zaehler_rechts = 1;
      }
      else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1)
      {
        mehrfach_zaehler_rechts = 0;
      }
    }
    else
    {
      if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1)
      {
        hindernis_rechts = false;
        mehrfach_zaehler_rechts = 0;
      }
      else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0)
      {
        mehrfach_zaehler_rechts = 1;
      }
    }
}
die eigentliche entfernung wird hiermit gemessen, auch wieder für rechts und links ausgelegt:

Code:
void ping_distanz_rechts(void)
{
  uS_rechts = sonar_rechts.ping();

  Serial1.print("Ping: ");
  Serial1.print(uS_rechts / US_ROUNDTRIP_CM);
  Serial1.println(" cm");
  Serial.print("Ping: ");
  Serial.print(uS_rechts / US_ROUNDTRIP_CM);
  Serial.println(" cm");

  delay(100); // hinzugefügt am 30.1.17 wg. doppelausweichen
  start_ping_rechts = true;
}
die ganzen prints habe ich auch schon mal auskommentiert, es ändert nichts an meinem problem...