Re: noch mal threads Kategorie: Programmierung (von ChristianS - 1.12.2010 19:33) | ||
Als Antwort auf Re: noch mal threads von nitraM - 28.11.2010 16:10 | ||
| ||
Hallo, danke für die Antwort, kann aber noch nicht ganz folgen...ich warte auf eine steigende Flanke oder einen kurzen Impuls und setzte mein "busy". Das "busy" schaltet dann über die Funktion "light()" das Licht ein, und der der Timeout-Timer startet. I.d.R kommt aber direkt nach der steigenden Flanke die fallende Flanke. Dadurch wird der Timer für die Ausschaltverzögerung gestartet. Das geschieht über detect=1. Wenn jetzt aber die steigende Flanke nur über den Impuls erkannt wird, dann gibt es keine fallende Flanke und ich warte bis in alle Ewigkeit. Also, irgendwie kann ich noch nicht folgen mit dem "Verodern" Hier mal der Code: thread Monitoring /******************************************************************************/ /* IR-Port-�berwachung */ /******************************************************************************/ { run 100; wait (ports.get(ir) or ports.getcount(ir)>0) 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 ports.getcount(ir); //Zähler am Port zurücksetzen busy=0; detect=1; //Impuls erkannt! } ... function light () { ...... } 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); } } Gru�, ChristianS. > > 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. > > Hallo Christian, > so wie jetzt dein Problem verstehe reicht es doch wenn du die beiden Sachen "veroderst"... > => bei sehr kurzen Impulsen Zählt dein Zähler => Licht für die entsprechende Zeit ein > ODER > => bei erkannten Flanken => Licht ein > > Bei blockierter LS kein Zähler und keine fallende Flanke... => kein Licht... > > > nitraM | ||
Antwort schreiben Antworten: |