-         

Ergebnis 1 bis 2 von 2

Thema: LOOP bleibt stehen??

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    LOOP bleibt stehen??

    Anzeige

    Hallo,

    der folgende Sketch zeigt das Listing auf einem Arduino Mega, der über die SS2 mit einem Uno Signale (ja, nein) austauscht und jeweils nur die Ausgänge 13 mit den LED's im 1 s-Rythmus ein/ausschaltet.
    Für mich nicht erklärbar ist Folgendes:
    direkt am Anfang der Loop befinden sich diese Befehle:
    Code:
      Serial.println(millis());    //    
      
      if  ((millis()  -  Zeit_alt) > 100)  {   
        Serial2.readString();      //   Puffer leeren muss vor "ja" senden stehen
        Serial2.println("ja");    //    A sendet an B  ein     ja
        Serial.println("Zeitueberschreitung");
        delay(20);                // Verzögerung, damit UNO reagieren kann. Ohne funktioniert das Programm nicht
    
      }   //******************     ENDE   if  ((millis()  -  Zeit_alt) > 2000.0)     */
    Wenn ich bei der SS2 den Tx am Mega unterbreche, erscheint auf dem SM des Mega wie erwartet die Fehlermeldung "Zeitueberschreitung" und natürlich die ms. Stelle ich die Verbindung wieder her, blinken die LED's wieder im gewohnten Takt.

    Unterbreche ich aber den Rx der SS2 am Mega, dann kommt die Meldung "Zeitueberschreitung" nicht und die Ausgabe der millis bleibt bei einem Wert stehen. Stelle ich die Verbindung wieder her, dann blinkt alles wieder ganz normal. Auch wenn ich in die Loop ein delay(50) einbaue, ist das Verhalten dasselbe.
    Ich interpretiere das so, dass der Mega in der Zeit steht. Vom Uno kommen während des Stillstands keine Telegramme, da der nur auf Telegramme vom Mega reagieren muss. Das kann ich auch an der Tx-LED des Uno erkennen.

    Versteht das jemand?

    Hier noch das Programm des Mega:

    Code:
    /*  Dieses Programm ist ein Test für die Kopplung 2er Arduinos über ihre seriellen Schnittstellen.
         Hier ist die SS2 benutzt =   Teilnehmer   A
         Die Initiierung der Schleife zwischen den beiden Teilnehmern erfolgt da durch,dass A ein ja sendet.
         Empfängt A ein    ja,  dann wird  ausgang an A HIGH gesetzt und sendet  an B ein    nein.
         Empfängt B ein    nein,  dann wird  ausgang an B LOW gesetzt und sendet  an A ein    nein.
         Empfängt A ein    nein,  dann wird  ausgang an A LOW gesetzt und sendet  an B ein    ja.
         Empfängt B ein    ja,  dann wird  ausgang an B HIGH gesetzt und sendet  an A ein    ja
         usw.
         Die LED's blinken dann bei 500 ms mit 1 Hz.
    */
    
    int ausgang = 13;        // dient zur Anzeige der Signale
    String Blinken = "ja";   // Variable, die die Info der Seriellen Schnittstelle vom anderen Teilnehmer aufnimmt
    String Laenge;
    unsigned long Zeit_alt = millis();
    
    void setup() {
    
      Serial.begin (250000);   // Start der Seriellen Schnittstelle zum eigenen Seriellen Monitor
      while (!Serial);
    
      Serial2.begin (9600);   // Start der Seriellen Schnittstelle zum Teilnehmer B
      while (!Serial);
    
      pinMode (ausgang, OUTPUT);  // Deklarierrung von ausgang = PIN 13 als OUTPUT
    
    
    }    //*****************  ENDE setup ****************************
    
    
    void loop() {
    delay(50);  
      Serial.println(millis());    //    
      
      if  ((millis()  -  Zeit_alt) > 100)  {   // muss größer 100 sein.
        //  muss außerhalb der available-Schleife stehen, damit auch ohne Empfang vom Uno gesendet wird.
    
        Zeit_alt = millis();
    
        Serial2.readString();      //   Puffer leeren muss vor "ja" senden stehen
        Serial2.println("ja");    //    A sendet an B  ein     ja
        Serial.println("Zeitueberschreitung");
        delay(20);                // Verzögerung, damit UNO reagieren kann. Ohne funktioniert das Programm nicht
    
      }   //******************     ENDE   if  ((millis()  -  Zeit_alt) > 2000.0)     */
    
    
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if (Serial2.available())       //   Abfrage, ob ein Signal von Teilnehmer B verfügbar?
      { 
        Blinken = Serial2.readStringUntil('\n');      //   der String enthält hinter dem gesendeten Text noch ein Steuerzeichen
        Serial.println(Blinken);
        Blinken.trim();                               // danach enthält Blinken nur den gesendeten Text
    
        Laenge = Blinken.length();
                                     //  die folgenden 5 Zeilen sind nur zur Info auf dem SM  
        Serial.print("Blinken53  =  ");
        Serial.println(Blinken);
    
        Serial.print("Laenge  =  ");
        Serial.println(Laenge);
    
    
        delay(500);
        Zeit_alt = millis();           //  muss hinter dem delay stehen
    
        if ((Blinken == "ja")  && (Laenge == "2")) {     //    Hat Teilnehmer B ein ja gesendet, dann  >>>>
          digitalWrite(ausgang, HIGH);
          Serial2.println("nein");   //    A sendet an B  ein     nein
    
    
        }   //******************     ENDE   if(Blinken == "ja")
    
        else   if ((Blinken == "nein")  &&  (Laenge == "4" )  ) {    //   Hat Teilnehmer B ein nein gesendet, dann  >>>>
          digitalWrite(ausgang, LOW);
          Serial2.println("ja");    //    A sendet an B  ein     ja
    
        }   //******************     ENDE   if(Blinken == "nein")
    
    
        Blinken = "x";
        Laenge = "";
    
    
      }    //  ***************ENDE    if (Serial2.available())  *************
      // das steht am Ende, damit Uno nur was sendet, wenn vom Mega was gekommen ist und nicht den Puffer vollschreibt, wenn nichts kommt
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    
    }   //******************     ENDE LOOP    *******************************
    Gruß

    fredyxx

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    601
    Hallo,

    ich denke UART-Schnittstellen sind nicht dazu gedacht mit offenen Eingängen betrieben zu werden. Das kann schon zu merkwürdigem Verhalten führen.

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 12.11.2010, 18:39
  2. Bascom-AVR bleibt stehen
    Von Magier6 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 02.06.2009, 22:49
  3. Motor bleibt plötzlich stehen
    Von sloti im Forum Motoren
    Antworten: 9
    Letzter Beitrag: 24.03.2008, 19:25
  4. i2csend - bleibt stehen
    Von sebastian.heyn im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 05.04.2007, 20:09
  5. Programm bleibt bei Getrc5 stehen
    Von Dane im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 22.12.2006, 10:02

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •