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

Re: Zeitmessung Kategorie: Programmierung (von André H. - 13.03.2004 12:51)
Als Antwort auf Zeitmessung von ChristianK - 12.03.2004 22:04
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
Hallo Christian,

Ich sehe zwar nicht, wo Du genau die Zeitwerte herbekommst, jedoch
solltest Du bei Zeitmessungen, bei denen die Genauigkeit besser als 1sek. sein
muÃ? immer den Systemtimer benutzen.
DaÃ? Dir das Auskommentieren der LCD-Ausgabe gut eine sek. bringt,
glaube ich Dir gern.
Denn Du schreibst wahrscheinlich nonstop auf das Display ohne groÃ?e Pause
zwischen den Ausgaben. (Wie groÃ? ist sleep messpause; ?)
Normal reicht es immer Displayausgaben nur 4 bis 5 mal pro Sekunde zu machen.
Dementsprechend könnte man dies Abfangen.
(z.B. alle x Schleifendurchgänge eine Ausgabe oder den timer benutzen.)

Aber hier eine vereinfachte Funktion zur Zeitmessung:

function zeitmess(long timeout/*in ms*/) returns long
{long timer,lcdtimer;
 lcdtimer=system.timer();
 timer=system.timer();
 // Start Zeitmesung
 loop
 {
  // Programmcode während der Messung
  //...

  if lcdtimer-system.timer()<=0
   {
    lcdtimer=system.timer()+200;
     // LCD-Ausgaben während der Messung alle 200ms
     // ...
   }

  if system.timer()-timer>=timeout or <Stopbedingung(en)>
   {
    timer=timer-system.timer();
    break; // Timeout, Schleife verlassen
   }
 }
 return timer; // Hier z.B. Zeitdauer in ms zurückgeben
}


MfG André H.


> Hallo zusammen,
>
> ich habe Probleme eine einigermassen genaue Zeitmessung hinzukriegen.
> auf 100msec genau würde reichen.
> Hier die Messfunktion:
>
>
> function strom_messen(string richtung) returns int
> {
> halt write_timedate;
> long summe;
> messungen = 1;
> summe = 0;
> messzeit = messpause;                  // Vorlauf von Vorprogramm
> strom_maxwert = 0;
> string_out(3,2,richtung);
> strom = ports.adc(div.messport) - div.strom_offset;
> if strom > (strom_grenzwert+ 150) return 999;// Abbruch, Kurzschluss ??
> rblcd.clear();
> strom_out(2, 10, strom_grenzwert);
> string_out(3, 2, richtung);
> loop
>  {
>   strom = ports.adc(div.messport) - div.strom_offset; // Strommessung
>   if strom > strom_maxwert
>      strom_maxwert = strom;
>    //  rblcd.delline(2);
>   //strom_out(2, 0, strom);                   // Stromwert anzeigen
>   //strom_out(2, 10, strom_grenzwert);
>   //rblcd.goto(4,0);
>   //rblcd.bargraph(strom/2, 100);
>   messungen = messungen + 1;
>   summe = summe + strom;
>   if math.abs(messzeit - time_wait) < 220  // ZwischenTest, schaltet Switch ?
>     {
>     if endschalter_status()==1      //
>       {
>       div.fehlercode = 1;           // Falsche Richtung ??
>       break;//
>       }
>     }
>   if messzeit - time_wait >320        // Messzeit > Wartezeit - 200 msec
>      and  endschalter_status()==1 break;//Break wenn Endschalter ein
>   sleep messpause;
>   messzeit = messzeit + messpause;
>  }
> messzeit = messzeit + 2*messpause;
> resume write_timedate;
> return summe/messungen;                 //Mittelwert zurückgeben
> }
>
> Ich habe schon verschiedenes ausprobiert, die auskommentierten Zeilen LCD-Anzeigen
> brachten eine gute Sekunde. Priorität des threads hochsetzen hat auch nicht viel gebracht.
> Eine externer thread mit Zeitmessung brachte auch nicht viel.
> Ich liege immer noch etwa 1 Sekunde unter dem tatsächlichen Wert.
> Hat jemand eine Idee wie ich das genauer hinkriegen kann ??
> Danke für jeden Tip.
>
> MfG
> ChristianK


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Zeitmessung (von ChristianK - 13.03.2004 21:49)