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

Re: noch mal threads Kategorie: Programmierung (von ChristianS - 25.11.2010 17:18)
Als Antwort auf noch mal threads von ChristianS - 19.11.2010 9:42
Ich nutze:
C-Control II Station, OSOPT V3.1
Hallo,
ich habe die Sache jetzt umgestrickt und es funzt auch zu 98% ganz gut. Das fuchst micht
natürlich, da 100% das Ziel ist und es doch noch vorkommt, dass man durch die IR geht und
das Licht nicht einschaltet.Deshalb geht mir die Sache mit dem Zähler nicht aus dem Sinn.
Der ist so rattenschnell, dass selbst ein Schuss durch den Lichtstrahl, z.B. aus einer Schleuder,
erkannt wird. Das hätte ich nicht gedacht.

Allerdings kann ich das in der Form nicht gebrauchen, da ich auf "fallende" und "steigende"
Flanke reagieren muss..
Das Licht wird bei einer High-Flanke einschaltet,und bei der Low-Flanke starten ein Timer
der die Ausschaltverzögerung bestimmt. Da kann ich mit einem Zählimpuls erstmal nichts anfangen.
AuÃ?erdem messe ich noch die Zeit zwischen "High" und "Low"-Flanke, da der Lichtstrahl auch
unerwünscht unterbrochen werden kann, wenn z.B. Gegenstände dazwischengestellt werden,
oder, wie im letzten Winter, der Schnee zu hoch wird. Dann soll es später einen Timeout geben
und das Licht geht so lange aus, bis der Fehler behoben ist. Zusätzlich zur IR, gibt es einen
Reed-Kontakt an der Haustür (reed) und einen Schalter (ist ein Taster, deshalb schalter.flag)
der das Licht schaltet.

//Modul ir
thread Monitoring
/******************************************************************************/
/*                    IR-Port-Ã?berwachung                                     */
/******************************************************************************/
{
 run 100;
 wait ports.get(ir)and !busy;     //warten auf Unterbrechung
  t1=system.timer();              //Zeitpunkt der steigenden Flanke in Variablen
  busy=1;
 wait !ports.get(ir)and busy;     //warten auf Freigabe
  t2=system.timer();              //Zeitpunkt der fallenden Flanke in Variablen
  busy=0;
  detect=1;                       //Impuls erkannt!
}
...
function light ()
{
 if system.year()> global.year
  {
   hwcom.print("Prosit Neujahr!rn");
   global.year=system.year();
   reed.detect=0;
   ir.detect=0;
   time.Reset(1);
   schalter.Reset(0);
   global.set=1;                           //Licht "an" setzten
   global.t2=global.timer2;                //Timer 2 starten
  }
 if global.t2<=0                           //nur wenn Timer 2 inaktiv
  {
   if ((check.Night() and(reed.busy or ir.busy)) or schalter.Read(0,1))
    {
     time.Reset(1);                        //Timer zurücksetzten
     global.set=1;                         //Licht "an" setzten
    }
   if check.Night()
    if reed.detect or ir.detect             //fallende Flanke an IR oder Reed
     global.t1=global.timer1;               //Timer 1 nur bei Nacht starten
   reed.detect=0;                           //Flag zurücksetzetn
   ir.detect=0;
  }
  if global.tflag1 or global.tflag2 or(!schalter.Read(0,1) and schalter.flag[0])
   {
    time.Reset(1);
    time.Reset(2);
    global.set=0;                             //Licht "aus" setzen
    schalter.Reset(0);
   }

  if global.set
  {
   hsrel8.On(hsrel8.aussenlicht);
  }
  else
  {
   hsrel8.Off(hsrel8.aussenlicht);
  }
 }





> Hallo,
> ich komme mit meinem zeitkritischen thread nicht weiter. Ich habe nun die Prios von allen
> threads auf "8" gesetzt und den zeitkrischen thread (ir) auf prio 100, main läuft ganz normal.
> Das Problem ist weiterhin, dass der thread "ir" es teilweise nicht mitbekommt, wenn man die
> Lichtschranke schnell durchschreitet.
> Vielleicht ist die cc2 auch überfordert, was ich mir aber nicht vorstellen kann, da das
> Gesamtprogramm gerade mal 23k ist. Ich schätze es liegt an der Art der Programmierung.
> Dehalb hier meine Routine, vielleich kann jemand etwas erkennen oder kann einen Tipp geben:
>
> thread "ir" fragt eine Lichtschranke am  Port P1, Pin 47 der CC2-Station ab. Das Flag "detect"
> wird dann in einer Funktion (light) genutzt um eine Beleuchtung einzuschalten, die über
> einen Timer nachgetriggert wird. Ich denke aber, das Problem ist der IR thread.
>
> /******************************************************************************/
> /*    Auswertung der Lichtschranke                                            */
> /******************************************************************************/
> {
>  long t;
>  t=timeout;                                //von int nach long konvertieren
>  t=t*1000;
>  run 100;
>  if check.night()                             //IR nur während der Nacht
>   {
>    if ports.get(ir) and !busy              //warten auf seigende Flanke
>     {
>      busy=1;                               //Ir() hat High-Pegel
>      time=system.timer();                     //Zeitpunkt der steigenden Flanke
>      //hwcom.print(" IR steigende Flankern");
>     }
>    if !ports.get(ir) and busy              //warten auf fallende Flanke
>     {
>     busy=0;
>     detect=1;                          
>      //hwcom.print(" fallende Flankern");  
>      }
>   if busy
>    if system.timer()-time > t                //...allerdings bei Timeout...
>     error=1;                            //..FehlerCode zurückgeben.
>   }
>  else
>  {
>    busy=0;
>    error=0;                               //IR am Tag inaktiv
>    global.detect=0;
>  }
> }
> /******************************************************************************/
> ....
> function light ()
> {
>  if system.year()> global.newYear
>   {
>    hwcom.print("Prosit Neujahr!rn");
>    global.newYear=system.year();
>    global.detect=0;
>    ir.detect=0;
>    time.Reset(1);
>    schalter.Reset(0);
>    global.set=1;                           //Licht "an" setzten
>    global.t2=global.timer2;
>   }
>  if global.t2<=0                           //nur wenn Timer 2 inaktiv
>   {
>    if ((check.night() and(reed_busy or ir.busy)) or schalter.read(0,1))
>     {
>     time.Reset(1);                          //Timer zurücksetzten
>     global.set=1;                           //Licht "an" setzten
>     global.detect=0;
>     ir.detect=0;                         //Auslösung zurücksetzen
>     }
>   if global.detect or ir.detect                          //fallende Flanke an IR oder Reed
>    if check.night()
>      global.t1=global.timer1;               //Timer 1 nur bei Nacht starten
>    global.detect=0;                         //Flag zurücksetzetn
>    ir.detect=0;
>   }
>   if global.tflag1 or global.tflag2 or(!schalter.read(0,1) and schalter.flag[0])
>    {
>     time.Reset(1);
>     time.Reset(2);
>     global.set=0;                             //Licht "aus" setzen
>     schalter.Reset(0);
>    }
>



    Antwort schreiben


Antworten:

Re: noch mal threads (von nitraM - 28.11.2010 16:10)
    Re: noch mal threads (von ChristianS - 1.12.2010 19:33)