
| Re: Zeitmessung Kategorie: Programmierung (von André H. - 13.03.2004 12:51) | ||
| Als Antwort auf Zeitmessung von ChristianK - 12.03.2004 22:04 | ||
| ||
|
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: | ||