Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: hwcom sync-Probleme? Kategorie: Programmierung (von André H. - 5.08.2003 9:59)
Als Antwort auf hwcom sync-Probleme? von skontox - 4.08.2003 11:59

Hallo skontox,

> Ich habe die CC2 mit einem Datenhandschuh über die RS232-Schnittstelle mit 9600 Baut gekoppelt!
> Problem ist, dass der Handschuh seine Daten permanent sendet (kein Empfang möglich!) und ich bei grö�eren
> Berechnungen mit den empfangenen Werten Probleme mit der Synkronisation mit dem Empfang habe.
> Bei kleineren Berechnungen läuft es ganz gut!

Wie oft sendet wird der Datenrahmen pro Sekunde gesendet ?
Wie lange dauert das Senden?
Gibt es eine Pause zwischen zwei Datenrahmen ?
Aus dem Quellcode konnte ich erkennen, daÃ? ein Datenrahmen 10 Byte hat
und folgenden Aufbau besitzt:
1.Byte Start-Kennzeichen: Wert 1
Byte 2 bis 9: 8 Datenbytes
10.Byte Ende-Kennzeichen: Wert 128

> Was kann man da machen? Wahrscheinlich ist mein Code auch nicht so super, aber auf die Schnelle
> viel mir nix besseres ein.
Was soll später, au�er dem Modell-Auto :-) , einmal gesteuert werden ?
Das Problem könnte die Rechenzeit werden.

Wenn zuviele Daten zu schnell ankommen, hiflt nur, daÃ? Du einen Teil davon auswertest, und
den Rest ignorierst.(Puffer regelmä�g mit hwcom.flush() leeren bis die daten wieder
ausgewertet werden sollen) Das geht natürlich nur, wenn der Datenhandschuh immer die
aktuelle Stellung der Hand sendet, und nicht die Bewegung selbst.

Zu hwcom:
Es reicht, wenn Du die Schnittstelle am Anfang des Mainthreads einmal initialisierst und die
Baudrate setzt. Hier solltest Du auch einmal mit hwcom.flush() den Empfangspuffer
leeren, wenn bereits vor dem System-Start der CC2 Daten empfangen werden.

Deine Hauptschleife kann man folgendermaÃ?en optimieren:
 ...
 byte errcnt;
 run 255;// Maximale Prio, nur bei Single-Thread Anwendungen empfohlen !
 hwcom.flush();
 errcnt=0;
 loop
 {
  wait hwcom.rxd();
  if hwcom.get()==1  //Endzeichen im Paket
   {
    wait hwcom.rxd();
    if hwcom.get()==128  //Startzeichen im Paket
    {
     errcnt=0;
     wait hwcom.rxd();hwcom.get(); //Byte 1 ignorieren
     wait hwcom.rxd();hwcom.get(); //Byte 2 ignorieren
     wait hwcom.rxd();hwcom.get(); //Byte 3 ignorieren
     wait hwcom.rxd();hwcom.get(); //Byte 4 ignorieren
     wait hwcom.rxd();hwcom.get(); //Byte 5 ignorieren

     wait hwcom.rxd(); //Byte 6
     wert= hwcom.get();//Enthält den "Pitch"-Wert Wert 255 ganz nach vorne gekippt!
                         //Wert 0 ganz nach hinten. 127 genau die Waage
     if wert>=130 and wert<=155 //Der Wagen soll nicht fahren!
      {
       ports.set(0,0); //Vorwärts ist aus
       ports.set(1,0); //Rückwärts ist aus
      }
      else
      if wert<130  //Der Wagen soll Rückwärts fahren
      {
       ports.set(0,0); //Vorwärts ist aus
       ports.set(1,1); //Rückwärts ist an
      }
      else
      if wert>155 //Der Wagen soll Vorwärts fahren
      {
       ports.set(1,0); //Rückwärts ist aus
       ports.set(0,1); //Vorwärts ist an
      }
     wait hwcom.rxd(); //Byte 7
     wert= hwcom.get();//Enthält den "Roll"-Wert Wert 255 ganz nach vorne gekippt!
                       //Wert 0 ganz nach hinten. 127 genau die Waage
     if wert>=100 and wert<=155 //Der Wagen soll nicht lenken!
      {
       ports.set(2,0); //Rechts ist aus
       ports.set(3,0); //Links ist aus
      }
     else
     if wert<100
      {
       ports.set(2,0); //Rechts ist aus
       ports.set(3,1); //Links ist an
      }
     else
     if wert>155
      {
       ports.set(3,0); //Links ist aus
       ports.set(2,1); //Rechts ist an
      }

     wait hwcom.rxd();hwcom.get(); //Byte 8 ignorieren
    }
    else
    {
     errcnt=errcnt+1;
     if errcnt>=20 break; // Schleife verlassen => keine sync möglich
    }
   }
   else
   {
    errcnt=errcnt+1;
    if errcnt>=20 break; // Schleife verlassen => keine sync möglich
   }
 }
 resume;
 ...

Ich habe hier die For-Schleife und die damit zusammenhängenden
If-Abfragen weggelassen, da diese zu viel Zeit in Anspruch nehmen.
Dafür wird öfters mit hwcom.get() gerabeitet.
Die Syncronisation habe ich auch angepasst. Selbst, wenn diese einmal
verlorengehen sollte, sollte der Datenrahmen wieder erkannt werden.
Dazu werden bis zu 20 Byte ausgewertet, um den Beginn eines Datenrahmen
zu finden. Wird dieser nicht gefunden, so wird die Schleife verlassen.

Wenn Du mit Multithreading arbeitest, solltest du die Prio des Loops etwas herabsetzen.
(statt run 255 z.B. run 128)
Du kannst die Eingelesenen Werte auch Global verfügbar machen, indem Du
statt auf diese zu reagieren, erstmal in ein Byte-Array schreibst, und dann mit
einem anderem Thread mit den Daten entsprechend "reagierst".
Hier könnte man zwar wieder mit einer For-Schleife arbeiten, jedoch sollten
die extra-Programmzeilen vorgezogen werden, um sich die Rechenzeit der For-Schleife
selbst zu sparen:

Mit For-Schleife:
for i=0 ... 7 {wait hwcom.rxd;Data[i]=hwcom.get();}


Ohne For-Schleife:
wait hwcom.rxd();
Data[0]=hwcom.get();
wait hwcom.rxd();
Data[1]=hwcom.get();
wait hwcom.rxd();
Data[2]=hwcom.get();
wait hwcom.rxd();
Data[3]=hwcom.get();
wait hwcom.rxd();
Data[4]=hwcom.get();
wait hwcom.rxd();
Data[5]=hwcom.get();
wait hwcom.rxd();
Data[6]=hwcom.get();
wait hwcom.rxd();
Data[7]=hwcom.get();



Ich hoffe, das hilft Dir weiter.
Probiere die abgeänderte Schleife einmal aus und schreib, ob's funzt. :-)

MfG André H.  


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: hwcom sync-Probleme? (von Fischi - 5.08.2003 13:40)