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 | ||
| ||
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) |