noch mal threads Kategorie: Programmierung (von ChristianS - 19.11.2010 9:42) | ||
| ||
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 ChristianS - 25.11.2010 17:18) Re: noch mal threads (von nitraM - 28.11.2010 16:10) Re: noch mal threads (von ChristianS - 1.12.2010 19:33) Re: noch mal threads (von nitraM - 19.11.2010 13:16) Re: noch mal threads (von nitraM - 19.11.2010 13:26) Re: noch mal threads (von ChristianS - 19.11.2010 13:53) Re: noch mal threads (von nitraM - 19.11.2010 13:59) Re: noch mal threads (von ChristianS - 19.11.2010 14:11) Re: noch mal threads (von nitraM - 19.11.2010 14:08) Re: noch mal threads (von ChristianS - 19.11.2010 14:17) Re: noch mal threads (von Rainer - 13.01.2013 20:42) |