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 marcell - 16.03.2004 22:40)
Als Antwort auf Re: Timer und kein Ende! von ChristianS - 15.03.2004 21:30
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, eigenes Board, 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<


    Antwort schreiben


Antworten:

Re: Timer und kein Ende! (von ChristianS - 17.03.2004 20:33)