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

Re: Timer und kein Ende! Kategorie: Programmierung (von ChristianS - 17.03.2004 20:33)
Als Antwort auf Re: Timer und kein Ende! von marcell - 16.03.2004 22:40
Ich nutze:
C-Control II Station, OSOPT V3.0
> > > > Hallo,
> > > > irgenwie verstehe ich mein Programm nicht. Offensichtlich mache ich etwas falsch, aber was?
> > > > Ich glaube es liegt ein grundsätzlicher Denkfehler vor. Das Programm soll bei Betätigung eines
> > > > Schalters, H-L-Flanke, einen Timer anstoÃ?en, der eine bestimmte Zeit an Sekunden
> > > > wartet, bevor er eine Meldung ausgiebt. (Derzeit ,später soll ein Relais bei
> > > > steigenden Flanke eingeschaltet werden, und bei fallender Flanke zeitverzögert ausgeschlatet werden).
> > > > Soweit funktioniert das Prog auch so wie es soll, aber wenn ich die Zeilen
> > > > hwcom.print("...starte Timer");
> > > > hwcom.ret();
> > > > im Thread "nachlauf" auskommentiere, dann läuft der Timer nur genau ein mal ab! Dann tut sich
> > > > nix mehr! Erst habe ich geglaubt es liege an der Geschwindigkeit und habe stattdessen
> > > > einen sleep von 50, dann 100, 200 und schlie�lich 1000ms eingefügt, aber das hilft auch nicht.
> > > >
> > > > Hat irgendjemand eine Idee? Oder ist der ganze Ansatz irgendwie nix. Ich habe so die Vermutung,
> > > > es liegt an der Flankengeschichte, ev. funktioniert das nicht ganz richtig! ...aber event. sehe ich
> > > > auch den Wald vor lauter Bäumen nicht....
> > > >
> > > > Ich wäre dankbar für eine Antwort (oder einen neuen Ansatz).
> > > >
> > >
> > >
> > > hallo .. habe mich mal an deinem programm versucht,
> > >
> > > verusche es zu laden... wenn alles ok dann...  :-)
> > > ansonsten versuch es mit kleinen anpassungen an dein programm
> > >
> > > >> groÃ?er fehler = reset ohne halt  am ende vom thread <<
> > >
> > >
> > > hier das geänderte Prog. >>>>>>>>>>>>>>>>>>>>>>
> > >  
> > >  const schalter   = 10; // Eingang P2, PIN48
> > >  const wartezeit  = 5;  // in Sekunden
> > >  
> > >    int nachlauf_busy
> > >    int timerflag;
> > >
> > >  
> > >  thread nachlauf
> > >  {
> > >      nachlauf_busy = -1;
> > >      hwcom.print(" L->H Flanke " + 13 +10);   // wenn alles ok ,entfernen...
> > >      wait not ports.get(schalter);   // warte auf low-flanke
> > >      hwcom.print(" H->L Flanke " + 13 +10);   // wenn alles ok ,entfernen...
> > >      hwcom.print("...starte Timer" + 13 +10);  // wenn alles ok ,entfernen...
> > >      sleep ( wartezeit * 1000);
> > >      nachlauf_busy = 0;
> > >      timerflag = -1;   // timerflag sperren...
> > >      halt;    // reset ohne halt = ERROR...  // halt am ende benötigt kein reset...
> > >
> > >  } // end thread nachlauf
> > >  
> > >  
> > >  thread main
> > >  {
> > >    // hardware initialisieren...
> > >    hwcom.init();
> > >    stports.init();  // ???
> > >    lcdext.init();
> > >    lcdext.clear();
> > >    stports.LCDlight(0); //???
> > >    //run waithost;  //???
> > >
> > >    hwcom.print("starte Programm...." + 13 + 10);
> > >    timerflag = 0;
> > >  
> > >   loop
> > >  {
> > >      // warte auf high-flanke...
> > >      if ports.get(schalter) and not nachlauf_busy    // H-Flanke während run-thread sperren
> > >      {
> > >        // hier befehle zu relais einschalten...
> > >        run nachlauf;                                            // Thread starten
> > >      }
> > >
> > >      // warte auf timerflag...
> > >      if timerflag                                                 // Thread völlig abgearbeitet...und halt !!
> > >      {
> > >        hwcom.print("Timer abgelaufen" + 13 +10);
> > >        // hier weitere programm-befehle...
> > >        timerflag = 0;                                          // timerflag freigeben...
> > >      }
> > >
> > >   } // end loop main
> > >
> > >  } // end thread main
> > >  
> >
> > Hallo,
> > erstmal vielen Dank für Deine Antwort, aber das mit dem ERROR bei Reset verstehe ich nicht,
> > ich bin der Meinung, dass mit dem Befehl "reset" der "halt"-Befehl überflüssig wird, oder?
>
>
> hallo christian
>
> habe letztes mal deinen namen ganz vergessen .. sor..
>
> das mit dem RESET habe ich auch nach etlichen versuchen erst festgestellt.
> ich arbeite an einem grö�eren aufbau mit mehreren c.controll II einheiten die sowohl
> kommunizieren und auch mit unzähligen threads den programmablauf sicherstellen.
>
> hatte am anfang das gleiche problem wie du, einige thread sind nach RESET nicht sauber von
> stack gelöscht worden. mit HALT bleibt der stack erhalten und wird an gleicher stelle mit RUN
> fortgesetzt.
> hier wird irgend wo ein zeiger gesetzt der bei RESET ( ab und zu ) flöten geht.
>
> das problem konnte ich mit der kombination  > HALT; RESET; <  lösen.
>
> wenn aber das HALT der letzte befehl im thread ist, wird ein RESET überflüssig,
> da der thread ab hier sowieso von vorne beginnt.
>
> ich hoffe ich konne dir helfen.
> ach... noch eine frage, hast du den geänderten programm-code schon mal ausprobiert ??
> ( wenns damit läuft, ist es doch egal... :-)  )
>
> viel spass  >marcell<

Hallo marcell,
danke für Deine Mühe, habe aber im Moment keine Zeit das Programm auszuprobleren,
da ich geschäftlich unterwegs bin, werde mich aber am Wochenende ´dran setzen...

nochmals Danke,
ChristianS


    Antwort schreiben


Antworten: